作用1:点云分割通过(空间平面、直线、二维或三维圆、圆球、锥体等模型)进行分割。
作用2:点云的配准对的剔除(例子:五个点云,三个配准,利用RANSAC可以剔除另外两个)
算法简介:从样本中抽取一个子集,通过该算法最小方差对这个样本计算出这个该模型的参数(例如模型是一条直线,那么计算该样本所有的点到直线的方差,综合最短的距离就是这条直线的位置),然后所有样本与该模型的偏差。为该模型设置一个阈值,偏差小于阈值为内点,大于阈值为外点。
配准对的剔除存在的两个问题,如果目标不是现实物体,阈值比较难设定,2_:迭代次数是运行期决定的,无法知道准确次数,但是可以预测范围,每次只能检测一种模型。
代码实现
#include <pcl/sample_consensus/ransac.h> //加载算法
#include <pcl/sample_consensus/sac_model_plane.h> //加载平面模型
#include <pcl/sample_consensus/sac_model_sphere.h> //加载球状模型
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr inliers_cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_p(
new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud)); //创建模型 // 根据模型迭代拟合出平面模型参数,并获取符合其模型参数的内部点
// 用于接收所有内部点的索引
std::vector<int> inliers;
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_p);
// 阈值 1cm
ransac.setDistanceThreshold(0.01f);
// 执行计算
ransac.computeModel();
// 获取内点
ransac.getInliers(inliers);
// 根据索引列表拷贝点云
pcl::copyPointCloud(*cloud, inliers, *inliers_cloud);
球形,其他一样
pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr model_s(
new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));
对于ransac来说接受的是
/** \brief RANSAC (RAndom SAmple Consensus) main constructor
* \param[in] model a Sample Consensus model
*/
RandomSampleConsensus (const SampleConsensusModelPtr &model)
: SampleConsensus<PointT> (model)
所以还可以设置 pcl::SampleConsensusModel<pcl::PointXYZ>::Ptr 来接收不同的模型