opencv - 在opencv上检测非闭合轮廓

标签 opencv computer-vision

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

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

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

我应用了 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/

相关文章:

python - RBG 三元组值如何转换为单值?单个值介于 0 到 255 之间。如何将单个值映射到彩色图像?

c++ - 如何将使用Qt Paint Application绘制的图像传输到Mat openCV

machine-learning - 特征金字塔网络感受野

c++ - cv::Mat到QImage然后返回

python - 将 float 组保存到图像(使用 EXR 格式)

image - 如何在YUV 420半平面图像中应用单应性/ react 性?

computer-vision - 是否可以从给定的相机投影矩阵计算相机的内在和外在参数?

c++ - 将一系列图像写入缓冲存储器的最佳方法

c++ - OpenCV - 输入参数的大小不匹配 - addWeighted

opencv - 使图像的背景变白