使用 HoughLinesP 检测矩形对象的准确中心点
Posted
技术标签:
【中文标题】使用 HoughLinesP 检测矩形对象的准确中心点【英文标题】:Detecting accurate center point of rectangular object using HoughLinesP 【发布时间】:2013-08-23 11:18:41 【问题描述】:我有一个对象,我想定义它的确切中心。使用 OpenCV,我使用 Canny
检测边缘,然后执行 HoughLinesP
检测线条:see this。
我使用霍夫变换是因为对象不是完全矩形的,有时会检测到凹凸here。
行在结构中定义。我还计算了中点、角度和长度:
struct hLine
Point pStart, pEnd, pMidpoint;
float angle;
int length;
;
如您所见,沿侧面检测到多条线。
问题是:如何获取矩形每一边的最长线(本例中为 0、1、3、4)?
我尝试的方法是计算直线方程y = kx + n,然后按角度、长度和n对直线进行排序,并只保留具有n 以某个数字分隔(矩形的相对边)。我有垂直线的问题(n 无法计算),并且当对象几乎垂直时 n 数字很大,因此不会删除线。
下一步是计算线的交点,然后计算中心。想法基于本教程:opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/
另外,如果有人有更好的解决方案来检测准确的中心点,请说出来:)
【问题讨论】:
【参考方案1】:使用 canny 检测边缘后,您可以使用形态闭合操作来连接边缘。然后找到轮廓并使用多边形近似对轮廓进行平滑处理。对于您找到的每个四边形,您可以检查角是否大致为 90 度,以验证它是否是矩形。根据您的示例图像,您检测到的最大矩形应该是您感兴趣的矩形。(您也可以找到每个轮廓的凸包,然后将多边形近似应用于凸包)。
【讨论】:
我实现了这个,但多边形近似 (cv::approxPolyDP
) 会产生奇怪的形状。这是使用 epsilon=5:snag.gy/kV2uu.jpg,epsilon=2:snag.gy/7PtuP.jpg,这更好,但它还包括下侧的凹凸。
可能是 epsilon 与轮廓的长度相比太小了。如果 epsilon 太小,您将再次密切关注轮廓,多边形近似也不会更好,您甚至可能无法接近四边形。尝试增加 epsilon,比如说轮廓长度的一部分
看看 squares.cpp opencv 示例。它使用了类似的方法
我认为您也可以使用轮廓本身(我相信轮廓是图像中的绿线,多边形是红线)来计算中心。计算轮廓的空间矩m00、m01和m10,使用x = m10/m00, y = m01/m00计算质心。
我采用了我原来的方法,结果非常好。我使用 HoughLinesP 然后过滤结果 - 我只对矩形的每一边使用最长的线,然后计算这些线的交点。完成后我会发布更多信息。另外,你投票是因为我用你的想法来进行形态关闭:)【参考方案2】:
我愿意:
首先计算数据的 OBB(定向边界框)。 沿 OBB 的边缘创建四个边界框,其宽度具有一定的预定义精度。 丢弃位于四个边缘边界框之一中的所有点。 为边缘制作四个最小边缘边界框(此处丢弃凹凸) 从四个边缘边界框的中心线创建一个矩形。 计算矩形的中心。【讨论】:
第三第四操作我不是很懂。我应该丢弃哪些点? @SimonG。第三个是角点,第四个是偏离/颠簸的点(你的术语)(对最小边缘边界有负面影响)【参考方案3】:我会这样做:
-
使用霍夫变换来计算线方程。如果通过法向量参数化一条线,则垂直/水平线应该没有问题;
然后,通过计算线的交点得到矩形的 4 个角;
最后,通过计算矩形对角线的方程,然后寻找它们的交点来获得中心。
步骤 1 和 2 已经在您提供的链接中完成。
如果霍夫线检测不够稳健怎么办?
在这种情况下,我会使用 A. Desolneux 提出的一种称为meaningful alignments 的非常强大的检测算法。 起初它背后的数学可能看起来有点吓人,但该算法仍然很容易实现(虽然可能有点慢)。 我以前用过,效果真的和作者说的一样好。
【讨论】:
您是指标准霍夫变换还是概率霍夫变换?我尝试使用标准变换,但我得到了许多不正确的线条,特别是对于矩形的较短边。使用概率变换我得到了我的问题中描述的问题。 我向您推荐另一种非常强大的线检测方法。请参阅答案中的链接。以上是关于使用 HoughLinesP 检测矩形对象的准确中心点的主要内容,如果未能解决你的问题,请参考以下文章