【问题标题】:Detect non-closed contour on opencv在opencv上检测非闭合轮廓
【发布时间】:2014-09-28 08:40:42
【问题描述】:

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

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

结果非常好。然而,有时精明的人并不像这样完美

我已应用 cvFindContour 来检测框。但是由于上边有“洞”,opencv没能检测到轮廓。

如何调整 cvFindContour 以检测轮廓,还是应该调整 canny 边缘?

【问题讨论】:

  • 您是否尝试过“线检测”(如 HoughLinesP 或 RANSAC)来提取 4 条主线?
  • 查看答案here 可能会有帮助。
  • 我尝试使用 Hough,但卡内的字母对 Hough 来说变得很杂乱。
  • 因为无论如何你都会得到一个非常干净的轮廓,例如在上面的二进制图像输出中,为什么不对输出进行霍夫变换呢?然后你就拥有了 hough 全局方法的稳健性,它使用 findcontours 作为过滤掉卡片上导致问题的文本的方法。
  • 其实卡片里面有图文边缘(这是身份证)。但出于隐私目的,我对其进行了审查

标签: opencv computer-vision


【解决方案1】:

有多种可能的解决方案。

最简单的可能是:

  • 如果 FindContours 没有找到闭合轮廓,则使用略微减小的 low_threshold 重复 canny 过滤器,直到找到闭合轮廓。如果闭合轮廓具有大致正确的大小和形状,则它是一张卡片。 answer linked by Haris 解释了如何检查轮廓是否闭合

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

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-07-27
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2016-10-24
    • 2014-12-12
    相关资源
    最近更新 更多