EMGUCV findContours如何获得积分?

时间:2015-11-15 03:10:07

标签: c# image-processing emgucv edge-detection

使用findContours方法,我最终能够概述人物形象。

我的样本图片来自创建者AForge.Net的网站。使用absdiff和findContours我可以使用CvInvoke.cvDrawContours将轮廓实际绘制到屏幕上。

然而,我想要的是访问用于绘制轮廓的点。

参考下图,我想得到构成蓝色轮廓的那些点。必须有一些方法来达到那些没有?

这是相关代码:

    Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
    Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);

    Image<Bgr, byte> whiteconverter = new Image<Bgr, byte>(blankImage);

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

    grayImage._Not();

    using (MemStorage storage = new MemStorage())
    {
        //add points to listbox
        using (var p2 = new Pen(Color.Yellow, 2))
        {
            var grp = Graphics.FromImage(pictureBox3.Image);

            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);
                CvInvoke.cvDrawContours(whiteconverter, contours, new MCvScalar(255), new MCvScalar(255), -1, 2, Emgu.CV.CvEnum.LINE_TYPE.EIGHT_CONNECTED, new Point(0, 0));

                pictureBox3.Image = whiteconverter.Bitmap;
            }
        }
    }

enter image description here

1 个答案:

答案 0 :(得分:1)

轮廓是矢量矢量

在EMGU中你只需要一个循环:

以下代码将找到轮廓,然后抓住各个点。

注意:请勿使用&#39; CV_CHAIN_APPROX_SIMPLE&#39; ...您将无法获得所有积分。如果您正在使用CvInvoke.cvDrawContours()调用,这将非常有用。

请务必使用&#39; CV_CHAIN_APPROX_NONE&#39; ...至少是我的经验告诉我的。

    Image<Gray, byte> grayImage = new Image<Gray, byte>(colorImage);
    Image<Bgr, byte> color = new Image<Bgr, byte>(colorImage);

    Image<Bgr, byte> whiteconverter = new Image<Bgr, byte>(blankImage);

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

    grayImage._Not();

    using (MemStorage storage = new MemStorage())
    {
        using (var p2 = new Pen(Color.Yellow, 2))
        {
            var grp = Graphics.FromImage(blankImage);

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

                foreach (var ctr in contours)
                {
                    grp.DrawEllipse(p2, ctr.X, ctr.Y, 4, 4);
                }

                pictureBox3.Image = blankImage;
            }
        }
    }