c++ opencv fitLine函数拟合直线

c++ opencv fitLine函数拟合直线

fitLine 函数

void fitLine( InputArray points, OutputArray line, int distType,
double param, double reps, double aeps );

points 积分: 2D 或 3D 点的输入向量,存储在 std::vector<> 或Mat中。
line 线: 输出线参数。在 2D 拟合的情况下,它应该是 4 个元素的向量(如 Vec4f) - (vx, vy, x0, y0),其中 (vx, vy) 是与直线共线的归一化向量, (x0, y0) 是线上的一个点。在 3D 拟合的情况下,它应该是 6 个元素的向量(如 Vec6f) - (vx, vy, vz, x0, y0, z0),其中 (vx, vy, vz) 是与直线共线的归一化向量,并且(x0, y0, z0) 是线上的一个点。
distType: M 估计器使用的距离,请参阅DistanceTypes
param 参数: 某些类型的距离的数值参数 ( C )。如果为 0,则选择最优值。
reps 代表: 足够的半径精度(坐标原点和直线之间的距离)。
aeps: 角度足够精确。对于 reps 和 aeps 来说,0.01 是一个很好的默认值。

opencv函数说明链接: https://docs.opencv.org/4.5.4/d3/dc0/group__imgproc__shape.html#gaf849da1fdafa67ee84b1e9a23b93f91f

拟合直线下面展示一些 内联代码片

	//2D返回的参数  Vec4f - (vx, vy, x0, y0)
	//(vx, vy) 是直线的方向向量
	//(x0, y0) 是直线的中心点坐标
    cv::Vec4f ret_fitLine;
    cv::fitLine(output_points, ret_fitLine, cv::DIST_L2, 0, 0.01, 0.01);

    // y = k * x + b    x = (y - b) / k;
    // b = y - k * x;   
    float k = ret_fitLine[1] / ret_fitLine[0];
    float b = ret_fitLine[3] - (k * ret_fitLine[2]);
    //线段起点x
    int x1 = line_start_p_x;
    int y1 = k * line_start_p_x + b;
    //线段终点x
    int x2 = line_end_p_x;
    int y2 = k * line_end_p_x + b;

    line(outRGB, cv::Point(x1,y1), cv::Point(x2, y2), cv::Scalar(0, 255, 0), 1);

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41648925/article/details/125480065