2013-10-23 279 views
0

我想从二进制canny边缘图像中提取轮廓。canny边缘检测后查找轮廓

原始图像是:

enter image description here

应用cvCanny()和cvDilate()后,我获得下面的图片:

enter image description here

我需要封闭的盒子(在整个蓝色框)被检测为轮廓。我应用cvFindContours()并提取最大面积的轮廓。然而,当我申请cvFindContours(),它修改上述精明相关图片如下:

enter image description here

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

什么问题? cvFindContours()修改输入图像吗?应该做些什么才能得到封闭的蓝色框?

谢谢。

回答

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]); 
+0

谢谢。但是,我该如何去寻找最外层的蓝色方块。它不应该是最大的轮廓吗? –