我正在尝试使用不同的方法检测灰度图像中的白色矩形:轮廓检测和霍夫变换。不幸的是,我正在处理的图像有一些限制,即
- 图像中有很多特征,矩形不是唯一的特征
- 矩形可以合并到其他特征(例如,其中一个矩形边缘可以与一条长直线重叠)
- 矩形可以包含一些其他特征(例如矩形内的字母、数字或一些 Logo )
- 有一些特征看起来像矩形(例如字符'D'看起来像一个矩形,右上角和右下角有小圆弧;另一个例子是梯形而不是平行四边形)
- 矩形可以顺时针和逆时针旋转0到15度
- 在不同的光照条件下(例如 1 像素间隙),这些线可能会分成几条线,因此过滤线的最小线长必须很小(例如,在霍夫变换中)
- 当最小线长设置为较小的值时,更容易看到同一行在不同方向的重复行(即需要合并多条线)
对于轮廓方法,一些图像的轮廓被破坏了。此外,图像可能包含矩形等特征(例如字符“D”)。我不确定这是否是一个好方法。
我看到很多文章/论坛建议使用 Hough 变换来检测矩形,如下面的帖子。不幸的是,我必须设置最小行长度的小值并且看到了重复的行。我不知道如何处理上面提到的点(例如,合并所有重复的线并为每条边只选择一条线,如何区分大部分是线但带有像“D”这样的小弧的特征,以及如何用一条边与一条长直线等合并来隔离正方形)。
Hough transformation vs Contour detection for Rectangle recognition with perspective projection
欢迎提出任何建议!
编辑:添加一些图片
字符 D
带logo的矩形,边缘与长直线合并
梯形(顶部阴影形成底部梯形)
最佳答案
我建议您尝试使用 binary threshold (自适应或其他方式)在每个图像上,这将为您的轮廓检测提供一些清晰的线条。您也可以erode/dilate去除噪声的图像(例如第二张图像中的细线)
然后使用轮廓检测,对轮廓进行计数,找到图像中具有四个边的最大对象(这可能是您的对象)。
在使用二进制/侵 eclipse 之前制作图像的拷贝,以便一旦从轮廓检测中获得感兴趣的区域,就可以将拷贝图像裁剪到该区域。
抱歉,示例链接是用 Python 编写的,但我相信一旦您理解了这个想法,将它移植到 C++ 将很容易。
希望这对您有所帮助。
编辑
我自己尝试了上述方法,对每张图像进行阈值化、轮廓检测,然后在最大的一组轮廓周围绘制边界框。
结果如下:
最大轮廓集周围的边界框
相同,绘制在原始图像上
关于c++ - opencv:在矩形检测中使用轮廓和霍夫变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30082431/