c# - EmguCV C# : FindContours() to detect different shapes

标签 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

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

预先感谢您的帮助! ;)

最佳答案

问题来自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

关于c# - EmguCV C# : FindContours() to detect different shapes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62047450/

相关文章:

python - 使用 Python OpenCV 从网络摄像头视频中检测白纸上的黑色矩形

c# - 为什么我在使用个人访问 token 时收到授权错误?

c# - HashSet 的内存限制是多少?

button - Godot:检测按下的鼠标是否在按钮上方

c# - 带有 C# WPF 的 EMGU

c# - Emgucv Convert<Hsv, Byte>() 图片

java - SoX - java 的声音交换

c# - 如何使用 LINQ 从一组数字中查找 n 项的所有组合?

c# - 帮助优化这个linq语句

c# - 尝试保存图像时未处理访问冲突异常