无人驾驶中的激光雷达(一)基于深度图的点云聚类方法

基于深度图的点云聚类方法

本篇博文主要讲述一种基于深度图的点云聚类方法。
基于深度图的点云聚类方法最早且被应用最多的文章是 Bogoslavskyi等人提出的"Fast range image-based segmentation of sparse 3D laser scans for online operation" 2016 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS).

这里主要是基于这篇文章采用的点云聚类思想,对一些细节进行了更改并添加了一些其他东西来改善聚类效果,先放代码链接和效果:

https://github.com/wangx1996/LIDAR-Segmentation-Based-on-Range-Image

在这里插入图片描述
在这里插入图片描述

1.扫描线补偿

激光雷达的基本原理就是利用传感器发射的激光束反射的时间差来实现对周围物体的精准测距,但激光有可能打在某些反射率较低的物体时,激光束无法返回传感器,就造成该扫描线在那一时刻变成无效值,从整体点云看就是有该物体有部分点云缺失,比较典型的情况就是激光打在玻璃上或是打在黑色车辆上。

如图所示,测试车辆左侧的黑色车辆就造成了点云缺失:

在这里插入图片描述
这种情况会造成一个物体在聚类时会被分成多个小物体,因此为了改善这种情况需要对这些缺失的点进行补偿。

这里参考文章 Fast Multi-Pass 3D Point Segmentation Based on a Structured Mesh Graph for Ground Vehicles," 2018 IEEE Intelligent Vehicles Symposium (IV)中的做法:

遍历每一次激光器发射的点云数据,也就是一次发射的数据,当两个有数据的点之间有一定数量的缺失点并且这两个点的距离满足一定的阈值,就可以假设这两个点之间的点近似为线性关系,通过线性插值的方式补全点云。

补全后的效果蓝色的点为补全后的点,可以看见车辆上原本有大量的缺失点都被补全了:
在这里插入图片描述

2.地面点移除

参考这篇文章:Fast segmentation of 3D point clouds: A paradigm on LiDAR data for autonomous vehicle applications," 2017 IEEE International Conference on Robotics and Automation (ICRA)

具体有https://adamshan.blog.csdn.net/article/details/84569000讲过,可以看一下

效果如图:
在这里插入图片描述

3.深度图生成

深度图指的是将点云的数据转为平面数据形式进行显示,每个像素可以存储该点的距离、intensity等值,这种形式与kdtree或者octree不同的是,深度图有利于快速查找得到某一点的相邻点,并且这些点是具有一定顺序关系的,而不是依靠距离度量来查找相邻点。

这里参考Curved-Voxel Clustering for Accurate Segmentation of 3D LiDAR Point Clouds with Real-Time Performance," 2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)

采用构建hash表的形式来代替一般的cv::Mat深度图形式, 哈希的键值则选择将图的像素按顺序拆解的值,比如一个图的高为 h h h,宽为 w w w,某一个点的像素坐标为 ( r o w , c o l ) (row,col) rowcol,那么按顺序拆解该图后,像素点的索引可以表示为:

i n d e x = r o w ∗ w + c o l index = row*w + col index=roww+col

最终构建的深度图如下所示:

在这里插入图片描述

4.邻域搜索与阈值设计

原有的论文里采用的是BFS的搜索方式来聚类某一个cluster,BFS在进行搜索的时候就需要额外的队列存储相邻元素,一定程度上运行时消耗较多内存,因此这里改做遍历图的形式,不需要再产生队列存储,对于每一个像素也是同样进行四邻域搜索进行阈值判断,但是这样做就无法一次性聚类完一个物体,因此会出现一个物体再聚类过程中出现多个cluster,但这些cluster在聚类的过程中会相互满足连通要求,这就需要对这些个cluster进行融合,因此需要类别冲突处理。

这里参考:A clustering method for efficient segmentation of 3D laser data," 2008 IEEE International Conference on Robotics and Automation, Pasadena, CA, 2008
具体可以看这篇论文是如何处理的。
在这里插入图片描述

对于阈值的设计,原论文中提到的一种启发式的阈值,对于垂直的墙或者一些两点间夹角较小的的物体无法很好地进行聚类,因此这里采用论文:
Line Extraction in 2D Range Images for Mobile Robotics. Journal of Intelligent and Robotic Systems 40, 267–297 (2004)
的方法。

该方法本用于2D激光雷达的断点判断,这里则用作判断3D雷达相邻两点是否为断点。

该阈值的示意图如下:在这里插入图片描述
其中: P n − 1 P_{n-1} Pn1为当前的中心点,判断周边的点是否与该点形成断点, λ \lambda λ为设定的阈值内容, Δ Φ \Delta\Phi ΔΦ为激光雷达的角度分辨率, r r r为该点的量测距离, D m a x D_{max} Dmax为最终阈值大小,具体的计算方式可以自己推一下,比较基本的几何知识。
最终计算公式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里 δ r \delta_r δr也是人工设定阈值

5.最终效果

在这里插入图片描述

6.代码链接

已经实现放在github上了:
https://github.com/wangx1996/LIDAR-Segmentation-Based-on-Range-Image

  • 18
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
### 回答1: Python二维点云聚类分析是一种利用Python编程语言对二维点云数据进行聚类的分析方法。 在这种分析,我们首先需要加载二维点云数据,可以使用Python的numpy库或pandas库来处理数据。这些数据通常包含了点的坐标信息,也可能包含其他的属性信息。 接下来,我们可以使用一种聚类算法,如K-means聚类、DBSCAN聚类或层次聚类等,来对二维点云进行聚类。例如,使用sklearn库的KMeans类可以很方便地实现K-means聚类算法。 在进行聚类分析之前,通常需要对数据进行预处理,如归一化、标准化或特征选择等,以便提高聚类算法的效果。可以使用sklearn库的preprocessing模块来完成这些预处理步骤。 聚类结果可以通过可视化工具(如matplotlib库)展示出来,以便更好地理解聚类效果。可以使用散点图或热图等方式展示点云数据的聚类结果。 在二维点云聚类分析聚类的目的是将点云数据分成若干个类簇,使得同一类簇内的点更加相似,而不同类簇之间的点尽可能地不相似。聚类算法的评估标准可以使用一些常用的指标,如轮廓系数、Calinski-Harabasz指数或Davies-Bouldin指数等,来评估聚类结果的好坏。 总之,Python二维点云聚类分析是一种强大的数据分析工具,在众多的应用领域都具有广泛的应用前景。通过Python,我们可以方便地实现各种聚类算法,并对聚类结果进行可视化和评估。 ### 回答2: 二维点云聚类分析是指在二维坐标系,对一组点的集合进行分类和分组的过程。Python是一种功能强大且广泛应用于数据分析和机器学习的编程语言,具有丰富的库和工具,适用于二维点云聚类分析。 在Python,可以使用scikit-learn库聚类算法进行二维点云聚类分析。首先,需要导入相关的库和数据集。例如,导入numpy库用于处理数值运算,导入matplotlib库用于数据可视化,导入sklearn库用于聚类算法和数据集加载。 接下来,可以使用sklearn聚类算法,如K-means算法、DBSCAN算法等对二维点云进行聚类。K-means算法是一种基于距离的算法,将数据集分为预先设定的K个簇。DBSCAN算法是一种基于密度的算法,根据每个点周围的密度将数据集分为簇。 在应用聚类算法之前,可以先对数据集进行预处理,如数据标准化、降维等。然后,使用聚类算法对数据集进行分组,并得到每个点所属的簇标签。 最后,可以通过数据可视化的方式将不同簇的点绘制在二维坐标系上,以便观察聚类效果和分析结果。 总结起来,Python提供了丰富的工具和库,可以帮助进行二维点云聚类分析。通过导入相关库,选择适当的聚类算法,对数据集进行预处理和分析,可以得到二维点云聚类结果,并进行可视化展示。 ### 回答3: Python是一种流行的编程语言,广泛应用于数据分析和科学计算领域。二维点云聚类分析是一种常见的数据聚类方法,用于将具有相似特征的数据点划分为不同的簇群。 在Python,可以使用一些库和算法来实现二维点云聚类分析。其,scikit-learn是一个功能强大的机器学习库,提供了丰富的聚类算法和工具。 首先,需要导入相应的库和模块,如numpy用于处理数值计算,matplotlib用于数据可视化,sklearn.cluster用于聚类算法。 接下来,将数据点表示为一个二维数组或矩阵,并根据需要进行数据预处理,如归一化或标准化。 然后,选择合适的聚类算法,如K-means、DBSCAN或层次聚类方法等。可以根据数据的特征和需求选择最适合的聚类算法,并设置相应的参数。 使用选定的聚类算法,可以使用fit方法对数据进行聚类。fit方法将数据拟合到选择的聚类模型聚类完成后,可以使用各种评估指标来评估聚类结果的质量,如轮廓系数或互信息。 最后,使用matplotlib库将聚类结果可视化。可以使用不同的颜色或符号来标记不同的聚类簇群,以便更好地理解和分析结果。 总的来说,Python提供了丰富的工具和库来进行二维点云聚类分析。通过选择适当的聚类算法和合适的参数,并结合数据预处理和结果评估,可以完成对二维点云数据的聚类分析,并获得有关数据结构和模式的有用信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值