OpenCV 2d线交叉辅助函数

tis*_*sch 16 opencv

我正在寻找一个辅助函数来计算OpenCV中两条线的交集.我搜索过API文档,但找不到有用的资源.

是否有基本的几何辅助函数用于OpenCV中线/线段的交点/距离计算?

And*_*aev 43

OpenCV API中没有函数来计算行交集,但距离为:

cv::Point2f start, end;
double length = cv::norm(end - start);
Run Code Online (Sandbox Code Playgroud)

如果你需要一段代码来计算线交叉点,那么它在这里是:

// Finds the intersection of two lines, or returns false.
// The lines are defined by (o1, p1) and (o2, p2).
bool intersection(Point2f o1, Point2f p1, Point2f o2, Point2f p2,
                      Point2f &r)
{
    Point2f x = o2 - o1;
    Point2f d1 = p1 - o1;
    Point2f d2 = p2 - o2;

    float cross = d1.x*d2.y - d1.y*d2.x;
    if (abs(cross) < /*EPS*/1e-8)
        return false;

    double t1 = (x.x * d2.y - x.y * d2.x)/cross;
    r = o1 + d1 * t1;
    return true;
}
Run Code Online (Sandbox Code Playgroud)

  • 另请参阅[min_enclosing_triangle.cpp](https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/min_enclosing_triangle.cpp#L1380-L1424) (2认同)

Mak*_*nko 7

在2D几何图形中有一个很酷的技巧,我发现这对于计算线相交非常有用。为了使用此技巧,我们以均质3D坐标表示每个2D点和每个2D线。

首先,我们来谈谈2D点:

  1. 每个2D点(x, y)对应于一条穿过点(0, 0, 0)和的3D线(x, y, 1)
  2. 所以(x, y, 1)and (?•x, ?•y, ?)(?•x, ?•y, ?)对应(x, y)于2D空间中的同一点。
  3. 这是将2D点转换为齐次坐标的公式: (x, y) -> (x, y, 1)
  4. 以下是将齐次坐标转换为2D点的公式:(x, y, ?) -> (x / ?, y / ?)。如果?为零表示“指向无穷大”。它不对应于2D空间中的任何点。
  5. 在OpenCV中,您可以使用convertPointsToHomogeneous()convertPointsFromHomogeneous()

现在让我们谈谈二维线:

  1. 每条2D线可以用三个坐标表示,(a, b, c)它们对应于2D线方程:a•x + b•y + c = 0
  2. 所以(a, b, c)(?•a, ?•b, ?•c)对应于同一条2D线。
  3. 同样,(a, b, c)对应于(nx, ny, d)(nx, ny)是归一化法向矢量,d是从线到的距离(0, 0)
  4. 此外,(nx, ny, d)是线的极坐标(cos ?, sin ?, ?)在哪里(?, ?)

有两个有趣的公式将点和线链接在一起:

  1. 齐次坐标中两个不同点的叉积给出齐次线坐标: (x?, y?, 1) ? (x?, y?, 1) = (a, b, c)
  2. 齐次坐标中两条不同线的叉积给出其交点的齐次坐标:(a?, b?, c?) ? (a?, b?, c?) = (x, y, ?)。如果呢?为零表示线是平行的(在欧几里得几何中没有单个交点)。
  3. 在OpenCV中,您可以使用Mat::cross()numpy.cross()获得交叉产品

如果您仍然在这里,您将拥有找到具有两点的线和具有两线的交点的全部功能。