EmguCV C#:FindContours()以检测不同的形状

时间:2020-05-27 15:56:41

标签: c# emgucv detection contour

我有这张图片:

enter image description here

我试图做的是检测它的轮廓。因此,通过查看文档和网络上的一些代码,我做到了:

Image<Gray, byte> image = receivedImage.Convert<Gray, byte>().ThresholdBinary(new Gray(80), new Gray(255));
        Emgu.CV.Util.VectorOfVectorOfPoint contours = new Emgu.CV.Util.VectorOfVectorOfPoint();
        Mat hier = new Mat();

        CvInvoke.FindContours(image, contours, hier, Emgu.CV.CvEnum.RetrType.External, Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);

        CvInvoke.DrawContours(receivedImage, contours, 0, new MCvScalar(255, 0, 0), 2);

然后它以蓝色检测到该轮廓:

enter image description here

现在,我想检测两个轮廓不同的矩形。结果就是这样:

enter image description here

(用油漆制成)现在,我想分别检测两个矩形(蓝色和红色矩形将是两个不同的轮廓)。但是我不知道该怎么做!

在此先感谢您的帮助! ;)

1 个答案:

答案 0 :(得分:1)

问题来自ThresholdBinary的过程。正如我所了解的那样,此方法将返回一个二进制图像,从而将高于或等于threshold参数的所有像素上拉到maxValue参数,并将所有下面的像素下拉到0因此,生成的图像将仅由两个值(二进制)0maxValue组成。如果我们按照您的示例提供一些假定灰度值:

Input Image

Image<Gray, byte> image = receivedImage.Convert<Gray, byte>().ThresholdBinary(new Gray(80), new Gray(255));之后,您将产生:

Binary Image

实际上,这是您要传递到CvInvoke.FindContours()并随后仅找到最外轮廓的图像。

如果确实要继续使用FindContours,则需要一种算法,该算法将“合并”或“带通”图像,以首先产生以下分段,每个分段将转换为二进制,并且轮廓独立检测。

Segment 1 Segment 2

我认为您当前的例子可能是问题的解决,而且过于简化,无法为您提供解决方案。但是,请使用真实的数据再问一个问题,我很乐意提供一些建议。

或者着眼于更复杂的边缘检测方法,例如Canny或Sobel。该视频可能是一个很好的起点:Edge Detection