首页 文章

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

提问于
浏览
5

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

  • 图像中有许多功能,矩形不是唯一的功能

  • 矩形可以合并到其他要素(例如,其中一个矩形边可以与长直线重叠)

  • 矩形可能包含一些其他功能(例如矩形内的字母,数字或某些徽标)

  • 有些特征看起来像矩形(例如,字符'D'看起来像一个矩形,右上角和右下角有一个小弧形;另一个例子是梯形而不是平行四边形)

  • 矩形可以顺时针和逆时针旋转0到15度

  • 有可能在不同的光照条件下(例如1个像素间隙)将线分成几行,因此过滤线的最小线长必须很小(例如在Hough变换中)

  • 当最小行长度设置为较小值时,更常见的是在不同方向上查看同一行的重复行(即需要组合多行)

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

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

Hough transformation vs Contour detection for Rectangle recognition with perspective projection

欢迎任何建议!

EDIT: Add some pictures

Character D

Character D

Rect edge merged with long straight line

Rectangle with logo and the edges are merged with long straight line

enter image description here

Trapezoid (with shadow on the top forming trapezoid in the bottom)

1 回答

  • 1

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

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

    在使用二进制/侵蚀之前制作图像的副本,以便在获得轮廓检测感兴趣的区域后,可以将复制图像裁剪到该区域 .

    道歉示例链接是用python编写的,但我相信一旦你明白了,将它移植到C将很容易 .

    希望这可以帮助 .

    EDIT

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

    下面看到结果:

    enter image description here

    Bounding box around largest set of contours

    enter image description here

    The same, drawn over the original images

    enter image description here

相关问题