Esempio n. 1
0
        BorderType GetBorderType(HarrisBorderType type)
        {
            switch (type)
            {
            case HarrisBorderType.Constant:
                return(BorderType.Constant);

            case HarrisBorderType.Replicate:
                return(BorderType.Replicate);

            case HarrisBorderType.Reflect:
                return(BorderType.Reflect);

            case HarrisBorderType.Wrap:
                return(BorderType.Wrap);

            case HarrisBorderType.Reflect101:
                return(BorderType.Reflect101);

            case HarrisBorderType.Transparent:
                return(BorderType.Transparent);

            case HarrisBorderType.Isolated:
                return(BorderType.Isolated);

            default:
                return(BorderType.Default);
            }
        }
Esempio n. 2
0
        public AlgorithmResult DetectCornerHarris(
            string filename,
            byte threshold,
            int blockSize,
            int apertureSize,
            double k,
            HarrisBorderType borderType)
        {
            AlgorithmResult   result = new AlgorithmResult();
            Image <Bgr, byte> image  = ImageHelper.GetImage(filename);
            var resultImage          = new Image <Bgr, byte>(filename);

            // Create new (gray, float) image for corner
            var corners = new Image <Gray, float>(image.Size);

            // Harris corner with GrayScale
            CvInvoke.CornerHarris(
                image.Convert <Gray, byte>(),
                corners,
                blockSize,
                apertureSize,
                k,
                GetBorderType(borderType));

            // Normalize
            CvInvoke.Normalize(corners, corners);

            // Set resultImage after normalizing
            resultImage = corners.Convert <Bgr, byte>();

            // Crate new (gray, byte) image for corner
            var gray = corners.Convert <Gray, byte>();

            result.CircleDatas = new List <CirclePointModel>();

            // for each pixel annotate the corner
            // if inensity is beyond the threshold
            for (var j = 0; j < gray.Rows; j++)
            {
                for (var i = 0; i < gray.Cols; i++)
                {
                    if (!(gray[j, i].Intensity > threshold))
                    {
                        continue;
                    }

                    var circle = new CircleF(new PointF(i, j), 1);
                    resultImage.Draw(circle, new Bgr(Color.FromArgb(255, 77, 77)), 3);
                    result.CircleDatas.Add(new CirclePointModel()
                    {
                        CenterX = circle.Center.X,
                        CenterY = circle.Center.Y,
                        Radius  = circle.Radius,
                        Area    = circle.Area
                    });
                }
            }

            result.ImageArray = ImageHelper.SetImage(resultImage);

            return(result);
        }