三维点云学习(4)6-ransac 地面分割

ransac课堂笔记
git大神参考代码
ransac代码主要参考如下知乎大佬的ransac的线性拟合
ransac的线性拟合
使用ransac进行地面分割的原因:
ransac模型的拟合的取决于物体的密度分布,在三维场景较为适合

ransac地面分割效果图

原点云图:



分割出的地面:
eg:因为ransac是个人复现,所以效果不是很理想,ransac具有随机性,所以每次运行的结果不尽相同



红色为分割地面后的点云,蓝色为分割出的地面


ransac代码块:

# 功能:从点云文件中滤除地面点
# 输入:
#     data: 一帧完整点云
# 输出:
#     segmengted_cloud: 删除地面点之后的点云
def ground_segmentation(data):# 作业1# 屏蔽开始#初始化数据idx_segmented = []segmented_cloud = []iters = 100   #最大迭代次数  000002.bin:10sigma = 0.4     #数据和模型之间可接受的最大差值   000002.bin:0.5   000001.bin: 0.2  000000.bin: 0.15  002979.bin:0.15  004443.bin:0.4##最好模型的参数估计和内点数目,平面表达方程为   aX + bY + cZ +D= 0best_a = 0best_b = 0best_c = 0best_d = 0pretotal = 0 #上一次inline的点数#希望的到正确模型的概率P = 0.99n = len(data)    #点的数目outline_ratio = 0.6   #e :outline_ratio   000002.bin:0.6    000001.bin: 0.5  000000.bin: 0.6   002979.bin:0.6for i in range(iters):ground_cloud = []idx_ground = []#step1 选择可以估计出模型的最小数据集,对于平面拟合来说,就是三个点sample_index = random.sample(range(n),3)    #重数据集中随机选取3个点point1 = data[sample_index[0]]point2 = data[sample_index[1]]point3 = data[sample_index[2]]#step2 求解模型##先求解法向量point1_2 = (point1-point2)      #向量 poin1 -> point2point1_3 = (point1-point3)      #向量 poin1 -> point3N = np.cross(point1_3,point1_2)            #向量叉乘求解 平面法向量##slove model 求解模型的a,b,c,da = N[0]b = N[1]c = N[2]d = -N.dot(point1)#step3 将所有数据带入模型,计算出“内点”的数目;(累加在一定误差范围内的适合当前迭代推出模型的数据)total_inlier = 0pointn_1 = (data - point1)    #sample(三点)外的点 与 sample内的三点其中一点 所构成的向量distance = abs(pointn_1.dot(N))/ np.linalg.norm(N)     #求距离##使用距离判断inlineidx_ground = (distance <= sigma)total_inlier = np.sum(idx_ground == True)    #统计inline得点数##判断当前的模型是否比之前估算的模型if total_inlier > pretotal:                                           #     log(1 - p)iters = math.log(1 - P) / math.log(1 - pow(total_inlier / n, 3))  #N = ------------pretotal = total_inlier                                               #log(1-[(1-e)**s])#获取最好得 abcd 模型参数best_a = abest_b = bbest_c = cbest_d = d# 判断是否当前模型已经符合超过 inline_ratioif total_inlier > n*(1-outline_ratio):breakprint("iters = %f" %iters)#提取分割后得点idx_segmented = np.logical_not(idx_ground)ground_cloud = data[idx_ground]segmented_cloud = data[idx_segmented]return ground_cloud,segmented_cloud

完整代码:

#clustering.py
# 文件功能:
#     1. 从数据集中加载点云数据
#     2. 从点云数据中滤除地面点云
#     3. 从剩余的点云中提取聚类import numpy as np
import open3d as o3d
import struct
import matplotlib.pyplot as plt
from pandas import DataFrame
from pyntcloud import PyntCloud
import math
import random
import Spectral as sp
from collections import defaultdict# 功能:从kitti的.bin格式点云文件中读取点云
# 输入:
#     path: 文件路径
# 输出:
#     点云数组
def read_velodyne_bin(path):''':param path::return: homography matrix of the point cloud, N*3'''pc_list = []with open(path, 'rb') as f:content = f.read()pc_iter = struct.iter_unpack('ffff', content)for idx, point in enumerate(pc_iter):pc_list.append([point[0], point[1], point[2]])return np.asarray(pc_list, dtype=np.float32)# 功能:从点云文件中滤除地面点
# 输入:
#     data: 一帧完整点云
# 输出:
#     segmengted_cloud: 删除地面点之后的点云
def ground_segmentation(data):# 作业1# 屏蔽开始#初始化数据idx_segmented = []segmented_cloud = []iters = 100   #最大迭代次数  000002.bin:10sigma = 0.4     #数据和模型之间可接受的最大差值   000002.bin:0.5   000001.bin: 0.2  000000.bin: 0.15  002979.bin:0.15  004443.bin:0.4##最好模型的参数估计和内点数目,平面表达方程为   aX + bY + cZ +D= 0best_a = 0best_b = 0best_c = 0best_d = 0pretotal = 0 #上一次inline的点数#希望的到正确模型的概率P = 0.99n = len(data)    #点的数目outline_ratio = 0.6   #e :outline_ratio   000002.bin:0.6    000001.bin: 0.5  000000.bin: 0.6   002979.bin:0.6for i in range(iters):ground_cloud = []idx_ground = []#step1 选择可以估计出模型的最小数据集,对于平面拟合来说,就是三个点sample_index = random.sample(range(n),3)    #重数据集中随机选取3个点point1 = data[sample_index[0]]point2 = data[sample_index[1]]point3 = data[sample_index[2]]#step2 求解模型##先求解法向量point1_2 = (point1-point2)      #向量 poin1 -> point2point1_3 = (point1-point3)      #向量 poin1 -> point3N = np.cross(point1_3,point1_2)            #向量叉乘求解 平面法向量##slove model 求解模型的a,b,c,da = N[0]b = N[1]c = N[2]d = -N.dot(point1)#step3 将所有数据带入模型,计算出“内点”的数目;(累加在一定误差范围内的适合当前迭代推出模型的数据)total_inlier = 0pointn_1 = (data - point1)    #sample(三点)外的点 与 sample内的三点其中一点 所构成的向量distance = abs(pointn_1.dot(N))/ np.linalg.norm(N)     #求距离##使用距离判断inlineidx_ground = (distance <= sigma)total_inlier = np.sum(idx_ground == True)    #统计inline得点数##判断当前的模型是否比之前估算的模型if total_inlier > pretotal:                                           #     log(1 - p)iters = math.log(1 - P) / math.log(1 - pow(total_inlier / n, 3))  #N = ------------pretotal = total_inlier                                               #log(1-[(1-e)**s])#获取最好得 abcd 模型参数best_a = abest_b = bbest_c = cbest_d = d# 判断是否当前模型已经符合超过 inline_ratioif total_inlier > n*(1-outline_ratio):breakprint("iters = %f" %iters)#提取分割后得点idx_segmented = np.logical_not(idx_ground)ground_cloud = data[idx_ground]segmented_cloud = data[idx_segmented]return ground_cloud,segmented_cloud# 屏蔽结束# print('origin data points num:', data.shape[0])# print('segmented data points num:', segmengted_cloud.shape[0])# return segmengted_clouddef main():iteration_num = 1    #文件数# for i in range(iteration_num):filename = 'data/004443.bin'         #数据集路径print('clustering pointcloud file:', filename)origin_points = read_velodyne_bin(filename)   #读取数据点origin_points_df = DataFrame(origin_points,columns=['x', 'y', 'z'])  # 选取每一列 的 第0个元素到第二个元素   [0,3)point_cloud_pynt = PyntCloud(origin_points_df)  # 将points的数据 存到结构体中point_cloud_o3d = point_cloud_pynt.to_instance("open3d", mesh=False)  # 实例化#o3d.visualization.draw_geometries([point_cloud_o3d]) # 显示原始点云# 地面分割ground_points, segmented_points = ground_segmentation(data=origin_points)ground_points_df = DataFrame(ground_points, columns=['x', 'y', 'z'])  # 选取每一列 的 第0个元素到第二个元素   [0,3)point_cloud_pynt_ground = PyntCloud(ground_points_df)  # 将points的数据 存到结构体中point_cloud_o3d_ground = point_cloud_pynt_ground.to_instance("open3d", mesh=False)  # 实例化point_cloud_o3d_ground.paint_uniform_color([0, 0, 255])#显示segmentd_points示地面点云segmented_points_df = DataFrame(segmented_points, columns=['x', 'y', 'z'])  # 选取每一列 的 第0个元素到第二个元素   [0,3)point_cloud_pynt_segmented = PyntCloud(segmented_points_df)  # 将points的数据 存到结构体中point_cloud_o3d_segmented = point_cloud_pynt_segmented.to_instance("open3d", mesh=False)  # 实例化point_cloud_o3d_segmented.paint_uniform_color([255, 0, 0])o3d.visualization.draw_geometries([point_cloud_o3d_ground,point_cloud_o3d_segmented])if __name__ == '__main__':main()

三维点云学习(4)6-ransac 地面分割相关推荐

  1. 三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较

    三维点云学习(4)7-ransac 地面分割+ DBSCAN聚类比较 回顾: 实现ransac地面分割 DBSCNA python 复现-1- 距离矩阵法 DBSCNA python 复现-2-kd- ...

  2. 三维点云学习(9)5-实现RANSAC Registration配准

    三维点云学习(9)5-实现RANSAC Registration配准 参考博客: 机器视觉之 ICP算法和RANSAC算法 三维点云配准 ICP点云配准原理及优化 本章因个人能力有限,大部分代码摘自g ...

  3. 三维点云学习(4)5-ransac

    三维点云学习(4)5-ransac ransac算法理解 RANSAC 线性拟合代码 ransac 在三维点云的处理中,霍夫变换的处理一般在参数为两个或者三个,选择ransac处理点云构建多参数模型较 ...

  4. 三维点云学习(5)5-实现Deeplearning-PointNet-2-classfication

    三维点云学习(5)5-实现Deeplearning-PointNet-2-classfication Github PointNet源码 数据集下载:为40种物体的三维点云数据集 提取码:es14 运 ...

  5. 三维点云学习(5)4-实现Deeplearning-PointNet-1-数据集的批量读取

    三维点云学习(5)4-实现Deeplearning-PointNet-1-数据集的批量读取 Github PointNet源码 数据集下载:为40种物体的三维点云数据集 提取码:es14 因为本人初次 ...

  6. 三维点云学习(5)3-Deep learning for Point Cloud-PointNet++

    三维点云学习(5)3-Deep learning for Point Cloud-PointNet++ 强烈推荐 PointNet的深刻理解 PointNet++示意图 可分为 Encoder. Se ...

  7. 三维点云学习(5)2-Deep learning for Point Cloud-PointNet

    三维点云学习(5)2-Deep learning for Point Cloud 强烈推荐 PointNet的深刻理解 三种使用深度学习处理三维点云的方法 VoxNet 问题: 现实自动驾驶场景中,v ...

  8. 三维点云学习(5)1-introduction on to Deep learning

    三维点云学习(5)1-introduction on to Deep learning 人工智能.机器学习.深度学习 深度学习概述 预测房价例子: 计算Wt未知参数 梯度下降法 Gradient De ...

  9. 三维点云学习(4)4-Hough Transform

    三维点云学习(4)4-Hough Transform 霍夫变换的理论通俗理解 Hough Tansform 霍夫变换 核心思想: a.原始空间中得点->参数空间中的线 b.原始空间得线-> ...

最新文章

  1. 平头哥玄铁处理器Linux新版本,5大亮点速览
  2. 一个简单自激振荡器电路分析
  3. 浏览器渲染机制面试_浏览器渲染原理
  4. PSSM特征-从生成到处理
  5. 笔记-高项案例题-2016年上-整体管理+风险管理
  6. wordpress相关插件及应用模板
  7. 页面布局_word页面布局
  8. 中国最神秘的一所大学,它只存在过8年,却成了永远的第一
  9. hadoop重命名文件_Hadoop -- 3. 从Flume到HDFS
  10. 四川省中职计算机考试题,四川省计算机等级考试模拟试题(一级)
  11. (二)pscc学习笔记
  12. Python 批量生成中文姓名(百家姓)
  13. 到底什么才是自动化巡检?
  14. 电磁波中的波段划分:L波段、S波段、C波段、X波段、Ku波段、K波段、Ka波段 等等
  15. upc 兔子与兔子(字符串Hash)
  16. 立而不破,华为云注解政企智能升级的“道与术”
  17. 代码覆盖率和功能覆盖率
  18. 详解C++学习方向和就业方向!
  19. 無間道III 終極無間
  20. C++相关问题笔记(一)

热门文章

  1. 解决问题 “You don‘t have permission to access /index.html on this server.”
  2. Java后台解决跨域问题
  3. SSH密钥 - 仍然要求输入密码和密码
  4. 在文件中查找和替换,覆盖文件不起作用,它清空了文件
  5. java mvc .net mvc_.NET MVC 和 JAVA MVC有什么区别?
  6. 在java中通过过键盘输入_java中从键盘输入
  7. 每个叶子节点(nil)是黑色。_填充每个节点的下一个右侧节点指针
  8. python服务端编程_Python实现的简单文件传输服务器和客户端
  9. css3 复合选择器,CSS复合选择器
  10. L1-034 点赞 (20 分)