我想从二元canny边缘图像中提取轮廓。
原始图片是:
应用cvCanny()和cvDilate()后,我得到以下图像:
我需要将封闭框(整个蓝框)检测为轮廓。我应用cvFindContours()并提取最大面积的轮廓。但是,当我应用cvFindContours()时,它会修改上面的canny图像,如下所示:
这不是我打算做的。然后它输出最大轮廓作为蓝色框内的邮箱标志。
出了什么问题? cvFindContours()是否会修改输入图像?如何才能获得封闭的蓝框?
感谢。
答案 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]);