OpenCV直线拟合fitline函数(Python)

OpenCV直线拟合fitline函数(Python)
简介
之前做直线拟合时,⾃⼰写了⼀个利⽤最⼩⼆乘做直线拟合的程序,但是由于直线检测的误差⽐较⼤,拟合的效果并不好。个⼈不知道是什么原因,因此想尝试更改⼀下直线拟合的算法,后来到了OpenCV中的fitline函数,也是⼀个距离最⼩化函数,它完全包含了最⼩⼆乘法。由于⽹上没有到相关的与python有关的资源,这⾥总结如下。
1. 函数调⽤
python3中fitline函数的调⽤形式如下:
import cv2
output = cv2.fitLine(InputArray  points, distType, param, reps, aeps)
参数定义:
a. 输⼊参数:
InputArray Points: 待拟合的直线的集合,必须是矩阵形式;
distType: 距离类型。fitline为距离最⼩化函数,拟合直线时,要使输⼊点到拟合直线的距离和最⼩化。这⾥的** 距离**的类型有以下⼏种:
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
2/2(1-exp(-(x/c)
cv2.DIST_WELSCH: distance = c2)), c = 2.9846
cv2.DIST_HUBER:distance = |x|<c ? x^2/2 : c(|x|-c/2), c=1.345
param: 距离参数,跟所选的距离类型有关,值可以设置为0。
reps, aeps: 第5/6个参数⽤于表⽰拟合直线所需要的径向和⾓度精度,通常情况下两个值均被设定为1e-2.
b. 输出结果:
output : 对于⼆维直线,输出output为4维,前两维代表拟合出的直线的⽅向,后两位代表直线上的⼀点。(即通常说的点斜式直线)
备注:
函数说明部分参考。
拟合直线2. 实例程序
功能: 实现⼏条直线的直线拟合,输出为拟合后直线点的斜率k和偏移b.
代码:
def Cal_kb_linear_fitline(data_line1):
loc =[]# 坐标
for line in data_line1:
x1, y1, x2, y2 = line[0]
loc.append([x1,y1])
loc.append([x2,y2])
loc = np.array(loc)# loc 必须为矩阵形式,且表⽰[x,y]坐标
output = cv2.fitLine(loc, cv2.DIST_L2,0,0.01,0.01)
k = output[1]/ output[0]
b = output[3]- k[key]* output[2]
return k,b
这⾥,data_line1 表⽰直线检测出的直线的数据。
若只是想实现⼏个点坐标的直线拟合,把第3-8⾏去掉并把参数输⼊改为loc即可。
3. RLS直线拟合(不⽤fitline函数)
简介中提过,在⽤fitline函数之前,实现了N条直线的最⼩⼆乘直线拟合,同样展⽰程序如下:def Cal_kb_linear(data_line1):
X_line,Y_line = XY_line2Classifier_line(data_line1)
r = leastsq(residuals,[1,0], args=(X_line, Y_line))# scipy.optimize.leastsq
k, b = r[0]# 最⼩⼆乘直线拟合的斜率和偏移
return k,b
# 输出直线的X/Y坐标
def XY_line2Classifier_line(data_line1):
X_line =[]# 存放分为同⼀类的直线的所有的x坐标
Y_line =[]# 存放分为同⼀类的直线的所有的y坐标
for line in data_line1:
x1, y1, x2, y2 = line[0]
X_line.append(x1), X_line.append(x2)
Y_line.append(y1), Y_line.append(y2)
X_line = np.array(X_line)
Y_line = np.array(Y_line)
return X_line,Y_line
#  直线拟合残差计算
def residuals(p, x, y_):
k, b = p
return y_ -(k * x + b)
备注:
注意,这⾥是N条直线的直线拟合,拟合思路为提取N条直线的坐标点,然后进⾏点的直线拟合。

本文发布于:2024-09-21 20:44:09,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/358965.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:直线   拟合   距离   函数   参数   有关   输出
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议