PCL使用RANSAC拟合三位平面
1、使用PCL工具
//创建一个模型参数对象,用于记录结果
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
//inliers表示误差能容忍的点,记录点云序号
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
//创建一个分割器
pcl::SACSegmentation<pcl::PointXYZ> seg;
//Optional,设置结果平面展示的点是分割掉的点还是分割剩下的点
seg.setOptimizeCoefficients(true);
//Mandatory-设置目标几何形状
seg.setModelType(pcl::SACMODEL_PLANE);
//分割方法:随机采样法
seg.setMethodType(pcl::SAC_RANSAC);
//设置误差容忍范围,也就是阈值
seg.setDistanceThreshold(0.01);
//输入点云
seg.setInputCloud (cloud);
//分割点云
seg.segment (*inliers, *coefficients);
2、RANSAC拟合平面代码
while ((iterNum < iter_maxNum) && inPlaneNum_max <= RSample_pointsNum)
{
inPlaneNum_t = ;//当前拟合平面中点个数 //随机抽3个点,验证不在一条直线上
/*A(x1,y1)、B(x2,y2)、C(x3,y3)
AB斜率:kAB=(y2-y1)/(x2-x1)
BC斜率:kBC=(y3-y2)/(x3-x2)
计算结果可得:kAB=kBC
因为kAB=kBC,且共点B
所以直线AB与直线BC共线。*/
do {
rand_i_1 = real(gen);
rand_i_2 = real(gen);
if (rand_i_1 == rand_i_2)continue;
rand_i_3 = real(gen);
if (rand_i_1 == rand_i_3 || rand_i_2 == rand_i_3)continue; x1 = r_sample[rand_i_1].x; x2 = r_sample[rand_i_2].x; x3 = r_sample[rand_i_3].x;
y1 = r_sample[rand_i_1].y; y2 = r_sample[rand_i_2].y; y3 = r_sample[rand_i_3].y; } while (((y2 - y1)*(x3 - x2)) == ((y3 - y2)*(x2 - x1))); //x1 = r_sample[rand_i_1].x; x2 = r_sample[rand_i_2].x; x3 = r_sample[rand_i_3].x;
//y1 = r_sample[rand_i_1].y; y2 = r_sample[rand_i_2].y; y3 = r_sample[rand_i_3].y;
z1 = r_sample[rand_i_1].z; z2 = r_sample[rand_i_2].z; z3 = r_sample[rand_i_3].z;
//求平面方程
A_t = (y2 - y1)*(z3 - z1) - (z2 - z1)*(y3 - y1);
B_t = (x3 - x1)*(z2 - z1) - (x2 - x1)*(z3 - z1);
C_t = (x2 - x1)*(y3 - y1) - (x3 - x1)*(y2 - y1);
D_t = -(A_t * x1 + B_t * y1 + C_t * z1); //求在平面内的点的个数
temp = sqrt(A_t*A_t + B_t*B_t + C_t*C_t);//点到平面距离参数 for (int i = ; i < RSample_pointsNum; i++)
{
temp_D = abs(A_t*r_sample[i].x + B_t*r_sample[i].y + C_t*r_sample[i].z + D_t) / temp;//点到平面距离
if (temp_D < maxD)
{
inPlaneNum_t++;
}
}
//与最优(最大)个数比较,保留最优个数的平面公式
if (inPlaneNum_t > inPlaneNum_max)
{
A_best = A_t;
B_best = B_t;
C_best = C_t;
D_best = D_t;
inPlaneNum_max = inPlaneNum_t;
}
iterNum++;//迭代次数+1
}
3、多点情况迭代次数的计算(转载于https://www.cnblogs.com/littlepear/p/10129861.html)
4、关于RANSAC算法https://blog.csdn.net/weixin_43795395/article/details/90751650讲得很好,可以参考
5、自适应阈值https://blog.csdn.net/hanshuobest/article/details/73718440
PCL使用RANSAC拟合三位平面的更多相关文章
- PCL利用RANSAC自行拟合分割平面
利用PCL中分割算法. pcl::SACSegmentation<pcl::PointXYZ> seg; ,不利用法线参数,只根据模型参数得到的分割面片,与想象的面片差距很大, pcl:: ...
- RANSAC拟合算法
最小二乘法只适合与误差较小的情况.试想一下这种情况,假使需要从一个噪音较大的数据集中提取模型(比方说只有20%的数据时符合模型的)时,最小二乘法就显得力不从心了. 算法简介 随机抽样一致算法(RANd ...
- PCL智能指针疑云 <三> 智能指针作为函数的传值参数和传引用参数
一 函数的参数传递可以简单分类为“传值”和“传引用”. 声明函数时,形参带引用“&”,则函数调用时,是把实参所在的内存直接传给函数所开辟的栈内存.在函数内对形参的修改相当于对实参也进行修改. ...
- [PCL]模型拟合方法——随机采样一致性
SACSegmentation封装了多种Ransac方法,包括: RandomSampleConsensus, LeastMedianSquares, MEstimatorSampleConsensu ...
- 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)
0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...
- OpenCV2马拉松第25圈——直线拟合与RANSAC算法
计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28118095 收入囊中 最小二乘法(least ...
- PCL采样一致性算法
在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心 ...
- 计算机视觉基本原理——RANSAC
公众号[视觉IMAX]第31篇原创文章 一 前言 对于上一篇文章——一分钟详解「本质矩阵」推导过程中,如何稳健地估计本质矩阵或者基本矩阵呢?正是这篇文章重点介绍的内容. 基本矩阵求解方法主要有: 1) ...
- 跟我一起学PCL打印语言(一)
引言 本人从事打印机开发和打印驱动开发的相关工作,深感资料特别是中文资料的匮乏和不成系统,对新入门的从事该行业的人来说,门槛很高.在这里一方面是将开发中遇到的相关知识点整理出来,另一方面也能够促进自己 ...
随机推荐
- python 生成器(一):生成器基础(一)生成器函数
前言 实现相同功能,但却符合 Python 习惯的方式是,用生成器函数代替SentenceIterator 类.示例 14-5 sentence_gen.py:使用生成器函数实现 Sentence 类 ...
- Django框架02 /Django下载安装、url路由分发
Django框架02 /Django下载安装.url路由分发 目录 Django框架02 /Django下载安装.url路由分发 1. django下载安装 2. pycharm创建项目 3. 基于D ...
- Zabbix 4.0 API 实践,主机/主机群组 批量添加模板和删除模板
场景 我们日常在管理Zabbix 的时候,经常会需要批量添加模板和批量删除模板,Zabbix页面是提供的批量链接的功能,但是它链接的也只是当前页的主机,我们想扩展这个功能,在链接的时候,可以批量链接整 ...
- bzoj3378[Usaco2004 Open]MooFest 狂欢节*
bzoj3378[Usaco2004 Open]MooFest 狂欢节 题意: n只奶牛,第i只听力为vi,坐标为xi,两只奶牛聊天时音量是max(vi,vj)*abs(xi-xj).求n(n-1)/ ...
- bzoj3767A+B Problem加强版
bzoj3767A+B Problem加强版 题意: 求两个数的和,每个数绝对值≤10^(10^7). 题解: 又用Python水过了…… 代码: a=raw_input() b=a.split() ...
- C#生成Excel文档(EPPlus)
1.公式计算 worksheet.Cells["D2:D5"].Formula = "B2*C2";//这是乘法的公式,意思是第二列乘以第三列的值赋值给第四列, ...
- NVIDIA GPU Turing架构简述
NVIDIA GPU Turing架构简述 本文摘抄自Turing官方白皮书:https://www.nvidia.com/content/dam/en-zz/Solutions/design-vis ...
- 技能实际操作:如何为Centos7 配置静态路由?
如图: 业务地址:192.168.10.0/24 ---- 192.168.20.0/24 管理地址:172.168.10.0/24 --- 172.168.20.0/24 需求:每台主机配置两张网卡 ...
- 题解 CF938G 【Shortest Path Queries】
题目让我们维护一个连通无向图,边有边权,支持加边删边和询问从\(x\)到\(y\)的异或最短路. 考虑到有删边这样的撤销操作,那么用线段树分治来实现,用线段树来维护询问的时间轴. 将每一条边的出现时间 ...
- 一张PDF了解JDK11 GC调优秘籍-附PDF下载
目录 简介 废弃的VM选项 Source-File Mode Code Heap状态分析 AppCDS 总结 简介 JDK11相比JDK10,添加了一个新的Source-File Mode,可以直接通 ...