使用HoughLinesP检测矩形物体的精确中心点

时间:2013-08-23 11:18:41

标签: c++ algorithm opencv computer-vision

我有一个对象,我想定义它的确切中心。使用OpenCV我使用Canny检测边缘,然后执行HoughLinesP以检测线:see this

我使用Hough变换,因为对象不是完全矩形的,有时会检测到凸起here

行在结构中定义。我还计算中点,角度和长度:

struct hLine {
    Point pStart, pEnd, pMidpoint;
    float angle;
    int length;
};

如您所见,沿侧面检测到多条线。

问题是:如何获得矩形每边的最长线(在这种情况下为0,1,3,4)?

我尝试的方法是计算线方程 y = kx + n ,然后按角度,长度和 n 对线进行排序,并仅保留线条,其中< strong> n 用一些数字分隔(矩形的两边)。我的垂直线有问题( n 无法计算),当对象几乎垂直时 n 数字很大,因此不会删除该行。

下一步是计算线交点,然后计算中心。 Idea基于本教程:opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects /

如果有人有更好的方法来检测准确的中心点,请说出来:)

3 个答案:

答案 0 :(得分:1)

使用canny检测边缘后,您可以使用形态学关闭操作来连接边缘。然后使用多边形近似找到轮廓并平滑轮廓。对于您找到的每个四边形,您可以检查拐角是否大致为90度,以验证它是否为矩形。根据您的样本图像,您检测到的最大矩形应该是您感兴趣的矩形。(您还可以找到每个轮廓的凸包,然后将多边形近似应用于凸包)。

答案 1 :(得分:0)

我愿意:

  • 首先计算数据的OBB(定向边界框)。
  • 沿OBB边缘创建四个边界框,其宽度有一定的预定精度。
  • 丢弃所有点,这些点位于四个边缘边界框中的一个中。
  • 为边缘制作四个最小边缘边界框(此处丢弃凸起)
  • 从四个边缘边框的中心线创建一个矩形。
  • 计算矩形的中心。

答案 2 :(得分:0)

我会这样做:

  1. 使用霍夫变换来计算线方程。如果通过法线向量参数化线,则垂直/水平线应该没有问题;
  2. 然后,通过计算线的交叉点来获取矩形的4个角;
  3. 最后,通过计算矩形对角线的方程式,然后寻找它们的交点来获得中心。
  4. 步骤1和2已在您提供的链接中完成。

    如果霍夫线检测不够健壮怎么办?

    在这种情况下,我会使用A. Desolneux提出的一种非常强大的检测算法meaningful alignments。 它背后的数学起初看起来有点可怕,但算法仍然很容易实现(虽然可能有点慢)。 我过去曾经使用它,结果与作者声称的一样好。