2

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

我使用霍夫变换是因为对象不是完全矩形的,有时这里会检测到凹凸

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

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/

另外,如果有人有更好的解决方案来检测准确的中心点,请说出来:)

4

3 回答 3

1

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

于 2013-08-23T16:48:06.850 回答
0

我会这样做:

  1. 使用霍夫变换来计算线方程。如果通过法向量参数化一条线,则垂直/水平线应该没有问题;
  2. 然后,通过计算线的交点得到矩形的 4 个角;
  3. 最后,通过计算矩形对角线的方程得到中心,然后寻找它们的交点。

步骤 1 和 2 已经在您提供的链接中完成。

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

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

于 2013-08-23T14:07:34.877 回答
0

我会做:

  • 首先计算数据的 OBB(定向边界框)。
  • 沿着 OBB 的边缘创建四个边界框,其宽度具有一定的预定义精度。
  • 丢弃所有位于四个边缘边界框之一中的点。
  • 为边缘制作四个最小边缘边界框(此处丢弃凹凸)
  • 从四个边缘边界框的中心线创建一个矩形。
  • 计算矩形的中心。
于 2013-08-23T13:42:59.857 回答