Beispiel #1
0
        public static AddTextureInfo?GetAddTextureInfoForFrontAndBackImage(CreateMeshContract inputParams)
        {
            var logger = new Logger(inputParams.LogFilePath);

            logger.Log("Start get add texture info");

            var angles = inputParams.ClickInputs.Angles;

            if (angles == null || angles.Length < 2)
            {
                return(null);
            }

            var indexOfBackImage = GetIndexOfAngleClosestToBackOfModel(angles);

            if (indexOfBackImage == null || indexOfBackImage.Value <= 0)
            {
                return(null);
            }

            var indexCollection = new[] { 0, indexOfBackImage.Value };

            var addTextureInfo = GetAddTextureInfoForIndexCollection(inputParams, indexCollection);

            logger.Log("End get add texture info");

            return(addTextureInfo);
        }
        public static ModelMeshAndPositionNeighbors CreateMesh(CreateMeshContract inputParams)
        {
            var logger = new Logger(inputParams.LogFilePath);

            Stream moldDataStream;

            logger.Log("Start applying images");
            ApplyImages(inputParams, out moldDataStream);
            logger.Log("End applying images");

            return(CreateModelFromMold(inputParams.PtDensity, moldDataStream, logger));
        }
Beispiel #3
0
        public static AddTextureInfo GetAddTextureInfoForIndexCollection(CreateMeshContract inputParams, ICollection <int> indexCollection)
        {
            var logger = new Logger(inputParams.LogFilePath);

            logger.Log("Start GetAddTextureInfoForIndexCollection");

            var angles         = inputParams.ClickInputs.Angles;
            var addTextureInfo = new AddTextureInfo
            {
                ImageInfos = new AddTexImageInfo[indexCollection.Count]
            };

            var imageAlterationParams = new ImageAlterationParams
            {
                MoldPtDensity        = inputParams.PtDensity,
                MinImageHeightRatio  = inputParams.MinImageHeightRatio,
                PercentExtraWidth    = inputParams.PercentExtraWidth,
                ImageFolder          = inputParams.ImageFolder,
                InvalidColor         = inputParams.InvalidColor,
                ResizeType           = ResizeType.ResizeSufficiently,
                BottomPaddingPercent = inputParams.BottomPaddingPercent
            };

            var ctr = 0;

            foreach (var index in indexCollection)
            {
                var clickInput = inputParams.ClickInputs.ImageClickInputDetailsList[index];
                var angle      = angles[index];

                var imageParams = ImageProcessor.GetImageParams(inputParams.VariationIn3DCoordinates, inputParams.BackgroundStrippingParams, clickInput, angle, imageAlterationParams);

                addTextureInfo.ImageInfos[ctr] = new AddTexImageInfo {
                    CameraLocation = imageParams.cameraLocation, ImageBitmap = imageParams.Image, LookingAt = imageParams.lookingAt
                };
                if (ctr == 0)
                {
                    //set the camera ratio
                    addTextureInfo.CameraRatio = new TextureGenerator.CameraRatio {
                        XRangeAtInfinity = imageParams.CameraRatio.xRangeAtInfinity, YRangeAtInfinity = imageParams.CameraRatio.yRangeAtInfinity
                    };
                }

                //make sure the rest of the images are resized to the same size as the first one so that all texture images are of the same ht
                imageAlterationParams.ResizeType           = ResizeType.ToSpecifiedSizes;
                imageAlterationParams.SpecificResizeHeight = imageParams.Image.Height;
                imageAlterationParams.SpecificResizeWidth  = imageParams.Image.Width;

                ctr++;
            }
            logger.Log("End GetAddTextureInfoForIndexCollection");
            return(addTextureInfo);
        }
        public static void ApplyImages(CreateMeshContract inputParams, out Stream moldData)
        {
            var logger = new Logger(inputParams.LogFilePath);

            var angles = inputParams.ClickInputs.Angles;

            Stream moldDataPtr = null;

            for (var index = 0; index < angles.Length; index++)
            {
                ApplyImage(inputParams, index, ref moldDataPtr, logger);
            }
            moldData = moldDataPtr;
        }
Beispiel #5
0
        /// <summary>
        /// The width of the object can be more than the diameter of the base disc
        /// In such scenarios, we will need to keep some extra padding on each side of disc
        /// while cropping the image. This function calculates the amount by which we should pad.
        /// </summary>
        /// <param name="contract"></param>
        /// <returns></returns>
        public static double GetExtraPadding(CreateMeshContract contract)
        {
            var maxExtraPaddingPercent = 0.0;
            var bottomPaddingPercent   = contract.BottomPaddingPercent;

            //for each image
            foreach (var clickInput in contract.ClickInputs.ImageClickInputDetailsList)
            {
                var imageName = clickInput.ImageName;

                var bitmapImg = (Bitmap)Image.FromFile(string.Format(@"{0}\{1}", contract.ImageFolder, imageName));

                //resize to 100 (small size)
                const int newWidth  = 100;
                var       newHeight = newWidth * bitmapImg.Height / bitmapImg.Width;

                var imageAlterationParams = new ImageAlterationParams
                {
                    ResizeType           = ResizeType.ToSpecifiedSizes,
                    SpecificResizeHeight = newHeight,
                    SpecificResizeWidth  = newWidth
                };

                var resizedImage = ImageResizer.ResizeImage(bitmapImg, imageAlterationParams);

                //strip background
                BackgroundStripper.StripBackground(resizedImage, contract.BackgroundStrippingParams);

                //get actual borders for this image
                var origImageCorners   = ImageCorners.GetImageCornersFromClickInputs(clickInput, contract.MinImageHeightRatio, bottomPaddingPercent);
                var actualImageCorners = ImageCorners.GetActualImageCorners(origImageCorners, resizedImage, clickInput.ClickPositionListForImages);

                //calculate extra padding percent
                var padding = ExtraPadding.GetExtraPaddingPercent(resizedImage, actualImageCorners,
                                                                  contract.InvalidColor);

                //check if it is more than the maximum so far
                if (maxExtraPaddingPercent < padding)
                {
                    maxExtraPaddingPercent = padding;
                }
            }
            return(maxExtraPaddingPercent);
        }
 public static void ApplyImage(CreateMeshContract inputParams, int index, ref Stream moldDataPtr, Logger logger)
 {
     MainProcessor.ApplyImage(inputParams, index, ref moldDataPtr, logger);
 }
Beispiel #7
0
        public static void ApplyImage(CreateMeshContract inputParams, int index, ref Stream moldDataPtr, Logger logger)
        {
            var clickInput = inputParams.ClickInputs.ImageClickInputDetailsList[index];
            var angle      = inputParams.ClickInputs.Angles[index];

            var imageAlterationParameters = new ImageAlterationParams
            {
                MoldPtDensity        = inputParams.PtDensity,
                MinImageHeightRatio  = inputParams.MinImageHeightRatio,
                PercentExtraWidth    = inputParams.PercentExtraWidth,
                ImageFolder          = inputParams.ImageFolder,
                InvalidColor         = inputParams.InvalidColor,
                ResizeType           = ResizeType.ComputeSizeBasedOnPtDensity,
                BottomPaddingPercent = inputParams.BottomPaddingPercent
            };
            var imageParams = ImageProcessor.GetImageParams(inputParams.VariationIn3DCoordinates, inputParams.BackgroundStrippingParams, clickInput, angle, imageAlterationParameters);

            if (moldDataPtr == null)
            {
                moldDataPtr = CreateMoldDataStream(imageParams.Image.Width, imageParams.Image.Height, (float)inputParams.VariationIn3DCoordinates, inputParams.PtDensity, logger);
            }

            var processMoldParams = new ProcessMoldParams
            {
                MoldData    = moldDataPtr,
                ImageParams = imageParams
            };
            var imagesToObject = new ImagesToObject(processMoldParams, inputParams.LogFilePath);

            imagesToObject.ProcessImage();

            #region track_changes_for_troubleshooting

            if (inputParams.SaveProcessedImages)
            {
                SaveProcessedImages(processMoldParams.ImageParams.Image, inputParams.ImageFolder, "ibmodeler3_modified_images", index, angle, logger);
            }

            var imageParamsToBeReused = false;
            if (AnalyzeMoldForDataLosses)
            {
                //if first time, just set values for subsequent use
                if (index == 0)
                {
                    FirstImageParams      = imageParams;
                    imageParamsToBeReused = true;
                }
                else
                {
                    var processMoldParamsForAnalysis = new ProcessMoldParams
                    {
                        MoldData    = moldDataPtr,
                        ImageParams = FirstImageParams,
                        SetColorForRetainedPixels = false
                    };
                    int pixelsWithAllPointsLost = MoldFileAnalyzerForImg.ProcessImage(processMoldParamsForAnalysis);
                    if (pixelsWithAllPointsLost > 0)
                    {
                        SaveDataLossImages(FirstImageParams.Image, inputParams.ImageFolder, "ibmodeler3_data_loss_analysis", index, angle, pixelsWithAllPointsLost, logger);
                    }
                }
            }

            #endregion

            //this will dispose off the image data from memory
            if (!imageParamsToBeReused)
            {
                imageParams.Dispose();
            }

            logger.Log(string.Format("Image applied for camera at an angle of {0} degrees", Math.Round(angle * 180 / Math.PI, 2)));
        }