PCL: Segmentation模块之SACSegmentation点云分割

时间:2021-02-14 22:26:21

小结:

        采样一致性分割算法的目的主要是从原点云中提取目标模型,比如说面,球体,圆柱等等,从而为后续的目标识别或者点云匹配等等做准备。
        使用此算法之前应该先熟悉PCL中的采样一致性(sample consensus)模块,里边包含了模型(平面、直线等)和采样方法(RANSAC、LMedS等)的一些枚举变量,一些核心的算法也包含其中,我们可以使用不同的方法提取不同的模型。

详细介绍:

参数输入输出:

        此类由基类PCLBase派生,生成对象方式也很简单,如下:
Pcl:: SACSegmentation<PointT> sac

成员函数:

        这里我就不一一介绍所有的成员函数了,只是把几个非常重要的成员函数给列出来,并给出其的使用方法。
  1. inline void setModelType (int model) 所提取目标模型的属性(平面、球、圆柱等等)。
  2. inline voidsetMethodType (int method)采样方法(RANSAC、LMedS等)。
  3. inline void setDistanceThreshold (doublethreshold) 查询点到目标模型的距离阈值(如果大于此阈值,则查询点不在目标模型上,默认值为0)。
  4. inline void setMaxIterations (intmax_iterations) 最大迭代次数(默认值为50)。
  5. inline void setProbability (double probability) 至少一个样本不包含离群点的概率(默认值为0.99)。
  6. virtual void segment (PointIndices &inliers,ModelCoefficients &model_coefficients) 输出提取点的索引和目标模型的参数。

效果展示:

        PCL版本为1.7.1,IDE为vs2010Sp1,实验样本为PCL官网提供的小桌子。
PCL: Segmentation模块之SACSegmentation点云分割
        源码和源点云文件我已上传到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);

        运行结果如下:

PCL: Segmentation模块之SACSegmentation点云分割

        把地面提取出来了。

PCL: Segmentation模块之SACSegmentation点云分割

        当然,如果PassThrough滤波还能很简单的把桌子表面提取出来。

PCL: Segmentation模块之SACSegmentation点云分割

    对了我的邮箱为 littletinygo@sina.com ,我也是刚刚接触这个领域,希望与大家多多交流共同学习、共同进步。