opencv fitline()详解及使用

在 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. 常见应用场景

  1. 车道线检测(自动驾驶)

  2. 边缘直线拟合(工业检测)

  3. 运动轨迹分析(目标跟踪)

  4. 点云数据拟合(3D 重建)


6. 注意事项

  • 输入点集:至少需要 2 个点(2D)或 3 个点(3D),否则会报错。

  • 异常值影响:如果数据有噪声(离群点),建议使用 DIST_HUBER 或 DIST_WELSCH 提高鲁棒性。

  • 单位向量(vx, vy) 或 (vx, vy, vz) 是归一化的方向向量(长度为 1)。


7. 总结

cv::fitLine() 是 OpenCV 中用于 拟合直线 的高效函数,适用于 2D/3D 点集,并返回 方向向量 + 经过点 的参数。在计算机视觉任务中广泛用于几何分析。

猜你喜欢

转载自blog.csdn.net/weixin_54474317/article/details/146541951