我有这张图片:
我尝试做的是检测它的轮廓。因此,通过查看文档和网络上的一些代码,我做了这个:
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);
然后它检测到蓝色轮廓:
现在我想检测不同轮廓的两个矩形。所以结果是这样的:
(用油漆制成)所以现在我想分别检测两个矩形(蓝色和红色矩形将是两个不同的轮廓)。但我不知道该怎么做!
预先感谢您的帮助! ;)
最佳答案
问题来自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
关于c# - EmguCV C# : FindContours() to detect different shapes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62047450/