点云边缘或者说点云边界提取是点云处理过程中经常需要用到的方法。目前,常用的点云边缘提取的方法有凹包检测、基于法向和曲率的边缘提取、经纬线扫描法等。最终,还可能会涉及到使用提取的边界进行点云分割。
环境:
Windows11 + PCL 1.11.1
凹包检测是识别点云中凹多边形的过程,PCL中有集成的凹包检测算法。但是使用该方法需要注意的是,如果是多线程运行的软件或者算法,并且在每一个线程中都需要使用凹包检测。那么可能会存在问题。因为凹包检测需要单线程运行,这可能是与其内部实现方式有关系,通过加锁就可以解决掉凹包检测引起的程序崩溃问题。
代码:
可以使用OpenMP加锁,比较常用的是critical语句。
一般alpha都设定为0.5,如果点云比较稀疏,则需要适当增大这个数值。
凸包检测与其说是提取轮廓,其实不如说是提取点云凸多边形的顶点。还可以得到凸多边形的面积大小,一般来说都会设定为2维,如果是三维,那么还可以计算得到凸多变体的体积。总的来说,使用凸包检测是很难得到一个稠密整齐的轮廓点云的,而是得到顶点。
凹包检测点云分割
与凹包检测或者凸包检测可以配合使用的是crophull,使用该方法可以利用凹包检测或者凸包得到的轮廓点云cloudout和polygons对其他点云进行分割。使用这种方法去分割点云只适用于点云数量不大,点云数量越大,速度越慢。
代码如下:
从这篇帖子看到了通过经纬线扫描法这种轮廓提取方法,这个方法特别适用于使用线扫相机得到的点云。而且只是遍历了点云两遍,速度还比较快。但是如果得到的点云使用体素滤波进行稀疏的话,通常稀疏点云是错乱的,即排列不整齐,在x和y方向上。这种稀释后的点云使用经纬线扫描法得到的轮廓通常也不是一个干净整齐的轮廓。此外,还存在一个问题,如果点云空间外面漂浮了一些噪点,那么这些点可能会被扫描成轮廓。所以就需要扫描前对原始点云进行去噪,也可以扫描之后对轮廓点云进行去噪。但是如果噪点较多,很可能导致得到的轮廓去噪后产生缺口,轮廓不闭合。所以到底是轮廓提取前去噪还是提取之后去噪需要根据点云质量而定。
代码:
PCL中封装有基于法向的轮廓提取算法,直接称之为轮廓提取。
代码如下: