随机采样一致性算法RANSAC

作用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 来接收不同的模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值