最小二乘法拟合直线簇交点及Ransac拟合

  • 最小二乘法的实现
  • Ransac优化

语言环境:Python
直线簇方程: y=p→+v→∗ty=\overrightarrow p+\overrightarrow v*ty=p​+v∗t
其中 p→\overrightarrow pp​表示直线上一点P的坐标
原理参考 Line–line intersection及 Stack Overflow.

最小二乘法的实现

根据参考链接中的原理给出如下公式:

xxx为拟合结果。
代码如下:

import numpy as np
import mathdef Intersection(LineD, PList):l = len(LineD)I = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])q = np.array([0, 0, 0])Msum = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])for j in range(0,l):Lnormal = np.array([-LineD[l]/np.linalg.norm(LineD[l])])p = PList[l][:3]viviT = Lnormal*Lnormal.TM = I - viviTMsum = Msum + Mq = q + np.dot(M,p)q = q.Tlp = np.linalg.lstsq(Msum, q, rcond=None)[0]return lp

其中,输入的LineD为直线方向的List,格式为:[[x1,y1,z1], [x2,y2,z2],....]P为直线上一点的坐标,格式与LineD相同。输出的lp为三维坐标。

Ransac优化

Ransac原理见链接。
主要实现步骤有:

  • 随机抽取num条直线
  • 最小二乘法算该组直线交点
  • 计算距离交点在阈值t以内的直线个数count
  • 重复抽取计算步骤n次,并选择所有结果中count最大时的交点并返回
  • 为了使结果鲁棒,对所得结果内符合阈值条件内的直线再次计算交点,并与原结果比较,直到结果不再变化为止

代码如下:

import numpy as np
import math
import randomdef RansacIntersection(LineD, PList, n, num, t):# LineD is the list of Light Direction# PList is the list of P position# n : times of sampling# num: number of lines during a sampling# t: threshold of distance to examine the number of lines around the point (unit: mm)l = len(LineD)I = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]])maxlines = 0reallp = []for i in range(0,n):#   pick up num line randomly#   calculate the intersection point#   calculate the distance between the point and lines#   count the number of lines around the pointq = np.array([0, 0, 0])Msum = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])flag = random.sample(range(l), num)for j in range(0,num):flagj = flag[j]Lnormal = np.array([-LineD[flagj]/np.linalg.norm(LineD[flagj])])p = PList[flagj][:3]viviT = Lnormal*Lnormal.TM = I - viviTMsum = Msum + Mq = q + np.dot(M,p)q = q.Tlp = np.linalg.lstsq(Msum, q, rcond=None)[0]count = 0for j in range(0, l):Lnormal = np.array(-LineD[j] / np.linalg.norm(LineD[j]))p = PList[j][:3]P2L = np.array(lp - p)d = np.sqrt(1-(np.dot(Lnormal, P2L)/np.linalg.norm(P2L))**2)*np.linalg.norm(P2L)# print 1-(np.dot(Lnormal, P2L)/np.linalg.norm(P2L))**2# print dif d < t:count = count + 1# print count# print "****"if count > maxlines:maxlines = countreallp = lplp0 = [[],[],[]]lp = reallp# print lp# print lp[0], lp[1], lp[2]while (not((lp0[0] == lp[0]) and (lp0[1] == lp[1]) and (lp0[2] == lp[2]))):count = 0# print "@@@@@@"q = np.array([0, 0, 0])Msum = np.array([[0, 0, 0], [0, 0, 0], [0, 0, 0]])for j in range(0, l):Lnormal = np.array(-LineD[j] / np.linalg.norm(LineD[j]))p = PList[j][:3]P2L = np.array(lp - p)d = np.sqrt(1 - (np.dot(Lnormal, P2L) / np.linalg.norm(P2L)) ** 2) * np.linalg.norm(P2L)if d < t:# print "****"count = count+1Lnormal = np.array([-LineD[j] / np.linalg.norm(LineD[j])])p = PList[j][:3]viviT = Lnormal * Lnormal.TM = I - viviTMsum = Msum + Mq = q + np.dot(M, p)q = q.Tlp0 = lplp = np.linalg.lstsq(Msum, q, rcond=None)[0]# print lpreallp = lpprint (count)# print "%%%%%"return reallp

第一次发博,不足之处请多多指教,如有问题欢迎讨论。

(转载请标明出处)

最小二乘法拟合直线簇交点及Ransac拟合相关推荐

  1. ransac 直线拟合 matlab,ransac拟合直线和平面(matlab版本)

    参考资料: 主要思想: 迭代100次,找出内点内点最多的参数模型. 修改的问题: 原作者ransac拟合直线的参数以及ransac拟合平面的参数我认为有误,在这个基础上进行了修正. 1 ransac拟 ...

  2. RANSAC拟合直线

    1.原理介绍 2.实现过程 3.和最小二乘的比较及其优缺点 1.原理介绍 RANSAC是"RANdom SAmple Consensus(随机抽样一致)"的缩写.它可以从一组包含& ...

  3. Pytorch拟合直线方法

    这里写自定义目录标题 学习记录 使用torch拟合直线 一些分析 loss.backward()的用法 为什么每个epoch都要有梯度置零 参数更新分析 需不需要使用`with torch.no_gr ...

  4. 【自动驾驶】车道线拟合算法---最小二乘法拟合直线

    概览 关于自动驾驶车道线拟合算法,常用的方法有B样条.三次样条插值.Ransac.最小二乘法等等. 但是针对于高精度地图的车道线拟合,由于车道线坐标点已知,所以不需要有控制点进行约束,那么B样条.贝塞 ...

  5. C++:最小二乘法拟合直线

     原理: 代码: #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp>using names ...

  6. Python实现最小二乘法拟合直线(求斜率截距)

    利用最小二乘法拟合直线,实现了对一系列点拟合出其最接近的直线,并给出公式,包括斜率和截距.并且绘制出最终拟合线. 完整代码如下: # 核心代码,求斜率w,截距b def fit(data_x, dat ...

  7. 最小二乘法拟合直线 C++/OpenCV

    问题: 我们在拥有一系列散列的点(x1,y1),(x2,y2)... (xm,ym),这些点在一条直线附近,通过点拟合直线. 我在工程中是要拟合一系列线段,其实一条线段就对应着两个要拟合的点,算法上稍 ...

  8. python最小二乘法拟合直线

    最小二乘法的推导可参考下面这个博客,推导非常详细. https://my.oschina.net/keyven/blog/526010 首先画一个加入了噪声的散点图,函数是y=0.2x,加入噪声后如下 ...

  9. opencv学习——最小二乘法拟合直线

    最小二乘法拟合直线 概念:最小二乘法多项式直线拟合,根据给定的点,求出它的函数y=f(x),当然求得准确的函数是不太可能的,但是我们能求出它的近似曲线y=φ(x) 原理 假设有点  , I = 1,2 ...

最新文章

  1. 三维视觉惯性SLAM的有效Schmidt-EKF
  2. c语言自动生成版本号,单片机C程序自动产生并增加版本号
  3. github--新手使用错误分析
  4. 构建高性能.NET应用之配置高可用IIS服务器-第四篇 IIS常见问题之:工作进程回收机制(上)
  5. 华为配备鸿蒙系统的手机,华为P50/新平板双双来袭!全球首发鸿蒙系统:配置都非常强悍...
  6. 指定的参数已超出有效值的范围_整流二极管的特性和重要参数
  7. HTTP - PUT 上传文件/Shell
  8. myeclipse部署ssh项目工程
  9. [转]Oracle中字符集的类型决定varchar2的字符长度
  10. Keil(MDK-ARM-STM32)系列教程(五)Configuration(Ⅰ)
  11. noip2017颓废记
  12. 帆软日期参数联动方法
  13. WPS Excel快捷键
  14. 如此优秀的JS轮播图,写完老师都沉默了
  15. windows通过资源管理器访问服务器(samba服务),您需要权限来执行此操作
  16. 【深度学习TPU+Keras+Tensorflow+EfficientNetB7】kaggle竞赛 使用TPU对104种花朵进行分类 第十八次尝试 99.9%准确率
  17. 2021CCPC上海省赛题解ABCDEGHIJK
  18. android悬浮窗跑马灯,边缘闪光跑马灯
  19. C6678+K7+AD9253/AD9783 8路AD高速信号处理板
  20. 教你去掉图片上的文字

热门文章

  1. DPI 英寸 厘米 毫米
  2. 拓扑排序和关键路径的图形化显示
  3. 【翻译】Nova过滤调度器
  4. HTML5+jSignature插件手写签名生成图片并转换成文件流实现功能
  5. 西安理工大学-计算机学院-863电子信息-各年份真题
  6. Ajax技术WEB开发__WEB2.0中AJAX应用的详解
  7. Python解线性方程组:列主元Gauss消元法
  8. OpenCV 中用cv::IMREAD_GRAYSCALE与cv::cvtColor转灰度得到灰度图不一致问题
  9. 某班期末考试科目为数学(MT)、英语(EN)和物理(PH),有最多不超过40人参加考试。请编程计算:(1)每个学生的总分和平均分;(2)每门课程的总分和平均分。
  10. html中加艺术字体,CSS实现漂亮的大标题文字效果