检测OpenCV上的非闭合轮廓

7
我正在进行自动卡牌检测的计算机视觉项目。我需要将卡牌与背景分离。我已经应用了Canny边缘检测,并使用了这个在OpenCV中自动计算Canny操作的低和高阈值的参数设置。
结果非常好。然而,有时Canny并不完美,就像这张图片一样: Photo after canny 我已经应用了cvFindContour来检测方框。然而,由于上侧的“孔洞”,OpenCV未能检测到轮廓。
我该如何调整cvFindContour以检测轮廓,或者应该调整Canny边缘呢?

1
你尝试过使用“线检测”(例如HoughLinesP或RANSAC)来提取四条主要线条吗? - Micka
这里的答案可能会有所帮助。请点击此处查看:https://dev59.com/CGEh5IYBdhLWcg3wlEZq#22242203 - Haris
我尝试使用霍夫变换,但是卡片内部的字母对于霍夫变换来说成为了噪声。 - IllSc
既然您已经得到了一个相当干净的轮廓,例如在上面的二进制图像输出中,为什么不直接在该输出上运行霍夫变换呢?然后您就可以利用霍夫全局方法的鲁棒性,使用findcontours作为过滤卡片上引起问题的文本的方法。 - jcollomosse
实际上,这是一张身份证,卡片内部有图片和文字的边缘。但出于隐私保护的目的,我进行了审查。 - IllSc
1个回答

13

有多种可能的解决方案。

最简单的一个可能是:

  • 如果FindContours没有找到闭合轮廓,则使用略微降低的low_threshold重复应用Canny滤波器,直到找到闭合轮廓。如果闭合轮廓大致具有正确的大小和形状,则它就是一张卡片。Haris链接的答案解释了如何检查轮廓是否闭合。

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

  • 根本不对图像应用Canny。在otsu阈值化的图像上执行findContours。可选地,在找到轮廓之前对阈值图像进行形态学开运算和闭运算以去除噪点。

FindContours不需要边缘图像,通常会使用阈值图像执行。我不知道您的源图像是什么样的,所以无法确定这种方法的效果如何,但您肯定可以避免形状中的孔的问题。

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

  • 使用watershed将卡片与背景分离。使用高阈值获取一些明显是前景的种子像素和低阈值获取明显为背景的像素,然后使用cv:watershed()扩展这两个种子。

如果该图像中的背景与卡片颜色相同,则前两种方法可能效果不佳。在这种情况下,您最好采用Micka提出的解决方案:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接