opencv:在矩形检测中使用轮廓和Hough变换

che*_*chi 5 c++ opencv image-processing hough-transform opencv-contour

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

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

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

我看过许多文章/论坛建议使用Hough变换检测矩形,如下面的帖子.不幸的是,我必须设置最小行长度的小值,并看到重复的行.我不知道如何处理上面提到的几点(例如,组合所有重复的行并为每个边选择一行,如何区分大多数部分的特征是线但是像'D'那样的小弧,以及如何隔离正方形,其中一条边与一条长直线合并,等等.

用透视投影进行矩形识别的Hough变换与Contour检测

欢迎任何建议!

编辑:添加一些图片

角色D.

角色D.

矩形边缘与长直线合并

带徽标的矩形和边缘与长直线合并

在此输入图像描述

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

Aph*_*ire 1

我建议您尝试在每个图像上使用二进制阈值(自适应或其他),这将为轮廓检测提供一些清晰的线条。您还可以腐蚀/膨胀图像以消除噪声(例如第二个图像中的细线)

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

在使用二值/腐蚀之前制作图像的副本,以便一旦通过轮廓检测获得感兴趣的区域,就可以将副本图像裁剪到该区域。

抱歉,示例链接是用 python 编写的,但我确信一旦您明白了这个想法,将其移植到 C++ 将会很容易。

希望这可以帮助。

编辑

我自己尝试了上述方法,对每个图像进行阈值处理、轮廓检测,然后围绕最大的轮廓集绘制边界框。

下面看结果:

在此输入图像描述

最大轮廓集周围的边界框

在此输入图像描述

同样的,在原始图像上绘制

在此输入图像描述