Ejemplo n.º 1
0
        internal void IndividualImgProcessed(object sender, IndividualImgProcessedEventArgs args)
        {
            if (_processingImgIndex == ImageClickInputDetails.Count)
            {
                var clickInputDetails = new ImageClickInputDetails
                {
                    ClickPositionListForImages = args.ClickPositions,
                    ImageName     = args.ImageName,
                    RotateImageBy = args.RotateImageBy
                };
                ImageClickInputDetails.Add(clickInputDetails);
            }
            else if (_processingImgIndex < ImageClickInputDetails.Count)
            {
                ImageClickInputDetails[_processingImgIndex].ClickPositionListForImages = args.ClickPositions;
                ImageClickInputDetails[_processingImgIndex].ImageName     = args.ImageName;
                ImageClickInputDetails[_processingImgIndex].RotateImageBy = args.RotateImageBy;
            }
            else
            {
                throw new Exception("Error in processing next image logic.");
            }

            if (_processingImgIndex < FilePaths.Length - 1)
            {
                ProcessNextImage();
            }
            else
            {
                CalculateAnglesAndReturn();
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Gets the angle by which the image should be rotated (using function RotateImg)
        /// to make the disc edge horizontal
        /// </summary>
        /// <param name="clickInput"></param>
        /// <returns></returns>
        public static float GetRotationAngleToRealign(IList <ClickPositionOnImage> clickInput)
        {
            var leftOfDisc = ImageClickInputDetails.GetSpecificClickInput(clickInput, ClickPositionOnImageTypes.LeftEndOfRotatingDisc);

            var rightOfDisc = ImageClickInputDetails.GetSpecificClickInput(clickInput, ClickPositionOnImageTypes.RightEndOfRotatingDisc);

            return(GetRotationAngleToRealign(leftOfDisc, rightOfDisc));
        }
Ejemplo n.º 3
0
        private static ImageCorners GetImgCornersWithExtraPadding(ImageClickInputDetails clickInputs, Bitmap image, ImageAlterationParams imageAlterationParams)
        {
            //image corners with respect to the dimensions of click area
            var clickImgCorners = ImageCorners.GetImageCornersFromClickInputs(clickInputs, imageAlterationParams.MinImageHeightRatio, imageAlterationParams.BottomPaddingPercent);

            //image corners in actual image dimension
            var actualImgCorners = ImageCorners.GetActualImageCorners(clickImgCorners, image, clickInputs.ClickPositionListForImages);

            //image corners with extra padding on on each side of disc
            return(GetModifiedImgCornersForExtraWidth(actualImgCorners, imageAlterationParams.PercentExtraWidth));
        }
Ejemplo n.º 4
0
        public static ImageCorners GetImageCornersFromClickInputs(ImageClickInputDetails clickInputDetails, double imageHeightRatio, double bottomPaddingPercent)
        {
            var clickPositions = clickInputDetails.ClickPositionListForImages;
            var left           = ImageClickInputDetails.GetXClickPosition(clickPositions, ClickPositionOnImageTypes.LeftEndOfRotatingDisc);
            var right          = ImageClickInputDetails.GetXClickPosition(clickPositions, ClickPositionOnImageTypes.RightEndOfRotatingDisc);
            var bottom         = ImageClickInputDetails.GetBottomMarkerPos(clickPositions, bottomPaddingPercent);

            var requiredImageHeight = imageHeightRatio * clickPositions[0].AllowedHeight;
            var top = bottom - requiredImageHeight + 1; //zero based index

            if (top < 0 || top >= clickPositions[0].AllowedHeight)
            {
                throw new Exception("Calculations gave invalid value for top of the image.");
            }

            return(new ImageCorners {
                Left = left, Right = right, Bottom = bottom, Top = top
            });
        }
Ejemplo n.º 5
0
        public static bool IsInAllowedRange(Point position, double allowedWidth, double allowedHeight, ClickPositionOnImageTypes positionType, List <ClickPositionOnImage> currentClickSequences)
        {
            switch (positionType)
            {
            case ClickPositionOnImageTypes.None:
                break;

            case ClickPositionOnImageTypes.LeftEndOfRotatingDisc:
                break;

            case ClickPositionOnImageTypes.RightEndOfRotatingDisc:
            {
                var leftEnd = GetLeftEndOfRotatingDisc(currentClickSequences);
                return(leftEnd < position.X);
            }

            case ClickPositionOnImageTypes.BottomMostPartOfModel:
            {
                var leftEndPos = ImageClickInputDetails.GetSpecificClickInput(currentClickSequences, ClickPositionOnImageTypes.LeftEndOfRotatingDisc);
                return(position.Y <= leftEndPos.ClickYPos);
            }
            break;

            case ClickPositionOnImageTypes.MarkerLeftFromCenter:
            {
                var leftEnd    = GetLeftEndOfRotatingDisc(currentClickSequences);
                var centerLine = GetCenterLine(currentClickSequences);
                return(leftEnd <= position.X && position.X <= centerLine);
            }

            case ClickPositionOnImageTypes.MarkerRightFromCenter:
            {
                var rightEnd   = GetRightEndOfRotatingDisc(currentClickSequences);
                var centerLine = GetCenterLine(currentClickSequences);
                return(centerLine <= position.X && position.X <= rightEnd);
            }

            default:
                throw new ArgumentOutOfRangeException("positionType");
            }
            return(true);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Gets the angle by which the image should be rotated (using function RotateImg)
        /// to make the disc edge horizontal
        /// </summary>
        /// <param name="clickInput"></param>
        /// <returns></returns>
        public static float GetRotationAngleToRealign(IList <ClickPositionOnImage> clickInput)
        {
            var leftOfDisc = ImageClickInputDetails.GetSpecificClickInput(clickInput, ClickPositionOnImageTypes.LeftEndOfRotatingDisc);

            var rightOfDisc = ImageClickInputDetails.GetSpecificClickInput(clickInput, ClickPositionOnImageTypes.RightEndOfRotatingDisc);

            var xDiff = Math.Abs(rightOfDisc.ClickXPos - leftOfDisc.ClickXPos);

            var yDiff = Math.Abs(rightOfDisc.ClickYPos - leftOfDisc.ClickYPos);

            if (xDiff == 0 || yDiff == 0)
            {
                return(0);
            }

            var degrees = GetAngleInDegrees(xDiff, yDiff);

            //positive direction is clockwise from top left
            return(rightOfDisc.ClickYPos < leftOfDisc.ClickYPos ? degrees : -degrees);
        }
Ejemplo n.º 7
0
        public static Bitmap GetCroppedImage(ImageClickInputDetails clickInputDetails, Bitmap image, ImageAlterationParams imageAlterationParams)
        {
            var imgCornersExtra = GetImgCornersWithExtraPadding(clickInputDetails, image, imageAlterationParams);

            if (imgCornersExtra.Left >= 0 && imgCornersExtra.Right < image.Width)
            {
                //crop image from all side
                var rectangle = new Rectangle((int)imgCornersExtra.Left, (int)imgCornersExtra.Top, (int)imgCornersExtra.Width, (int)imgCornersExtra.Height);
                return(image.Clone(rectangle, image.PixelFormat));
            }
            else
            {
                //prepare a new image
                var newImg = new Bitmap(Convert.ToInt32(imgCornersExtra.Width), Convert.ToInt32(imgCornersExtra.Height), image.PixelFormat);
                var g      = Graphics.FromImage(newImg);
                g.Clear(imageAlterationParams.InvalidColor);
                g.InterpolationMode = InterpolationMode.HighQualityBilinear;

                //when overlaying the image, give the top coordinate in the negative direction so that it gets cropped to the top pixel
                var topOfImageForOverlay = -imgCornersExtra.Top;

                if (imgCornersExtra.Left > 0)
                {
                    //needs trimming from the left
                    var rectangle = new Rectangle((int)imgCornersExtra.Left, 0, (int)(image.Width - imgCornersExtra.Left - 1), image.Height);
                    image = image.Clone(rectangle, image.PixelFormat);
                    g.DrawImage(image, 0, (int)topOfImageForOverlay, image.Width, image.Height);
                }
                else
                {
                    var moveForwardBy = -imgCornersExtra.Left;
                    g.DrawImage(image, (int)moveForwardBy, (int)topOfImageForOverlay, image.Width, image.Height);
                }

                g.Dispose();
                return(newImg);
            }
        }
Ejemplo n.º 8
0
        private static Bitmap GetRotatedCroppedResizedAndStrippedImage(BackgroundStrippingParams strippingParams, ImageClickInputDetails clickInput, ImageAlterationParams imageAlterationParams)
        {
            //pickup image from the source location
            var image = (Bitmap)Image.FromFile(String.Format(@"{0}\{1}", imageAlterationParams.ImageFolder, clickInput.ImageName));

            //rotate
            image = MainProcessor.RotateImg(image, (float)clickInput.RotateImageBy, imageAlterationParams.InvalidColor);

            //crop
            image = ImageCropper.GetCroppedImage(clickInput, image, imageAlterationParams);

            //resize
            image = ImageResizer.ResizeImage(image, imageAlterationParams);

            //strip background
            BackgroundStripper.StripBackground(image, strippingParams);

            return(image);
        }
Ejemplo n.º 9
0
        public static ImageParams GetImageParams(double variationIn3DCoordinates, BackgroundStrippingParams strippingParams, ImageClickInputDetails clickInput, double angle, ImageAlterationParams imageAlterationParams)
        {
            var imageData = GetRotatedCroppedResizedAndStrippedImage(strippingParams, clickInput, imageAlterationParams);

            //get camera ratio
            var cameraRatio = GetCamRatio(imageData, variationIn3DCoordinates);

            var cameraLocationPt = GetCamPos(variationIn3DCoordinates * 4.0, angle, 0.0);
            var lookingAtPt      = GetCamDir(angle, 0.0, 0.0);

            return(new ImageParams
            {
                InvalidColor = imageAlterationParams.InvalidColor,
                Image = imageData,
                CameraAtInfinity = true,
                cameraLocation = cameraLocationPt,
                lookingAt = lookingAtPt,
                CameraRatio = cameraRatio
            });
        }