检测opencv上的非闭合轮廓

时间:2014-08-05 15:43:08

标签: opencv computer-vision

我正在做自动卡检测的计算机视觉项目。 我需要将卡片与背景分开。我已使用此

中的自动参数设置应用了canny边缘检测

Automatic calculation of low and high thresholds for the Canny operation in opencv

结果非常好。然而,有时候canny并不像这样完美 Photo after canny

我已经应用了cvFindContour来检测这个盒子。但是,由于上侧的“孔”,opencv无法检测到轮廓。

如何调整cvFindContour以检测轮廓或者我应该调整canny边缘?

1 个答案:

答案 0 :(得分:12)

有多种可能的解决方案。

最简单的可能是:

  • 如果FindContours没有找到闭合轮廓,请重复使用稍微减少low_threshold的精确过滤器,直到找到闭合轮廓。如果封闭的轮廓具有大致正确的尺寸和形状,则它是卡片。 answer linked by Haris解释了如何检查轮廓是否关闭

另一个相当简单的解决方案:

  • 根本不要将Canny应用于图像。在otsu thresholded图像上执行findContours。可选择在阈值图像上使用形态学打开和关闭以在findContours
  • 之前消除噪音

FindContours不需要边缘图像,通常使用阈值图像执行。我不知道你的源图像,所以我不能说它有多好用,但你肯定会避免形状上的洞的问题。

如果源图像不允许这样做,则以下内容可能有所帮助:

  • 使用watershed将卡片与背景分开。使用高阈值获取一些绝对前景的种子像素和低阈值以获取绝对背景的像素,然后使用cv:watershed()生长这两个种子。

如果该图像中的背景颜色与卡片的颜色相同,则前两种方法可能无法正常工作。在这种情况下,您最好的选择可能是Micka建议的解决方案:

  • 使用hough transform查找图片中最突出的4条线。用这4行形成一个矩形。