我正在寻找一个辅助函数来计算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)
在2D几何图形中有一个很酷的技巧,我发现这对于计算线相交非常有用。为了使用此技巧,我们以均质3D坐标表示每个2D点和每个2D线。
首先,我们来谈谈2D点:
(x, y)对应于一条穿过点(0, 0, 0)和的3D线(x, y, 1)。(x, y, 1)and (?•x, ?•y, ?)和(?•x, ?•y, ?)对应(x, y)于2D空间中的同一点。(x, y) -> (x, y, 1)(x, y, ?) -> (x / ?, y / ?)。如果?为零表示“指向无穷大”。它不对应于2D空间中的任何点。convertPointsToHomogeneous()和convertPointsFromHomogeneous()现在让我们谈谈二维线:
(a, b, c)它们对应于2D线方程:a•x + b•y + c = 0(a, b, c)和(?•a, ?•b, ?•c)对应于同一条2D线。(a, b, c)对应于(nx, ny, d),(nx, ny)是归一化法向矢量,d是从线到的距离(0, 0)。(nx, ny, d)是线的极坐标(cos ?, sin ?, ?)在哪里(?, ?)。有两个有趣的公式将点和线链接在一起:
(x?, y?, 1) ? (x?, y?, 1) = (a, b, c)(a?, b?, c?) ? (a?, b?, c?) = (x, y, ?)。如果呢?为零表示线是平行的(在欧几里得几何中没有单个交点)。Mat::cross()或numpy.cross()获得交叉产品如果您仍然在这里,您将拥有找到具有两点的线和具有两线的交点的全部功能。
| 归档时间: |
|
| 查看次数: |
30332 次 |
| 最近记录: |