PCL点云分割:Region Growing Segmentation

背景:

pcl官方教程:http://www.pointclouds.org/documentation/tutorials/region_growing_segmentation.php#region-growing-segmentation


1. 使用感受

这个算法适合分割规则的物体或者说四四方方的东西,像房屋轮廓,纸箱折叠的情景。如官方给的效果图:

PCL点云分割:Region Growing Segmentation_第1张图片

这个算法主要有4个参数来设置,我个人觉得算法还算是使用者友好的。主要要设置聚类点数上下界,蔓延时候搜索出来多少个附近点,面平滑阈值还有面的曲率阈值。


2. 算法细节

为了了解设置这些参数,让我们来了解一下如何内部细节。从官方的介绍里,算法的流程是写的很仔细的。为了让你更直观的明白,我概括的来说,就是从曲率小的面播种,从种子的位置出发,开始往四周搜索点,然后比对点于点之间的曲率和法线方向,如果差距小于阈值就视为同一个cluster。如果一个cluster无法再蔓延,在剩下的点云里再找曲率小的面播种,然后继续重复直到遍历完毕。


3. 调参

面平滑阈值(用于对比法线)还有面的曲率阈值(用于对比曲率)是最重要的参数。如果调大了,不仅仅是同一个平面,两个平面(它们的连着处弧度变化小的)都被视为同一个cluster.

可以参考

https://github.com/PointCloudLibrary/pcl/blob/master/segmentation/include/pcl/segmentation/region_growing.h


4.跑自己的数据集

      reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI);      reg.setCurvatureThreshold (1.0); (与官方代码一样的设置)

PCL点云分割:Region Growing Segmentation_第2张图片

效果不好,有噪音的平面被分割成几十块。

那么调大一点平滑阈值。

reg.setSmoothnessThreshold (10.0 / 180.0 * M_PI);      reg.setCurvatureThreshold (1.0);

PCL点云分割:Region Growing Segmentation_第3张图片

又过于大了,垃圾桶没分割出来。

那么再调小一点平滑阈值。

reg.setSmoothnessThreshold (6.0 / 180.0 * M_PI);      reg.setCurvatureThreshold (1.0);

PCL点云分割:Region Growing Segmentation_第4张图片

部分垃圾桶被分割出来了。但还是不行。

调大一点曲率阈值。

reg.setSmoothnessThreshold (6.0 / 180.0 * M_PI);      reg.setCurvatureThreshold (3.0);

PCL点云分割:Region Growing Segmentation_第5张图片

效果没什么变化。

放弃。。


5. 总结,对于物体之间的转折处法线和曲率变化小的,算法比较难分割物体。如果点云有噪音,那就是灾难级的表现。而且算法对调参要求高,鲁棒性和普适性低。

你可能感兴趣的:(PCL,点云分割)