在 OpenCV 中,cv::fitLine()
返回的 方向向量(Direction Vector) 是描述直线方向的核心参数。以下是关于方向向量的详细说明:
1. 方向向量的定义
方向向量是一个 单位向量(长度为 1),表示直线的延伸方向:
-
2D 直线:
(vx, vy)
-
3D 直线:
(vx, vy, vz)
它从拟合直线上的参考点 (x0, y0)
(或 (x0, y0, z0)
)指向直线的延伸方向。
2. 方向向量的特性
特性 | 说明 |
---|---|
单位长度 | sqrt(vx² + vy²) = 1 (2D)或 sqrt(vx² + vy² + vz²) = 1 (3D) |
符号无关 | (vx, vy) 和 (-vx, -vy) 表示同一直线(方向相反) |
几何意义 | 描述直线每移动 1 个单位时,坐标的变化量(如 vx=0.6, vy=0.8 表示斜率) |
3. 方向向量的计算示例
(1) 2D 直线方向
假设 cv::fitLine()
返回 Vec4f line(vx, vy, x0, y0)
:
-
斜率(Slope):
float slope = vy / vx; // 直线的斜率
-
角度(Angle):
float angle_rad = std::atan2(vy, vx); // 弧度制 float angle_deg = angle_rad * 180 / CV_PI; // 角度制
(2) 3D 直线方向
返回 Vec6f line(vx, vy, vz, x0, y0, z0)
:
-
方向向量:
(vx, vy, vz)
-
单位化验证:
float norm = std::sqrt(vx*vx + vy*vy + vz*vz); // 应 ≈ 1.0
4. 方向向量的可视化
(1) 2D 直线绘制
// 从参考点 (x0, y0) 沿方向向量延伸 cv::Point2f pt1(x0 - 100 * vx, y0 - 100 * vy); // 反向延伸 cv::Point2f pt2(x0 + 100 * vx, y0 + 100 * vy); // 正向延伸 cv::line(img, pt1, pt2, cv::Scalar(0, 0, 255), 2); // 绘制直线
(2) 3D 直线方向
在 3D 空间中,方向向量可用于定义射线或生成点云:
for (float t = -10; t <= 10; t += 0.5) { cv::Point3f pt( x0 + t * vx, y0 + t * vy, z0 + t * vz ); // 将 pt 加入点云或绘制 }
5. 常见问题
Q1: 方向向量为什么是单位向量?
-
OpenCV 默认对方向向量进行归一化,方便计算几何属性(如角度、投影)。
-
若需非单位向量,需手动缩放。
Q2: 如何判断两条直线是否平行?
计算两方向向量的 点积(2D/3D 均适用):
float dot = vx1 * vx2 + vy1 * vy2; // 2D // 或 float dot3D = vx1 * vx2 + vy1 * vy2 + vz1 * vz2; // 3D bool isParallel = std::abs(dot - 1.0) < 1e-6; // 是否近似平行
Q3: 如何求直线的垂直向量?
-
2D:交换
(vx, vy)
并取反一个分量,如(-vy, vx)
。 -
3D:需通过叉积计算(需另一非平行向量)。
6. 应用场景
-
车道线检测:方向向量表示车道走向。
-
物体朝向分析:3D 方向向量描述物体的运动方向。
-
机器人导航:用于路径规划的直线方向。
总结
-
方向向量 是
cv::fitLine()
的核心输出,表示直线的归一化方向。 -
2D 用
(vx, vy)
,3D 用(vx, vy, vz)
,长度均为 1。 -
可用于计算斜率、角度、平行性判断等几何操作。