基于PCL的RANSAC(随机采样一致)算法简介与示例

这篇具有很好参考价值的文章主要介绍了基于PCL的RANSAC(随机采样一致)算法简介与示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

RANSAC(Random sample consensus,随机采样一致)是3D点云拟合的一种重要的手段,可以对直线、圆、平面,圆球、圆柱等形状的点云进行拟合,其优点在于可以最大程度上减少噪声点对拟合效果的影响。


一、RANSAC

RANSAC各种类型拟合的计算原理基本类似。
1,进行随机抽样,如直线,就随机找到两个点;如平面,就随机找到三个点来创建一个平面。
2,计算除去采样点的其余点与采样点组成的模型之间的距离,设定阈值,将符合阈值标准的点标记为内点,记录内点个数。
3,重复前面的步骤进行迭代计算,直到达到迭代终止条件,选择内点个数最多的模型计算最佳拟合参数。
其去除噪声影响效果好坏的关键在于内点阈值的选择和迭代次数。
PCL中有专门的一个类RandomSampleConsensus来实现其算法。
简单分析下其计算部分。

const double log_probability  = std::log (1.0 - probability_);

源码中probability_表示从数据集中选取采样点N均为局内点的概率。

// Better match ?
          if (n_inliers_count > n_best_inliers_count)
          {
            n_best_inliers_count = n_inliers_count; // This write and the previous read of n_best_inliers_count must be consecutive and must not be interrupted!
            n_best_inliers_count_tmp = n_best_inliers_count;

            // Save the current model/inlier/coefficients selection as being the best so far
            model_              = selection;
            model_coefficients_ = model_coefficients;

            // Compute the k parameter (k=std::log(z)/std::log(1-w^n))
            const double w = static_cast<double> (n_best_inliers_count) * one_over_indices;
            double p_no_outliers = 1.0 - std::pow (w, static_cast<double> (selection.size ()));
            p_no_outliers = (std::max) (std::numeric_limits<double>::epsilon (), p_no_outliers);       // Avoid division by -Inf
            p_no_outliers = (std::min) (1.0 - std::numeric_limits<double>::epsilon (), p_no_outliers);   // Avoid division by 0.
            k = log_probability / std::log (p_no_outliers);
          }

以上为寻找最佳模型的代码。
w的值为从数据集中选取一个采样点为局内点的概率。
p_no_outliers:顾名思义,意思为非局外点的概率。
k表示估计的迭代采样次数。

二、应用示例

1.拟合直线

PCL中采样一致直线模型的类为SampleConsensusModelLine
通过这个类将输入的点云转化为采样一致模型。

pcl::SampleConsensusModelLine<pcl::PointXYZ>::Ptr line(new pcl::SampleConsensusModelLine<pcl::PointXYZ>(cloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(line);
ransac.setDistanceThreshold(0.01);
ransac.setMaxIterations(1000);
ransac.computeModel();

vector<int> inliers;
ransac.getInliers(inliers);

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_line(new pcl::PointCloud<pcl::PointXYZ>);
pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *cloud_line);

Eigen::VectorXf coefficient;
ransac.getModelCoefficients(coefficient);

基于PCL的RANSAC(随机采样一致)算法简介与示例

2.拟合平面

同样,SampleConsensusModelPlane表示采样一致平面的模型。

pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr plane(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));

pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(plane);
ransac.setDistanceThreshold(0.1);
ransac.setMaxIterations(500);
ransac.setProbability(0.99);
ransac.computeModel();
vector<int> inliers; 
ransac.getInliers(inliers);       

Eigen::VectorXf coefficient;
ransac.getModelCoefficients(coefficient); 

基于PCL的RANSAC(随机采样一致)算法简介与示例

3.拟合球

SampleConsensusModelSphere表示采样一致平面的模型。

pcl::SampleConsensusModelSphere<pcl::PointXYZ>::Ptr	sphere(new pcl::SampleConsensusModelSphere<pcl::PointXYZ>(cloud));

pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(sphere);
ransac.setDistanceThreshold(0.1);
ransac.setMaxIterations(1000);
ransac.setProbability(0.99);
ransac.computeModel();

Eigen::VectorXf coeff;
ransac.getModelCoefficients(coeff);

pcl::IndicesPtr inliers(new vector <int>());
ransac.getInliers(*inliers);

基于PCL的RANSAC(随机采样一致)算法简介与示例

总结

优点:避免噪声点对拟合结果的干扰。
缺点:由于计算结果的不确定性,迭代次数可能过高,对于密集点云来讲,计算时间过长,需要进行预处理后再进行拟合过程,但同样会损失时间。
原理部分参考:
随机抽样一致算法(Random sample consensus,RANSAC)详解,保姆级教程
PCL函数库摘要——采样一致性文章来源地址https://www.toymoban.com/news/detail-433706.html

到了这里,关于基于PCL的RANSAC(随机采样一致)算法简介与示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • PCL RANSAC分割提取多个球体

      使用PCL分割提取多个球体,其核心原理仍然是RANSAC拟合球面,这里只是做简单修改,适用于提取多个球体。具体实现原理见:PCL RANSAC拟合空间3D球体。

    2024年02月17日
    浏览(46)
  • PCL RANSAC拟合空间3D椭圆

      椭圆的参数方程为: { x ( t )

    2024年02月12日
    浏览(32)
  • RANSAC算法在Python中的实现与应用探索:线性拟合与平面拟合示例

    第一部分:RANSAC算法与其应用 在我们的日常生活和多个领域中,如机器学习,计算机视觉,模式识别等,处理数据是一个非常重要的任务。尤其是当我们需要从嘈杂的数据中获取信息或拟合模型时。有时候,数据可能包含异常值或噪声,这可能会对我们的结果产生重大影响。

    2024年02月13日
    浏览(41)
  • PCL RANSAC分割提取多个空间圆

    本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。   使用PCL分割提取多个空间圆,其核心原理仍然是RANSAC拟合空间圆,这里只是做简单修改,适用于提取多个球圆。具体实现原理见:PCL RANSAC拟合空间

    2024年02月09日
    浏览(50)
  • PCL RANSAC拟合平面(C++详细过程版)

    本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。   RANSAC拟合平面,采用的是不共线的三个点确定一个平面,据以实现原理见:PCL 三点确定一个平面原理及代码

    2024年02月13日
    浏览(39)
  • 贪心算法、贪心搜索/采样(greedy search/sampling)、集束搜索(beam search)、随机采样(random sample)

    贪心算法,又名贪婪法,是寻找 最优解问题 的常用方法,这种方法模式一般将求解过程分成 若干个步骤 ,但每个步骤都应用贪心原则,选取 当前状态下 最好/最优的选择 (局部最有利的选择),并以此希望 最后堆叠出 的结果也是最好/最优的解。{看着这个名字,贪心,贪

    2024年02月15日
    浏览(47)
  • OpenCV实战(21)——基于随机样本一致匹配图像

    当两台摄像机拍摄同一场景时,它们会在不同视角拍摄到相同的元素。我们已经学习了特征点匹配,在本节中,我们将学习如何利用两个视图之间的对极约束来更可靠地匹配图像特征。 我们将遵循以下原则:当匹配两个图像之间的特征点时,只接受落在相应极线上的匹配。为

    2024年02月05日
    浏览(67)
  • 详解一致性hash算法(Consistent-hashing):原理、图解、代码示例

    Consistent hashing is a scheme that provides hash table functionality in a way that the addition or removal of one slot does not significantly change the mapping of keys to slots. Hash算法是一种将任意长度的消息压缩到一个固定长度的输出(即哈希值)的算法。它主要用于数据完整性校验、数据加密、数字签名等方面

    2024年02月07日
    浏览(46)
  • 基于采样的规划算法之动态规划方法

    经过前面对RRT的介绍,我们发现基于采样的规划算法与基于图搜索的规划算法都是通过对路径树进行拓展新节点,来找到起点到终点的路径解。RRT家族通过随机采样来生成这棵路径树,随机采样会面临采样低效的问题——大部分采样的新节点都无益于提升路径解的最优性。动

    2024年02月11日
    浏览(32)
  • 自动驾驶算法(三):RRT算法讲解与代码实现(基于采样的路径规划)

    目录 1 RRT算法原理 2 RRT算法代码解析 3 RRT完整代码         RRT算法的全称是快速扩展随机树算法(Rapidly Exploring Random Tree),它的想法就是从根结点长出一棵树当树枝长到终点的时候这样就能找到从终点到根节点的唯一路径。         算法流程:         首先进行初始化

    2024年02月06日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包