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

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

param: 距离参数,跟所选的距离类型有关,值可以设置为0。

reps, aeps: 第5/6个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2.

b. 输出结果:

output : 对于二维直线,输出output为4维,前两维代表拟合出的直线的方向,后两位代表直线上的一点。(即通常说的点斜式直线)

备注:

函数说明部分参考C++中 cv:: fitLine()介绍。

  1. 实例程序

功能: 实现几条直线的直线拟合,输出为拟合后直线点的斜率k和偏移b.

代码:

def Cal_kb_linear_fitline(data_line1):

loc = \[\] # 坐标

for line in data_line1:

x1, y1, x2, y2 = line0

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 = output1 / output0

b = output3 - kkey * output2

return k,b

这里,data_line1 表示直线检测出的直线的数据。

若只是想实现几个点坐标的直线拟合,把第3-8行去掉并把参数输入改为loc即可。

  1. RLS直线拟合(不用fitline函数)

简介中提过,在用fitline函数之前,实现了N条直线的最小二乘直线拟合,同样展示程序如下:


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/lovetaozibaby/article/details/99482973

备注:

注意,这里是N条直线的直线拟合,拟合思路为提取N条直线的坐标点,然后进行点的直线拟合。

相关推荐
FreakStudio3 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663674 小时前
使用 Python 从零创建 Word 文档
python
Csvn9 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽10 小时前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户5569188175311 小时前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱1 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
luckdewei1 天前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi001 天前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn1 天前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python