我正在做自动卡片检测的计算机视觉项目。 我需要将卡片与背景分开。我已经应用了精明的边缘检测,使用来自这个的自动参数设置
Automatic calculation of low and high thresholds for the Canny operation in opencv
结果非常好。然而,有时候精明的人并不像这样完美
我应用了 cvFindContour 来检测盒子。但是,由于上侧有“洞”,opencv未能检测到轮廓。
我如何调整 cvFindContour 来检测轮廓,或者我应该调整 canny 边缘?
最佳答案
有多种可能的解决方案。
最简单的可能是:
- 如果 FindContours 没有找到闭合轮廓,则重复使用略微降低的
low_threshold
的 canny 过滤器,直到找到闭合轮廓。如果闭合轮廓的大小和形状大致正确,则它是一张卡片。 answer linked by Haris解释如何检查轮廓是否闭合
另一个相当简单的解决方案:
- 根本不要对图像应用 Canny。在 otsu 阈值图像上执行 findContours。在 findContours 之前,可选择对阈值图像使用形态学打开和关闭以去除噪声
FindContours 不需要边缘图像,它通常使用阈值图像执行。我不知道你的源图像,所以我不能说这有多好,但你肯定会避免形状中的孔洞问题。
如果源图像不允许这样做,那么以下内容可能会有所帮助:
- 使用watershed将名片与背景分开。使用高阈值获取一些绝对是前景的种子像素,使用低阈值获取绝对是背景的像素,然后使用
cv:watershed()
种植这两个种子。
如果该图像中的背景与卡片的颜色相同,则前两种方法可能效果不佳。在这种情况下,您最好的选择可能是 Micka 建议的解决方案:
- 使用hough transform找到图像中最突出的 4 条线。用这 4 条线形成一个矩形。
关于opencv - 在opencv上检测非闭合轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25142987/