0

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

原图是:

在此处输入图像描述

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

在此处输入图像描述

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

在此处输入图像描述

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

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

谢谢。

4

1 回答 1

4

是的,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]);
于 2013-10-23T09:44:57.557 回答