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拟合三位平面的更多相关文章

  1. PCL利用RANSAC自行拟合分割平面

    利用PCL中分割算法. pcl::SACSegmentation<pcl::PointXYZ> seg; ,不利用法线参数,只根据模型参数得到的分割面片,与想象的面片差距很大, pcl:: ...

  2. RANSAC拟合算法

    最小二乘法只适合与误差较小的情况.试想一下这种情况,假使需要从一个噪音较大的数据集中提取模型(比方说只有20%的数据时符合模型的)时,最小二乘法就显得力不从心了. 算法简介 随机抽样一致算法(RANd ...

  3. PCL智能指针疑云 <三> 智能指针作为函数的传值参数和传引用参数

    一 函数的参数传递可以简单分类为“传值”和“传引用”. 声明函数时,形参带引用“&”,则函数调用时,是把实参所在的内存直接传给函数所开辟的栈内存.在函数内对形参的修改相当于对实参也进行修改. ...

  4. [PCL]模型拟合方法——随机采样一致性

    SACSegmentation封装了多种Ransac方法,包括: RandomSampleConsensus, LeastMedianSquares, MEstimatorSampleConsensu ...

  5. 29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)

    0 引言 最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下. 1 基于PCL的点云平面分割拟合算法 2 参数及其意义介绍 (1)点云下采样 1. 参数: ...

  6. OpenCV2马拉松第25圈——直线拟合与RANSAC算法

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28118095 收入囊中 最小二乘法(least ...

  7. PCL采样一致性算法

    在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心 ...

  8. 计算机视觉基本原理——RANSAC

    公众号[视觉IMAX]第31篇原创文章 一 前言 对于上一篇文章——一分钟详解「本质矩阵」推导过程中,如何稳健地估计本质矩阵或者基本矩阵呢?正是这篇文章重点介绍的内容. 基本矩阵求解方法主要有: 1) ...

  9. 跟我一起学PCL打印语言(一)

    引言 本人从事打印机开发和打印驱动开发的相关工作,深感资料特别是中文资料的匮乏和不成系统,对新入门的从事该行业的人来说,门槛很高.在这里一方面是将开发中遇到的相关知识点整理出来,另一方面也能够促进自己 ...

随机推荐

  1. day19 生成器+函数递归

    目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...

  2. Tomcat双击startup.bat闪退的原因及解决方式

    很久不碰Tomcat了,最近因为种种原因需要重新投入到Java Web的怀抱,所以又重新接触了Tomcat 我下载了tomcat的压缩包将其解压缩到某个位置,我这里是D盘下的tomcat文件夹中,但是 ...

  3. 解决alert在ios版微信中显示url的问题(重写alert)

    为了解决alert在ios版微信中显示url的问题 window.alert = function(name){ var iframe = document.createElement("I ...

  4. 从对象到类,Java中需要知道的这些东西

    1. 对象的诞生   在平时的开发中,我们使用对象的时候,都是直接new一个临时变量然后进行各种逻辑赋值然后返回,但是你有没有想过一个对象在创建的过程中经历了什么呢,为什么创建时静态变量就已经赋完值了 ...

  5. 计算滚动条的宽度--js

    原理 创建两个div嵌套在一起 外层的div设置固定宽度和overflow:scroll 滚动条的宽度=外层div的offsetWidth-内层div的offsetWidth 实现代码 /** * 获 ...

  6. JELLY技术周刊 Vol.15 云游戏会是 5G 杀手级应用么?

    蒲公英 · JELLY技术周刊 Vol.15 听到"云游戏",或许我们的第一反应会是"云玩家"而不是那些上云的"游戏",在这个 5G 已来的 ...

  7. navcat 增删改查

    navcat // sql 语句结尾的地方需要 设置为空 SELECT * FROM users ; UPDATE users SET uname = 'hezhi' WHERE uid = 3 // ...

  8. 服务质量分析:腾讯会议&腾讯云Elasticsearch玩出了怎样的新操作?

    导语 | 腾讯会议于2019年12月底上线,两个月内日活突破1000万,被广泛应用于疫情防控会议.远程办公.师生远程授课等场景,为疫情期间的复工复产提供了重要的远程沟通工具.上线100天内,腾讯会议快 ...

  9. ajax快速入门

    一.ajax简单入门 1.Ajax的实现步骤 // 1.创建ajax对象var xhr = new XMLHttpRequest();// 2.高数ajax请求地址及请求方式//第一个参数就是请求方式 ...

  10. 打开chm文件时出现“无法显示此页:确保 Web 地址 //ieframe.dll/dnserrordiagoff.htm# 正确”的解决办法

    当我们打开chm文件时遇到下面这种情况: 解决方法: 1.一般情况下无法显示网页:右键 chm文件属性里最下面有个"解除锁定",点击"解除锁定"按钮就可以了. ...