基于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 farmodel_              = 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 -Infp_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);

在这里插入图片描述

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); 

在这里插入图片描述

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);

在这里插入图片描述

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/256067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB调用Python自定义函数(类、函数等) Python调用MATLAB

一、MATLAB调用Python函数 参考链接&#xff1a;https://blog.csdn.net/qq_27280237/article/details/84644900 知乎链接&#xff1a;https://zhuanlan.zhihu.com/p/92081119 知乎上这位说的更加的详细&#xff0c;感谢 二、Python调用MATLAB-API 知乎链接&#xff1a;htt…

Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场

Testin云測与ARM 战略合作&#xff1a;推动全球移动应用加速进入中国市场 2014/10/14 Testin 业界资讯&#xff08;中国北京–2014年10月14日 &#xff09;全球最大的移动游戏、应用真机和用户云測试平台Testin云測今日宣布与ARM建立战略伙伴合作关系&#xff0c;设立“ARM应…

iOS:真机调试

真机调试现在发生了改变&#xff0c;在Xcode7以前进行真机调试是需要证书的&#xff0c;正是由于这个原因&#xff0c;这个过程比较麻烦&#xff1b;在Xcode7以后是免证书的&#xff0c;使用起来就简单很多了。 Xcode7以前的步骤如下&#xff1a; 原链接地址为&#xff1a;http…

正则表达式快速入门,转载

正则表达式快速入门 首先简单介绍下正则表达式&#xff1a; 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说&#xff0c;正则表达式就是记录文本规则的代码。 下面就看看正则表达式里…

C++总结笔记(十三)—— 类型转换

文章目录一、类型转换简介二、示例1.隐式类型转换2.强制类型转换一、类型转换简介 C中类型转换从形式上可分为显式和隐式两种。 隐式类型转换则是由编译器自动完成类型转换过程&#xff0c;可以分为内置数据类型转换和自定义数据类型转换。 显式的类型转换通常使用强制类型转…

【pyqt5】配置Qt Designer之【designer.exe的保存位置及ui文件转py文件及no Qt platform plugin could be initialized 问题解决】

目录 一、寻找designer.exe 二、no Qt platform plugin could be initialized 问题解决 三、ui文件转换为py文件 四、pyqt5的使用教程 一、寻找designer.exe 头疼&#xff0c;找了一上午都没有找到这个的路径&#xff0c;最后还是在评论区看到的&#xff0c;这也不能怪人家…

mysql语句大全

1、说明&#xff1a;创建数据库CREATE DATABASE database-name2、说明&#xff1a;删除数据库drop database dbname3、说明&#xff1a;备份sql server--- 创建 备份数据的 deviceUSE masterEXEC sp_addumpdevice disk, testBack, c:\mssql7backup\MyNwind_1.dat--- 开始 备份B…

【翻译】在Ext JS和Sencha Touch中创建自己定义布局

原文&#xff1a;Creating Custom Layouts in Ext JS and Sencha Touch布局系统是Sencha框架中最强大和最独特的一部分。布局会处理应用程序中每个组件的大小和位置&#xff0c;因而&#xff0c;不须要手动去管理那些碎片。Ext JS与Sencha Touch的布局类有很多类似之处。近期在…

PCL中GreedyProjection三角化算法简介与示例

文章目录前言一、PCL点云三角化1.1 Delaunay三角剖分1.2 贪婪三角化二、程序示例总结前言 Delaunay三角剖分最初应用于2维领域&#xff0c;而与Greedy三角化算法的结合&#xff0c;使之成为目前在三维重建领域最为基础的算法原理之一&#xff0c;很多学者针对其原理进行改进用…

[设计模式]中介者模式之Events消息传递实现

这篇文章比较短,修改自 写给大家看的设计模式之中介者中的例子中介者模式的定义和目的自不必说, 参考上文即可. 本文针对实现方式做一个补充. 中介者模式增加了一个第三方对象(中介者)来控制两个对象(同事)间的交互. 有助于对彼此通信的解耦, 毕竟他们并不需要关心对方的实现细…

【pyqt5】 读取numpy arrray 显示图片

目录 1、GUI界面&#xff08;QT designer设计&#xff09; 2、逻辑函数&#xff08;回调等&#xff09; 3、显示图片在label上 0&#xff09;直接利用QPixmap显示图像 1&#xff09;显示彩色图 彩色图显示色调不正常——opencv&#xff08;BGR&#xff09;QT(RGB)需要进行…

[Django]SE项目回忆录(二)-注册/登录功能的实现及细节

该项目中提供了注册和登录两部分功能&#xff0c;功能描述如下&#xff1a; 注册&#xff1a; 允许任何用户进行学生身份的注册。 教师用户预先已经保存在数据库中&#xff0c;不允许以游客身份注册新的教师用户。 注册时需要填写的信息包括&#xff1a; - 用户名 - 密码(…

Zip4j开源jar包的简单使用

因为对项目突然要发送压缩加密的邮件附件&#xff0c;所以从网上看了一些资料说Zip4j开源框架比较好使&#xff0c;对中文的支持也比较好&#xff0c;所以从网上找了一个代码案例&#xff01;自己写了一写&#xff0c;现在贴出来&#xff0c;方便以后想用的时候好找 1、 1 pack…

【pyqt5】——入门级模板(ui文件+ui转py文件+逻辑py文件)(消息提示框)

目录 1、ui文件 2、ui转py文件 3、逻辑py文件 4、实例 1&#xff09;ui文件——demo.ui 2&#xff09;ui转py文件——demo.py 3)逻辑py文件——demoLogic.py 4)运行结果 1、ui文件 这个文件是直接通过pyqt5 designer进行设计的&#xff0c;相关配置可见《配置Qt Design…

PCL中点特征描述子PFH、FPFH和VFH简述和示例

文章目录前言一、点特征直方图1.1 PFH1.1.1 法线估计1.1.2 特征计算1.2 FPFH1.3 VFH二、示例2.1 PFH计算2.2 FPFH2.3 VFH前言 点特征直方图是PCL中非常重要的特征描述子&#xff0c;在点云匹配、分割、重建等任务中起到关键作用&#xff0c;可以对刚体变换、点云密度和噪声均有…

BZOJ 1005: [HNOI2008]明明的烦恼

BZOJ 1005: [HNOI2008]明明的烦恼 Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在 任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N(0 < N < 1000), 接下来N行,第i1行给出第i个节点的度…

Apache Directory 指令

<Directory> 指令 语法&#xff1a;<Directory directory-path> ... </Directory> <Directory>和</Directory>用于封装一组指令&#xff0c;使之仅对某个目录及其子目录生效。任何可以在"directory"作用域中使用的指令都可以使用。Dir…

来一个炫酷的导航条

本文分享一个带动画效果的中英文切换导航条。 鼠标放上去试一下&#xff1a; INDEX 首页 BBS 社区 HOME 我 1.用CSS3实现 效果看上去复杂&#xff0c;其实我们先来做出一个样式&#xff0c;就很简单了。如下&#xff1a; 代码&#xff1a; <nav><ul class"list…

基于C++的opencv中Mat矩阵运算方法总结

文章目录前言一、Mat运算种类1.1 代数运算1.2 类型转换前言 Mat类是目前opencv最为常用的图像数据格式&#xff0c;其优点在于无需手动开辟内存空间和实时释放&#xff0c;针对此类的各种运算方法有很多&#xff0c;本文按照各种运算方法的种类进行简单的总结和示例。 一、Mat…

【pyqt5】——信号与槽

一、简单Demo 简单使用信号和槽&#xff08;之前常用的使用方式&#xff09;&#xff1a; class DemoWin(QMainWindow):def __init__(self):super().__init__()self.initUI()def initUI(self):self.resize(400, 250)self.btn QPushButton("发送信号", self)# 发送…