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. day22 作业

    1 统计文件夹大小 def get_filesize(file_path): count = 0 res=None files_sum = os.listdir(file_path) for file ...

  2. 《SpringBoot判空处理》接开@valid的面纱

    一.事有起因 我们在与前端交互的时候,一般会遇到字段格式校验及非空非null的校验,在没有SpringBoot注解的时候, 我们可能会在service进行处理: if(null == name){ t ...

  3. ::before 和 :after 中双冒号和单冒号有什么区别?

    在 CSS 中伪类一直用 : 表示,如 :hover, :active 等 伪元素在CSS1中已存在,当时语法是用 : 表示,如 :before 和 :after 后来在CSS3中修订,伪元素用 :: ...

  4. 记一次WPF程序带参数启动

    问题:总共有两个程序.第一个程序使用Process带参数启动第二个程序. 网上一堆人都说什么重写Main入口啊 什么的.然后还一堆人跟着复制发文章.我也是醉了,简直是坑人.为何要舍近求远,直接重写AP ...

  5. pigctf期末测评

    pigctf期末测评 MISC 1 拿到图片,先binwalk一下,如下图 果然发现png图片后面跟了个ZIP,然后提取出来打开发现了一个flag.png,然后查看16进制文件没有发现什么问题,之后查 ...

  6. 如何让touchmove之后不触发touchend的事件

    手机扫码看效果 不多说,直接上代码 <ul id="Ul"> <li>111</li> <li>222</li> < ...

  7. celery 基础教程(二):简单实例

    前言 使用celery包含三个方面:1. 定义任务函数.2. 运行celery服务.3. 客户应用程序的调用. 实例一: #1. 定义任务函数 创建一个文件 tasks.py输入下列代码: from ...

  8. scrapy 源码解析 (三):启动流程源码分析(三) ExecutionEngine执行引擎

    ExecutionEngine执行引擎 上一篇分析了CrawlerProcess和Crawler对象的建立过程,在最终调用CrawlerProcess.start()之前,会首先建立Execution ...

  9. JS 判断是否为数字 数字型特殊值

    JS 数字型三个特殊值 Infinity ,代表无穷大,大于任何数值 -Infinity ,代表无穷小,小于任何数值 NaN ,Not a number,代表一个非数值  isNaN的使用: isNa ...

  10. 数据清洗与准备知识图谱-《利用Python进行数据分析》

    所有内容整理自<利用Python进行数据分析>,使用MindMaster Pro 7.3制作,emmx格式,源文件已经上传Github,需要的同学转左上角自行下载或者右击保存图片.