在精确边缘检测后查找轮廓

时间:2013-10-23 09:29:41

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

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

原始图片是:

enter image description here

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

enter image description here

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

enter image description here

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

出了什么问题? cvFindContours()是否会修改输入图像?如何才能获得封闭的蓝框?

感谢。

1 个答案:

答案 0 :(得分:4)

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

而不是:

findContours(image, contours, mode, method);

使用:

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

* 编辑(回答评论):*

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

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