c++ - opencv:在矩形检测中使用轮廓和霍夫变换

标签 c++ opencv image-processing contour hough-transform

我正在尝试使用不同的方法检测灰度图像中的白色矩形:轮廓检测和霍夫变换。不幸的是,我正在处理的图像有一些限制,即

  1. 图像中有很多特征,矩形不是唯一的特征
  2. 矩形可以合并到其他特征(例如,其中一个矩形边缘可以与一条长直线重叠)
  3. 矩形可以包含一些其他特征(例如矩形内的字母、数字或一些 Logo )
  4. 有一些特征看起来像矩形(例如字符'D'看起来像一个矩形,右上角和右下角有小圆弧;另一个例子是梯形而不是平行四边形)
  5. 矩形可以顺时针和逆时针旋转0到15度
  6. 在不同的光照条件下(例如 1 像素间隙),这些线可能会分成几条线,因此过滤线的最小线长必须很小(例如,在霍夫变换中)
  7. 当最小线长设置为较小的值时,更容易看到同一行在不同方向的重复行(即需要合并多条线)

对于轮廓方法,一些图像的轮廓被破坏了。此外,图像可能包含矩形等特征(例如字符“D”)。我不确定这是否是一个好方法。

我看到很多文章/论坛建议使用 Hough 变换来检测矩形,如下面的帖子。不幸的是,我必须设置最小行长度的小值并且看到了重复的行。我不知道如何处理上面提到的点(例如,合并所有重复的线并为每条边只选择一条线,如何区分大部分是线但带有像“D”这样的小弧的特征,以及如何用一条边与一条长直线等合并来隔离正方形)。

Hough transformation vs Contour detection for Rectangle recognition with perspective projection

欢迎提出任何建议!

编辑:添加一些图片

Character D

字符 D

Rect edge merged with long straight line

带logo的矩形,边缘与长直线合并

enter image description here

梯形(顶部阴影形成底部梯形)

最佳答案

我建议您尝试使用 binary threshold (自适应或其他方式)在每个图像上,这将为您的轮廓检测提供一些清晰的线条。您也可以erode/dilate去除噪声的图像(例如第二张图像中的细线)

然后使用轮廓检测​​,对轮廓进行计数,找到图像中具有四个边的最大对象(这可能是您的对象)。

在使用二进制/侵 eclipse 之前制作图像的拷贝,以便一旦从轮廓检测中获得感兴趣的区域,就可以将拷贝图像裁剪到该区域。

抱歉,示例链接是用 Python 编写的,但我相信一旦您理解了这个想法,将它移植到 C++ 将很​​容易。

希望这对您有所帮助。

编辑

我自己尝试了上述方法,对每张图像进行阈值化、轮廓检测,然后在最大的一组轮廓周围绘制边界框。

结果如下:

enter image description here

最大轮廓集周围的边界框

enter image description here

相同,绘制在原始图像上

enter image description here

关于c++ - opencv:在矩形检测中使用轮廓和霍夫变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082431/

相关文章:

c++ - 如何使用 cout 以全精度打印 double 值?

c++ - 检查std::string是否包含小写字符?

c++ - 为什么要在运行时处理虚函数?

c++ - opencv如何获得轮廓的中线

android - 从 Camera2 图像中裁剪出一个矩形

c++ - 具有特定语言本地化的 SHBrowseForFolder

c++ - OpenCV 保存带有 imwrite 问题的大图像

android - Nexus 4手机上没有调用onPreviewFrame…而是在模拟器上

javascript - 如何更改图像的名称?

visual-c++ - 使用英特尔实感保存流