小结:
采样一致性分割算法的目的主要是从原点云中提取目标模型,比如说面,球体,圆柱等等,从而为后续的目标识别或者点云匹配等等做准备。
使用此算法之前应该先熟悉PCL中的采样一致性(sample consensus)模块,里边包含了模型(平面、直线等)和采样方法(RANSAC、LMedS等)的一些枚举变量,一些核心的算法也包含其中,我们可以使用不同的方法提取不同的模型。
详细介绍:
参数输入输出:
此类由基类PCLBase派生,生成对象方式也很简单,如下:
Pcl:: SACSegmentation<PointT> sac
成员函数:
这里我就不一一介绍所有的成员函数了,只是把几个非常重要的成员函数给列出来,并给出其的使用方法。
- inline void setModelType (int model) 所提取目标模型的属性(平面、球、圆柱等等)。
- inline voidsetMethodType (int method)采样方法(RANSAC、LMedS等)。
- inline void setDistanceThreshold (doublethreshold) 查询点到目标模型的距离阈值(如果大于此阈值,则查询点不在目标模型上,默认值为0)。
- inline void setMaxIterations (intmax_iterations) 最大迭代次数(默认值为50)。
- inline void setProbability (double probability) 至少一个样本不包含离群点的概率(默认值为0.99)。
- virtual void segment (PointIndices &inliers,ModelCoefficients &model_coefficients) 输出提取点的索引和目标模型的参数。
效果展示:
PCL版本为1.7.1,IDE为vs2010Sp1,实验样本为PCL官网提供的小桌子。
源码和源点云文件我已上传到CSDN(
点此下载)。所需要的核心代码如下(我只是列出了部分需要设定参数的代码):
// segmentation pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients); pcl::PointIndices::Ptr inliers (new pcl::PointIndices); pcl::SACSegmentation<pcl::PointXYZ> sac; sac.setInputCloud(cloud_source); sac.setMethodType(pcl::SAC_RANSAC); sac.setModelType(pcl::SACMODEL_PLANE); sac.setDistanceThreshold(0.01); sac.setMaxIterations(100); sac.setProbability(0.95); sac.segment(*inliers, *coefficients);
运行结果如下:
把地面提取出来了。
当然,如果PassThrough滤波还能很简单的把桌子表面提取出来。