【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

前面我们写了平面分割(https://blog.csdn.net/feixiaoxing/article/details/123388791?spm=1001.2014.3001.5501)、圆柱分割(https://blog.csdn.net/feixiaoxing/article/details/123389321?spm=1001.2014.3001.5501)这两篇文章。细心的同学可能发现,这里面都提到了ransac,那什么是ransac呢?

所谓ransac,全称是random sample consensus,也就是随机采样一致性。名字听上去有点拗口,不妨举个例子来解释。假设一堆点云数据,我们怎么从中找到平面呢?一个简单的方法就是猜?随机找到几个点,算出一个平面,然后计算每个点距离这个平面的距离。继续撒点,如果发现新的点比原来的好,也就是其他点距离平面距离更小,那么更新老的点;否则继续寻找。这个里面,其实做了两个假设,一个假设是我们撒的点正好就在平面上,一个假设是只要样本多,总能找到合适的点。

网上有一些说明这个原理的文章,部分还提供了代码,比如这一篇,https://zhuanlan.zhihu.com/p/62238520,读起来很是不错。

1、原来的代码有几处bug,修复了一下,

1.1 i和iters的比较修改为while i < iters:

1.2 添加i  += 1

1.3 修正sigma=3,主要是为了提高运行速度,不用等太久

1.4 添加try-except,防止出现除0异常

1.5 添加UTF-8,不然中文过不了

2、修改后的代码如下所示,

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import random
import math# 数据量。
SIZE = 50
# 产生数据。np.linspace 返回一个一维数组,SIZE指定数组长度。
# 数组最小值是0,最大值是10。所有元素间隔相等。
X = np.linspace(0, 10, SIZE)
Y = 3 * X + 10fig = plt.figure()
# 画图区域分成1行1列。选择第一块区域。
ax1 = fig.add_subplot(1,1, 1)
# 标题
ax1.set_title("RANSAC")# 让散点图的数据更加随机并且添加一些噪声。
random_x = []
random_y = []
# 添加直线随机噪声
for i in range(SIZE):random_x.append(X[i] + random.uniform(-0.5, 0.5)) random_y.append(Y[i] + random.uniform(-0.5, 0.5))
# 添加随机噪声
for i in range(SIZE):random_x.append(random.uniform(0,10))random_y.append(random.uniform(10,40))
RANDOM_X = np.array(random_x) # 散点图的横轴。
RANDOM_Y = np.array(random_y) # 散点图的纵轴。# 画散点图。
ax1.scatter(RANDOM_X, RANDOM_Y)
# 横轴名称。
ax1.set_xlabel("x")
# 纵轴名称。
ax1.set_ylabel("y")# 使用RANSAC算法估算模型
# 迭代最大次数,每次得到更好的估计会优化iters的数值
iters = 100000
# 数据和模型之间可接受的差值
sigma = 3
# 最好模型的参数估计和内点数目
best_a = 0
best_b = 0
pretotal = 0
# 希望的得到正确模型的概率
P = 0.99
i = 0
while i < iters:# i += 1i += 1# 随机在数据中红选出两个点去求解模型sample_index = random.sample(range(SIZE * 2),2)x_1 = RANDOM_X[sample_index[0]]x_2 = RANDOM_X[sample_index[1]]y_1 = RANDOM_Y[sample_index[0]]y_2 = RANDOM_Y[sample_index[1]]# y = ax + b 求解出a,ba = (y_2 - y_1) / (x_2 - x_1)b = y_1 - a * x_1# 算出内点数目total_inlier = 0for index in range(SIZE * 2):y_estimate = a * RANDOM_X[index] + bif abs(y_estimate - RANDOM_Y[index]) < sigma:total_inlier = total_inlier + 1# 判断当前的模型是否比之前估算的模型好if total_inlier > pretotal:try:iters = math.log(1 - P) / math.log(1 - pow(total_inlier / (SIZE * 2), 2))except ZeroDivisionError:passpretotal = total_inlierbest_a = abest_b = b# 判断是否当前模型已经符合超过一半的点if total_inlier > SIZE:break# 用我们得到的最佳估计画图
Y = best_a * RANDOM_X + best_b# 直线图
ax1.plot(RANDOM_X, Y)
text = "best_a = " + str(best_a) + "\nbest_b = " + str(best_b)
plt.text(5,10, text,fontdict={'size': 8, 'color': 'r'})
plt.show()

3、实际效果

代码没有修改之前,可能会出现除0错误,而且执行时间很长,有差不多10几秒钟,修改后可以短时间快速出结果。

4、最有意思的更新

    # 判断当前的模型是否比之前估算的模型好if total_inlier > pretotal:try:iters = math.log(1 - P) / math.log(1 - pow(total_inlier / (SIZE * 2), 2))except ZeroDivisionError:passpretotal = total_inlierbest_a = abest_b = b

对iters的重新计算是最有意思的,实际效果也许有限。注意虽然SIZE是50,但是实际random_x、random_y的大小是100,所以这里乘以2。此外后面一个2,代表每次只需取两个点即可,所以N=2。其他部分和k=log(1-P)/log(1-t的N次方)这个公式是完全匹配的。

3d激光雷达开发(ransac的思想)相关推荐

  1. 3d激光雷达开发(入门)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 大约在2017年的时候,学习百度的apollo系统的时候,就知道3d激光雷达了.3d激光雷达和普 ...

  2. 3d激光雷达开发(pcl安装和使用)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 之前讨论过,目前3d激光雷达这块,算法部分用的最多的就是pcl库.网上很多教程都是讲pcl在li ...

  3. 3d激光雷达开发(从halcon看点云pcl库)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 做点云开发的,很少有不知道pcl库的,这一点就有点像做数字图像处理的,很少有不知道opencv的 ...

  4. 3d激光雷达开发(多雷达标定)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 有过camera开发经验的朋友都知道,camera有两种标定.一种是内参标定,主要是标定切向畸变 ...

  5. 3d激光雷达开发(平面映射)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 3d点云当中,一个经常用到的方法就是先找到一个平面,然后将点映射到平面上面.这个里面用到的数据结 ...

  6. 3d激光雷达开发(圆柱分割)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 和平面分割一样,pcl也支持圆柱分割.使用的方法和平面分割也差不多,都是基于ransac的基本原 ...

  7. 3d激光雷达开发(ndt匹配)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 除了icp匹配之外,ndt匹配也是使用比较多的一种方法.相比较icp而言,ndt匹配花的时间要少 ...

  8. 3d激光雷达开发(icp匹配)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 所谓匹配,其实就是看两个点云数据里面,哪些关键点是一样的.这样就可以把一个点云移动到另外合适的位 ...

  9. 3d激光雷达开发(法向量预测)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 法向量在3d点云当中扮演很重要的一个角色.一个三维数据点的特征,不仅和它自己有关,还和它周围的点 ...

最新文章

  1. springmvc+mybatis+html 下将查询数据以excell形式上传到ftp(下)
  2. c语言重定义不同的基类型_简述usb连接器输出类型定义和不同环境下的用法
  3. 使用python 提取html文件中的特定数据
  4. Linux vi 中移动光标 命令
  5. 银行推出一年存1万连着存5年,利率4.5%,能存吗?
  6. linux查看mysql表空间使用率_Oracle查看数据库表空间使用情况sql语句
  7. BI报表设计 AJ-Report
  8. 牛顿插值 | MATLAB源码
  9. linux skyeye,移植LINUX到SKYEYE上
  10. 计算机毕业设计(附源码)python学生社团管理
  11. DataX数据交换,starrockswriter异常解决
  12. C++-STL--吐泡泡
  13. fcpx插件:stupid raisins info pop for mac(27个信息和描述标题栏)
  14. 函数 函数的基本使用 函数的四种基本形式 可选参数 函数默认参数 函数的剩余参数 构造函数() 函数重(chong)载
  15. 【R语言(一)】R 和 RStudio的安装与初步使用
  16. Win7重新受到用户追捧,竟然因为勒索病毒!
  17. 实时数据库:一夜之间,我感受到了时序数据库的威胁
  18. 【无标题】公司间销售利润中心替代
  19. 深度学习 大数据集处理_大规模深度学习数据集管理系统
  20. LinkedIn架构这十年

热门文章

  1. python--集合概念和实战(一)
  2. 后台取值页面显示——Vue.js
  3. 如何自定义容器网络?- 每天5分钟玩转 Docker 容器技术(33)
  4. MongoDB学习系列9:MongoDB里的若干规则
  5. 用openswan 2.4.7构建ipsec ×××笔记
  6. 求职招聘系统中的观察者模式的应用和分析
  7. C语言中指针和数组的区别
  8. Oracle中 char varchar varchar2的区别
  9. mysql更换主键遇到的一个问题
  10. python_程序格式_缩进_行注释_段注释---python工作笔记012