使用 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 检测矩形对象的准确中心点的主要内容,如果未能解决你的问题,请参考以下文章

HoughLinesP(霍夫变换直线检测)

Python OpenCV HoughLinesP 无法检测线

OpenCV实战——拟合直线

OpenCV 对象检测 - 中心点

opencv学习-霍夫变换-直线检测

使用 HOG+SVM Opencv 检测对象的矩形