OpenCV | 直线拟合fitline函数(Python)

OpenCV | 直线拟合fitline函数(Python)简介之前做直线拟合时 自己写了一个利用最小二乘做直线拟合的程序 但是由于直线检测的误差比较大 拟合的效果并不好 个人不知道是什么原因 因此想尝试更改一下直线拟合的算法 后来找到了 OpenCV 中的 fitline 函数 也是一个距离最小化函数 它完全包含了最小二乘法 由于网上没有找到相关的与 python 有关的资源 这里总结如下 1 函数调用 python3 中 fitline 函数的调用形式如下 im

简介

之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好。个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了OpenCV中的fitline函数,也是一个距离最小化函数,它完全包含了最小二乘法。由于网上没有找到相关的与python有关的资源,这里总结如下。

1. 函数调用

python3中fitline函数的调用形式如下:

import cv2 output = cv2.fitLine(InputArray points, distType, param, reps, aeps) 

参数定义:

a. 输入参数:

InputArray Points: 待拟合的直线的集合,必须是矩阵形式;
distType: 距离类型。fitline为距离最小化函数,拟合直线时,要使输入点到拟合直线的距离和最小化。这里的 距离的类型有以下几种:

param: 距离参数,跟所选的距离类型有关,值可以设置为0。
reps, aeps: 第5/6个参数用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2.

b. 输出结果:

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

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

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条直线的坐标点,然后进行点的直线拟合。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207654.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:23
下一篇 2026年3月19日 下午1:23


相关推荐

  • notepad++正则表达式替换字符串

    notepad++正则表达式替换字符串则表达式是一个查询的字符串,它包含一般的字符和一些特殊的字符,特殊字符可以扩展查找字符串的能力,正则表达式在查找和替换字符串的作用不可忽视,它能很好提高工作效率。EditPlus的查找,替换,文件中查找支持以下的正则表达式:表达式说明/t制表符./n新行..匹配任意字符.|匹配表达式左边和右边的字符.例如,”ab|bc”匹配”ab”或者”bc”….

    2022年5月17日
    46
  • 四阶行列式如何降阶_四阶行列式的计算方法

    四阶行列式如何降阶_四阶行列式的计算方法四阶行列式计算方法的一些教学探讨龙源期刊网 http www qikan com cn 四阶行列式计算方法的一些教学探讨作者 甘媛来源 课程教育研究 学法教法研究 2018 年第 32 期 摘要 行列式的计算是线性代数中主要的基础知识之一 利用倍加性质造零是四阶行列式的计算方法中最关键的步骤 也是难点 针对高职高专学生的特点 总结出学生容易理解接受的新技巧 找 1 造 0 横写竖算

    2026年3月20日
    2
  • 单射(或称单变换)、双射与满射

    单射(或称单变换)、双射与满射单射(或称单变换)、双射与满射原文链接:http://www.cnblogs.com/wanghetao/archive/2012/03/16/2400619.html数学上,单射、满射和双射指根据其定义域和陪域的关联方式所区分的三类函数。单射:指将不同的变量映射到不同的值的函数。满射:指陪域等于值域的函数。即:对陪域中任意元素,都存在至少一个定义域中的元素与之对应。双射(

    2022年5月28日
    44
  • C语言 爱心代码(颜色可改)

    C语言 爱心代码(颜色可改)代码 include stdio h include windows h include tchar h intmain system color2 这里修改颜色码 doublex y a for y 1 5 y gt 1 5 y 0 1214 for x 1 5 x lt 1 5 x 0 05 a x x y y 1 tchar h windows h stdio h

    2026年1月20日
    2
  • c++容器(vector、list、deque)

    vector,deque 和 list顺序性容器:向量 vector :是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数

    2021年12月22日
    58
  • windows系统下实现nlb集群负载均衡

    windows系统下实现nlb集群负载均衡负载均衡解决的问题 1 提高可用性这里面的可用性主要是从 WEB 服务器 的角度来讲的 如果说我们只有一台 Web 服务器 而它遇到了某种未知的错误导致 IIS 无法启动 那么我们的网站就无法访问了 这就是一种比较低的可用性 那么利用负载均衡 放在我们 Web 服务器的前面 由它来收集所有的请求 然后转发给我们的 Web 服务器 这时候我们就可以添加两台 Web 服务器 如果其中有一台坏了 至少还有另一台在工

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号