在emgucv中寻找轮廓点

tam*_*son 5 c# emgucv

我正在与emguCV一起寻找轮廓的基本点,然后将此点保存在文件中,并在将来用户重绘此形状。因此,我的目标是该图像:


例

我的解决方案是:1.将图像导入图片框2.使用canny算法进行边缘检测3.查找轮廓并保存点

我发现下面的代码很多点,但我不能用此点绘制第一个形状!

using Emgu.CV;
using Emgu.Util;

private void button1_Click(object sender, EventArgs e)

{
            Bitmap bmp = new Bitmap(pictureBox1.Image);
            Image<Bgr, Byte> img = new Image<Bgr, byte>(bmp);

            Image<Gray, Byte> gray = img.Convert<Gray, Byte>().PyrDown().PyrUp();

            Gray cannyThreshold = new Gray(80);
            Gray cannyThresholdLinking = new Gray(120);
            Gray circleAccumulatorThreshold = new Gray(120);

            Image<Gray, Byte> cannyEdges = gray.Canny(cannyThreshold, cannyThresholdLinking).Not();

            Bitmap color;
            Bitmap bgray;
            IdentifyContours(cannyEdges.Bitmap, 50, true, out bgray, out color);

            pictureBox1.Image = color;
        }

        public void IdentifyContours(Bitmap colorImage, int thresholdValue, bool invert, out Bitmap processedGray, out Bitmap processedColor)
        {
            Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
            Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);

            grayImage = grayImage.ThresholdBinary(new Gray(thresholdValue), new Gray(255));

            if (invert)
            {
                grayImage._Not();
            }

            using (MemStorage storage = new MemStorage())
            {

                for (Contour<Point> contours = grayImage.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_LIST, storage); contours != null; contours = contours.HNext)
                {

                    Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.015, storage);
                    if (currentContour.BoundingRectangle.Width > 20)
                    {
                        CvInvoke.cvDrawContours(color, contours, new MCvScalar(255), new MCvScalar(255), -1, 1, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));
                        color.Draw(currentContour.BoundingRectangle, new Bgr(0, 255, 0), 1);
                    }

                    Point[] pts = currentContour.ToArray();
                    foreach (Point p in pts)
                    {
                        //add points to listbox
                        listBox1.Items.Add(p);
                    }
                }
            }

            processedColor = color.ToBitmap();
            processedGray = grayImage.ToBitmap();

        }
Run Code Online (Sandbox Code Playgroud)

Bal*_*i R 1

在您的代码中,您添加了轮廓近似操作

Contour<Point> currentContour = contours.ApproxPoly(contours.Perimeter * 0.015, storage);
Run Code Online (Sandbox Code Playgroud)

此轮廓近似会将您的轮廓近似最近的多边形,因此您的实际点会发生移动。如果您想重现相同的图像,则无需进行任何近似。

请参考此线程。