【问题标题】:Finding contours after canny edge detection在精明边缘检测后寻找轮廓
【发布时间】:2013-10-23 09:29:41
【问题描述】:

我想从二值 canny 边缘图像中提取轮廓。

原图为:

应用 cvCanny() 和 cvDilate() 后,我得到以下图像:

我需要将封闭框(整个蓝色框)检测为轮廓。我应用 cvFindContours() 并提取面积最大的轮廓。但是,当我应用 cvFindContours() 时,它会将上面的 canny 图像修改如下:

这不是我打算做的。然后输出最大的轮廓作为蓝色框内的邮箱标志。

出了什么问题? cvFindContours() 是否修改输入图像?应该怎么做才能得到封闭的蓝色框?

谢谢。

【问题讨论】:

    标签: c++ opencv computer-vision edge-detection


    【解决方案1】:

    是的,findContours 确实改变了图像。如果您仍然需要原始图像,请在图像副本上使用 findContours。

    代替:

    findContours(image, contours, mode, method);
    

    用途:

    findContours(image.clone(), contours, mode, method);
    

    *编辑(回复评论):*

    这取决于您对“最大”的定义。如果您使用 area 这可能会出现问题,因为在边缘图上调用 findContours 可能会导致非常长但非常细的轮廓。 “最大”的更好定义是边界矩形面积最大的轮廓。您可以使用名为 boundingRect 的函数来找到它。如果要查找所有多边形的边界框,请在所有边界框之间使用 OR 运算符:

    Rect bbox = boundingRect(contours[0]);
    for(i=1; i<contours.size(); i++)
        bbox = bbox | boundingRect(contours[i]);
    

    【讨论】:

    • 谢谢。但是,我该如何找到最外面的蓝色盒子。不应该是最大的轮廓吗?
    • 未来的小更新。 “从 OpenCV 3.2 开始,findContours() 不再修改源图像,而是返回修改后的图像作为三个返回参数中的第一个。”并且从 4.0.0 开始,它不再返回修改后的图像。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2013-12-29
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 2016-01-11
    • 2012-09-17
    相关资源
    最近更新 更多