在 OpenCV 中,cv::fitLine()
是一个函数,用于 拟合一组 2D 或 3D 点集到一条直线(或平面),并返回直线的参数(如方向向量和经过的点)。它常用于计算机视觉中的几何分析,例如检测图像中的直线、边缘或运动轨迹。
1. 函数原型
void cv::fitLine( InputArray points, // 输入点集(2D 或 3D) OutputArray line, // 输出直线参数 int distType, // 距离计算方法 double param, // 距离计算参数(通常 0) double reps, // 半径精度(一般 0.01) double aeps // 角度精度(一般 0.01) );
2. 参数详解
参数 | 类型 | 说明 |
---|---|---|
points |
InputArray |
输入点集,可以是 vector<Point2f> 或 vector<Point3f> |
line |
OutputArray |
输出直线参数(4 或 6 个元素) |
distType |
int |
距离计算方法(见下文) |
param |
double |
某些距离类型的参数(通常设为 0 ) |
reps |
double |
半径精度(默认 0.01 ) |
aeps |
double |
角度精度(默认 0.01 ) |
distType
支持的拟合方法
方法 | 说明 |
---|---|
cv::DIST_L2 |
最小二乘法(默认) |
cv::DIST_L1 |
最小绝对值误差 |
cv::DIST_L12 |
L1-L2 混合 |
cv::DIST_FAIR |
Fair 权重 |
cv::DIST_WELSCH |
Welsch 权重 |
cv::DIST_HUBER |
Huber 权重 |
3. 返回值 line
的格式
(1) 2D 直线拟合
返回一个 Vec4f
或 Vec4d
向量:
复制
[vx, vy, x0, y0]
-
(vx, vy)
:单位方向向量(直线的斜率)。 -
(x0, y0)
:直线经过的一个点。
(2) 3D 直线拟合
返回一个 Vec6f
或 Vec6d
向量:
复制
[vx, vy, vz, x0, y0, z0]
-
(vx, vy, vz)
:单位方向向量。 -
(x0, y0, z0)
:直线经过的一个点。
4. 代码示例
(1) 2D 点集拟合直线
#include <opencv2/opencv.hpp> using namespace cv; int main() { // 生成一些随机点(实际应用中可以用轮廓点或特征点) std::vector<Point2f> points = { Point2f(1, 1), Point2f(2, 2), Point2f(3, 3), Point2f(4, 4), Point2f(5, 5) }; Vec4f line; cv::fitLine(points, line, DIST_L2, 0, 0.01, 0.01); // 提取直线参数 float vx = line[0], vy = line[1]; // 方向向量 float x0 = line[2], y0 = line[3]; // 直线上一点 // 计算直线的两个端点(用于绘制) Point2f pt1(x0 - 100 * vx, y0 - 100 * vy); // 延长 100 像素 Point2f pt2(x0 + 100 * vx, y0 + 100 * vy); // 在图像上绘制点和直线 Mat img(500, 500, CV_8UC3, Scalar(0, 0, 0)); for (const auto& pt : points) { circle(img, pt, 3, Scalar(0, 255, 0), FILLED); // 画点 } line(img, pt1, pt2, Scalar(255, 0, 0), 2); // 画拟合直线 imshow("Fitted Line", img); waitKey(0); return 0; }
(2) 3D 点集拟合直线
std::vector<Point3f> points3D = { /* ... */ }; Vec6f line3D; cv::fitLine(points3D, line3D, DIST_L2, 0, 0.01, 0.01);
5. 常见应用场景
-
车道线检测(自动驾驶)
-
边缘直线拟合(工业检测)
-
运动轨迹分析(目标跟踪)
-
点云数据拟合(3D 重建)
6. 注意事项
-
输入点集:至少需要 2 个点(2D)或 3 个点(3D),否则会报错。
-
异常值影响:如果数据有噪声(离群点),建议使用
DIST_HUBER
或DIST_WELSCH
提高鲁棒性。 -
单位向量:
(vx, vy)
或(vx, vy, vz)
是归一化的方向向量(长度为 1)。
7. 总结
cv::fitLine()
是 OpenCV 中用于 拟合直线 的高效函数,适用于 2D/3D 点集,并返回 方向向量 + 经过点 的参数。在计算机视觉任务中广泛用于几何分析。