检测opencv上的非闭合轮廓

Ill*_*lSc 5 opencv computer-vision

我正在做自动卡检测的计算机视觉项目.我需要将卡片与背景分开.我已经使用了自动参数设置应用了canny边缘检测

在opencv中自动计算Canny操作的低和高阈值

结果非常好.然而,有时候canny并不像这样完美 精明的照片

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

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

Hug*_*une 12

有多种可能的解决方案.

最简单的可能是:

  • 如果FindContours没有找到闭合的轮廓,请重复略微减小的精确过滤器low_threshold,直到找到闭合的轮廓.如果封闭的轮廓具有大致正确的尺寸和形状,则它是卡片.Haris联系答案解释了如何检查轮廓是否关闭

另一个相当简单的解

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

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

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

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

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

  • 使用霍夫变换找到图像中最突出的4条线.用这4行形成一个矩形.