简介

之前做直线拟合时,自己写了一个利用最小二乘做直线拟合的程序,但是由于直线检测的误差比较大,拟合的效果并不好。个人不知道是什么原因,因此想尝试更改一下直线拟合的算法,后来找到了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()介绍。

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.leastsqk, 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 = preturn y_ - (k * x + b)

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

OpenCV | 直线拟合fitline函数(Python)相关推荐

  1. OpenCV | 直线拟合fitline函数

    学习目标: 学习掌握OpenCV的fitline函数 学习内容: cv::fitLine()的具体调用形式如下: void cv::fitLine( cv::InputArray points, // ...

  2. 【OpenCV3】直线拟合--FitLine()函数详解

    一.FitLine()函数原型 CV_EXPORTS_W void fitLine( InputArray points, // 待输入点集(一般为二维数组或vector点集)OutputArray ...

  3. OpenCV—直线拟合fitLine

    本文的主要参考为官方文档OpenCV249-fitLine和博客-OpenCV 学习(直线拟合) 以及<Learning OpenCV 3>page425-426 OpenCV中提供的直线 ...

  4. 直线拟合fitLine函数的用法

    在霍夫检测直线的时候,一条直线会被检测出许多条,可以根据给定的点集拟合出一条直线的情形. void cv::fitLine(cv::InputArray points, // 二维点的数组或vecto ...

  5. OpenCV直线拟合检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 OpenCV直线拟合检测 霍夫直线检测 ...

  6. OpenCV 直线拟合及应用

    直线拟合顾名思义就是根据多个有限个数的点确定一条直线.依据为: 其中为第i个点到直线的距离,p(d)则为确定最小值的函数.而不同的p(d)对应着不同的直线拟合方法: OpenCV提供了7种(-1为用户 ...

  7. opencv直线拟合cv::fitLine()

    通过2D或者2D点集拟合直线 void fitLine( InputArray points, OutputArray line, int distType,double param, double ...

  8. RANSAC算法(附RANSAC直线拟合C++与Python版本)

    文章目录 RANSAC算法简介 RANSAC算法基本思想和流程 迭代次数推导 RANSAC与最小二乘区别 RANSAC直线拟合代码(C++及Python版本) C++版本代码 Python版本代码如下 ...

  9. opencv 直线拟合

    一.话说直线拟合 霍夫直线检测容易受到线段形状与噪声的干扰而失真,这个时候我们需要另辟蹊径,通过对图像进行二值分析,提取骨架,对骨架像素点拟合生成直线,这种做法在一些场景下非常有效,而且效果还比较好. ...

最新文章

  1. python编程有用吗-分享8点超级有用的Python编程建议
  2. 混合高斯模型(Mixtures of Gaussians)和EM算法
  3. apache 目录访问加密 简单
  4. 在Python中操纵json数据的最佳方式
  5. P3891-[GDOI2014]采集资源【背包,dp】
  6. 【贪心】蓝桥2019:最大降雨量
  7. C#之Bcd码时间转成ToDateTime
  8. 【hdu2588】求[1-n]中和n的gcd大于m的数的个数(求欧拉函数值)
  9. Linux卸载系统盘,Linux磁盘管理(创建、卸载、挂载磁盘)
  10. Java动态代理(dynamic proxy)
  11. Thread-Specific Storage Pattern
  12. 儿童节html模板,六一儿童节作文350字满分模板
  13. 广东省开展2022年省级制造业单项冠军企业(产品)培育遴选
  14. 什么是 SRS 呢?在我们大部分的音频播放器里都内欠有这种音效。
  15. OPNET win7安装
  16. Event Sourcing和CQRS实现
  17. 微信支付结算费率怎么降低至0.2~0.35操作方法
  18. 最新版本Hadoop面试题
  19. 最新python与SEO实战课程第2期项目实战(完整)
  20. 博客常见线条背景动效-JavaScript

热门文章

  1. BT网站关了,正版电影数字发行在线收费下载 的机会?
  2. 【linux 释放内存】linux释放内存骚操作
  3. 本题目要求读入2个整数A和B,然后输出它们的和
  4. python图片保存jpg、show变成bmp_Python 图片格式转换
  5. 计算机窗口弹出多个窗口,电脑怎么打开多个微信窗口
  6. 王者荣耀在android目录下的名字,王者荣耀名字空白代码怎么弄_名字空白代码设置方法...
  7. android开发面试题!微信小程序趋势及前景,社招面试心得
  8. python pandas csv 写文件_Pandas读写CSV文件的方法介绍(附代码)
  9. java-net-php-python-4java个人博客系统计算机毕业设计程序
  10. Faiss相似性搜索类库