1、RANSAC算法
提取点云中的平面常用的算法是RANSAC,即Random Sample Consensus随机采样一致算法,简单来说,它就是从一堆数据中挑选出子集最心仪的数据,比如挑选一条直线等。看网上博客,有一个解释挺有趣的说法。
RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。
具体可以参考RANSAC
根据我的理解,RANSAC 算法主要就是:
- 迭代
- 从一组包含据外点的观测数据中估算出已知数学模型的参数。
它的输入是一组观察的数据,输出是模型的参数。比如本次分割出平面,平面参数方程为ax+by+cz+d=0,故得出的是平面参数。
2、PCL中RANSAC算法
PCL中的RANSAC在模块pcl::segmentation中,具体代码如下所示。
//创建提取平面的分割对象
pcl::SACSegmentation <pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true); //设置模型系数需要优化
seg.setModelType(pcl::SACMODEL_PLANE); //设置为平面模型
seg.setMethodType(pcl::SAC_RANSAC); //设置采用RANSAC算法进行分割
seg.setDistanceThreshold(0.01); //设置距离阈值为0.01m
seg.setMaxIterations (1000);
分割函数返回的是分割平面的索引和模型参数,需要通过ExtractIndices从点云中提取出子集。
while(cloud_filtered_removaled->points.size() > 0.3*nr_points)
{
seg.setInputCloud(cloud_filtered_removaled);
seg.segment(*inliers,*coefficients); //保存分割后点云的索引和模型参数
pcl::ExtractIndices<pcl::PointXYZ> extract;
extract.setInputCloud(cloud_filtered_removaled);
extract.setIndices(inliers);
extract.setNegative (false);
extract