OpenCV | 直线拟合fitline函数

本文详细介绍了如何使用OpenCV的fitLine函数来拟合直线,包括函数参数的解释和代码示例。fitLine函数通过最小化输入点到直线的距离来找到最佳拟合线,支持多种距离类型如L1、L2等。在示例中,展示了如何从数据点生成矩阵,调用fitLine函数,并计算得到直线的斜率和截距。
摘要由CSDN通过智能技术生成

        

学习目标:

学习掌握OpenCV的fitline函数


学习内容:

cv::fitLine()的具体调用形式如下:

void cv::fitLine(  
    cv::InputArray points, // 待拟合的直线的集合,必须是矩阵形式;
    cv::OutputArray line, //  距离类型。fitline为距离最小化函数,拟合直线时,要使输入点到拟合直线的距离和最小化。  
    int distType, // 距离类型  
    double param, //  距离参数,跟所选的距离类型有关,值可以设置为0。
    double reps, // 径向的精度参数  表示直线到原点距离的精度,建议取 0.01。设为0,则自动选用最优值
    double aeps // 角度精度参数  表示直线角度的精度,建议取 0.01
);

距离类型有以下的类别:

cv2.DIST_USER : User defined distance
cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
cv2.DIST_L2: 欧式距离,此时与最小二乘法相同
cv2.DIST_C:distance = max(|x1-x2|,|y1-y2|)
cv2.DIST_L12:L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
cv2.DIST_FAIR:distance = c^2(|x|/c-log(1+|x|/c)), c = 1.3998
cv2.DIST_WELSCH: distance = c2/2(1-exp(-(x/c)2)), c = 2.9846
cv2.DIST_HUBER:distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345


代码实现:

def fit(x,y,length):
    points = []
    for i in range(length):
        points.append([x[i], y[i]])
    points = np.array(points)
    output = cv.fitLine(points, cv.DIST_L2, 0, 0.01, 0.01)
    #output[0],output[1]是一个方向向量,output[2],output[3]是直线上一个点
    k = output[1] / output[0]
    b = output[3] - k * output[2]

OpenCV提供了直线拟合函数fitLine,可以用于拟合多条直线。该函数的原型如下: void fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps); 其中,points是输入的坐标点集合,line是输出的拟合直线的参数,distType是距离类型,param是距离参数,reps是拟合精度,aeps是角度精度。 要进行多条直线拟合,可以将多组坐标点分别传入fitLine函数进行拟合,得到对应的直线参数。可以使用std::vector<cv::Point>来存储每组坐标点,然后循环调用fitLine函数进行拟合。 以下是一个示例代码,用于拟合多条直线: std::vector<std::vector<cv::Point>> pointSets; // 存储多组坐标点 std::vector<cv::Vec4f> lines; // 存储拟合直线的参数 // 循环拟合每组坐标点 for (int i = 0; i < pointSets.size(); i++) { cv::Mat pointsMat(pointSets\[i\]); cv::Vec4f line; cv::fitLine(pointsMat, line, cv::DIST_L2, 0, 0.01, 0.01); lines.push_back(line); } 这样,lines中就存储了拟合得到的多条直线的参数。每个直线的参数是一个cv::Vec4f,其中前两个元素表示直线上的一个点,后两个元素表示直线的方向向量。 请注意,拟合直线的精度参数reps和aeps可以根据实际需求进行调整,以获得更好的拟合效果。 #### 引用[.reference_title] - *1* *2* *3* [OpenCV 学习(直线拟合)](https://blog.csdn.net/liyuanbhu/article/details/50193947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值