【问题标题】:EmguCV C# : FindContours() to detect different shapesEmguCV C#:FindContours() 来检测不同的形状
【发布时间】:2020-05-27 15:56:41
【问题描述】:

我有这张图片:

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

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);

然后它用蓝色检测这个轮廓:

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

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

提前感谢您的帮助! ;)

【问题讨论】:

    标签: c# emgucv detection contour


    【解决方案1】:

    问题来自ThresholdBinary的进程。正如我假设您理解的那样,此方法将返回一个二进制图像,其中所有高于或等于 threshold 参数的像素将被拉高到 maxValue 参数,并且所有低于或等于 0 的像素。生成的图像因此将只包含两个值(二进制),0maxValue。如果我们按照您的示例使用一些假定灰度值:

    Image&lt;Gray, byte&gt; image = receivedImage.Convert&lt;Gray, byte&gt;().ThresholdBinary(new Gray(80), new Gray(255));之后,你会产生:

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

    如果您确实想继续使用FindContours,您需要的是一种算法,该算法将“bin”或“带通”您的图像首先生成以下片段,每个片段都将转换为二进制,并检测到轮廓独立。

    我觉得您当前的示例可能是对问题的过度简化,以便为您提供如何在此处实现该目标的解决方案。不过,请用更真实的数据提出另一个问题,我很乐意提供一些建议。

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

    【讨论】:

    • 我不确定这是否是您的支持@Johnny,但这是否回答了您的问题?
    • 嗨!非常感谢,您对外部/列表模式的第一个回答让我思考并查看了我发现您解释的错误的阈值以及我使用阈值和替代方法的解决方案。现在由于您的解释以及我的解决方案的实际工作原理,我对它的理解好多了 ^^ 真的非常感谢,你摇滚!
    • @Johnny,哈,不客气,这是一个很好的问题,我喜欢 EmguCV!我密切关注标签,所以如果你问另一个我很可能会看到它。请将答案标记为“已回答”:)
    猜你喜欢
    • 2018-03-19
    • 2020-11-02
    • 2021-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2013-06-06
    • 1970-01-01
    相关资源
    最近更新 更多