我有这张图片:
我试图做的是检测它的轮廓。因此,通过查看文档和网络上的一些代码,我做到了:
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);
然后它以蓝色检测到该轮廓:
现在,我想检测两个轮廓不同的矩形。结果就是这样:
(用油漆制成)现在,我想分别检测两个矩形(蓝色和红色矩形将是两个不同的轮廓)。但是我不知道该怎么做!
在此先感谢您的帮助! ;)
答案 0 :(得分:1)
问题来自ThresholdBinary
的过程。正如我所了解的那样,此方法将返回一个二进制图像,从而将高于或等于threshold
参数的所有像素上拉到maxValue
参数,并将所有下面的像素下拉到0因此,生成的图像将仅由两个值(二进制)0
或maxValue
组成。如果我们按照您的示例提供一些假定灰度值:
在Image<Gray, byte> image = receivedImage.Convert<Gray, byte>().ThresholdBinary(new Gray(80), new Gray(255));
之后,您将产生:
实际上,这是您要传递到CvInvoke.FindContours()
并随后仅找到最外轮廓的图像。
如果确实要继续使用FindContours
,则需要一种算法,该算法将“合并”或“带通”图像,以首先产生以下分段,每个分段将转换为二进制,并且轮廓独立检测。
我认为您当前的例子可能是问题的解决,而且过于简化,无法为您提供解决方案。但是,请使用真实的数据再问一个问题,我很乐意提供一些建议。
或者着眼于更复杂的边缘检测方法,例如Canny或Sobel。该视频可能是一个很好的起点:Edge Detection