PCL点云分割:Region Growing Segmentation
背景:
pcl官方教程:http://www.pointclouds.org/documentation/tutorials/region_growing_segmentation.php#region-growing-segmentation
1. 使用感受
这个算法适合分割规则的物体或者说四四方方的东西,像房屋轮廓,纸箱折叠的情景。如官方给的效果图:
这个算法主要有4个参数来设置,我个人觉得算法还算是使用者友好的。主要要设置聚类点数上下界,蔓延时候搜索出来多少个附近点,面平滑阈值还有面的曲率阈值。
2. 算法细节
为了了解设置这些参数,让我们来了解一下如何内部细节。从官方的介绍里,算法的流程是写的很仔细的。为了让你更直观的明白,我概括的来说,就是从曲率小的面播种,从种子的位置出发,开始往四周搜索点,然后比对点于点之间的曲率和法线方向,如果差距小于阈值就视为同一个cluster。如果一个cluster无法再蔓延,在剩下的点云里再找曲率小的面播种,然后继续重复直到遍历完毕。
3. 调参
面平滑阈值(用于对比法线)还有面的曲率阈值(用于对比曲率)是最重要的参数。如果调大了,不仅仅是同一个平面,两个平面(它们的连着处弧度变化小的)都被视为同一个cluster.
可以参考
https://github.com/PointCloudLibrary/pcl/blob/master/segmentation/include/pcl/segmentation/region_growing.h4.跑自己的数据集
reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI); reg.setCurvatureThreshold (1.0); (与官方代码一样的设置)
效果不好,有噪音的平面被分割成几十块。
那么调大一点平滑阈值。
reg.setSmoothnessThreshold (10.0 / 180.0 * M_PI); reg.setCurvatureThreshold (1.0);
又过于大了,垃圾桶没分割出来。
那么再调小一点平滑阈值。
reg.setSmoothnessThreshold (6.0 / 180.0 * M_PI); reg.setCurvatureThreshold (1.0);
部分垃圾桶被分割出来了。但还是不行。
调大一点曲率阈值。
reg.setSmoothnessThreshold (6.0 / 180.0 * M_PI); reg.setCurvatureThreshold (3.0);
效果没什么变化。
放弃。。
5. 总结,对于物体之间的转折处法线和曲率变化小的,算法比较难分割物体。如果点云有噪音,那就是灾难级的表现。而且算法对调参要求高,鲁棒性和普适性低。