PCL-基于RANSAC的平面拟合方法

news2024/11/27 4:36:23

基于RANSAC的平面拟合方法

  • 一、简介
  • 二、实验代码
  • 三、实验结果

一、简介

随机采样一致性(Random sample consensus,RANSAC):RANSAC是一种鲁棒的模型拟合方法,它可以处理存在大量噪声和异常值的数据。在进行平面拟合时,RANSAC会随机选择三个点,然后计算这三个点确定的平面模型。然后,RANSAC会计算其他所有点到这个平面的距离,并根据一个预设的阈值来判断这些点是否符合这个平面模型。这个过程会重复多次,最后选择符合点最多的平面模型作为最终的结果。
随机采样一致性(RANSAC)是一种迭代的模型估计方法,它的主要目标是从一组包含大量异常值的观测数据中估计出数学模型的参数。在进行平面拟合时,RANSAC的工作原理如下:
1.随机选择最小样本集:在进行平面拟合时,RANSAC首先会随机选择三个点作为最小样本集。这是因为在三维空间中,三个非共线的点可以确定一个平面。
2.构建模型:然后,RANSAC会根据这三个点计算出一个平面模型。这个模型就是通过这三个点的平面。
3.计算误差:接着,RANSAC会计算其他所有点到这个平面的距离,这个距离就是每个点的误差。
4.确定内点:然后,RANSAC会根据一个预设的阈值来判断每个点是否为内点,也就是说,如果一个点的误差小于这个阈值,那么就认为这个点符合平面模型,将其标记为内点。
5.更新模型:如果内点的数量超过了之前的最大内点数量,那么就用所有的内点来更新平面模型。
6.迭代:以上的过程会重复多次。在每次迭代中,RANSAC都会随机选择一个新的最小样本集,然后构建模型,计算误差,确定内点,更新模型。这个过程会一直进行,直到达到预设的迭代次数。
7.计算最佳模型:最后,RANSAC会选择内点数量最多的样本,再用这些内点进行求解最终的方程,作为最终的结果。通过这种方式,RANSAC可以有效地处理存在大量噪声和异常值的数据,从而得到鲁棒的模型估计结果。
在这里插入图片描述

二、实验代码

#pragma warning(disable:4996)
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/sample_consensus/ransac.h>
#include <pcl/sample_consensus/sac_model_plane.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

using namespace std;

int main(int argc, char** argv)
{
	// ------------------------------------------读取点云-----------------------------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	if (pcl::io::loadPCDFile<pcl::PointXYZ>("E:****\\0_point_cloud_00000.pcd", *cloud) == -1)
	{
		PCL_ERROR("点云读取失败 \n");
		return (-1);
	}
	//------------------------------------------RANSAC框架---------------------------------------------- 
	pcl::SampleConsensusModelPlane<pcl::PointXYZ>::Ptr model_plane(new pcl::SampleConsensusModelPlane<pcl::PointXYZ>(cloud));
	pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_plane);// 定义RANSAC算法模型
	ransac.setDistanceThreshold(0.02);// 设定距离阈值
	ransac.setMaxIterations(500);     // 设置最大迭代次数
	ransac.setProbability(0.99);      // 设置从离群值中选择至少一个样本的期望概率
	ransac.computeModel();            // 拟合平面
	vector<int> inliers;              // 用于存放内点索引的vector
	ransac.getInliers(inliers);       // 获取内点索引
	Eigen::VectorXf coeff;
	ransac.getModelCoefficients(coeff);  //获取拟合平面参数,coeff分别按顺序保存a,b,c,d
	cout << "平面模型系数coeff(a,b,c,d): " << coeff[0] << " \t" << coeff[1] << "\t " << coeff[2] << "\t " << coeff[3] << endl;
	
	// --------------------------------根据内点索引提取拟合的平面点云-----------------------------------
	pcl::PointCloud<pcl::PointXYZ>::Ptr sac_plane(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::copyPointCloud<pcl::PointXYZ>(*cloud, inliers, *sac_plane);
	pcl::io::savePCDFileBinary("E:\\****\\0_point_cloud_00000拟合.pcd", *sac_plane);
	
	// -------------------------------------------可视化-------------------------------------------------
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("cloud show"));
	int v1 = 0;
	int v2 = 1;

	viewer->createViewPort(0, 0, 0.5, 1, v1);
	viewer->createViewPort(0.5, 0.5, 1, 1, v2);
	viewer->setBackgroundColor(0, 0, 0, v1);
	viewer->setBackgroundColor(0, 0, 0, v2);

	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> color(cloud, 0, 255, 0);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> after_sac(sac_plane, 0, 0, 255);

	viewer->addPointCloud(cloud, color, "cloud", v1);
	viewer->addPointCloud(sac_plane, after_sac, "plane cloud", v2);
	
	

	// 显示拟合出来的平面
	pcl::ModelCoefficients plane;
	plane.values.push_back(coeff[0]);
	plane.values.push_back(coeff[1]);
	plane.values.push_back(coeff[2]);
	plane.values.push_back(coeff[3]);

	viewer->addPlane(plane, "plane",v2);
	

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(10000));
	}
	return 0;
}


三、实验结果

拟合前:
在这里插入图片描述
拟合后:
在这里插入图片描述
平面方程:
在这里插入图片描述

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

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

相关文章

Qt QTableWidgetItem.setFlags()

查看 Qt 官方地址 Qt Namespace | Qt Core 5.15.14 得到如下说明 默认值是 63&#xff0c;即如下表达式的值&#xff08;位运算&#xff09;&#xff0c;表示可选择&#xff08;1&#xff09;、可编辑&#xff08;2&#xff09;、可拖拽&#xff08;4&#xff09;、可放入&…

Springboot查看版本和兼容的依賴

https://docs.spring.io/spring-boot/docs/2.7.18/reference/htmlsingle/#appendix-dependency-versions 如果需要查自己的版本&#xff0c;只需要修改2.7.18&#xff0c;因爲我的是2.7.18的版本。 然後如果你想查詢所兼容的其它依賴版本&#xff0c;可以打開頁面后直接search…

RK3588——网口实时传输视频

由于通过流媒体服务器传输画面延迟太高的问题&#xff0c;不知道是没有调试到合适的参数还是其他什么问题。诞生了这篇博客。 RK3588板端上接摄像头&#xff0c;采集画面&#xff0c;通过网口实时传输给上位机并显示。 第一代版本 RK3588代码 import cv2 import socket imp…

AI智能体:我用扣子给詹杜库做了一套超酷炫的手办

杀疯了&#xff01; 在巴黎奥运会今日的男篮决赛中&#xff0c;库里开启了杀神模式。 末节关键时刻投中 4 记三分&#xff0c;直接带走比赛&#xff0c;看得我都跪了。 库里在 2012 年未能入选梦之队&#xff0c;2016 年 NBA 季后赛夺冠后太过疲惫&#xff0c;2021 年东京奥…

真实护网,看这一篇就够了!【护网行动】

如果一个白帽黑客没参过护网&#xff0c;那他可能要回炉重造了。那么网安领域最出名的护网是什么&#xff1f;12年攻防老手告诉你答案。 1.什么是护网&#xff1f; 护网行动是由机关单位主办的网络攻防比赛&#xff0c;一般是每年的6~9月份会举行&#xff0c;分为国家级、省级…

如何给两台机器集群设置VIP(虚拟IP)

原文链接&#xff1a;https://www.cnblogs.com/qianz/articles/16825567.html 一、环境准备 1.集群 IP部署 172.16.30.181是主节点&#xff0c;172.16.30.182是备节点&#xff0c;VIP是172.16.30.183 我是在openstack上搭建的集群&#xff0c;建议大家将需要用到的IP都固定到…

java多线程(五)线程间通信

线程间通信是并发编程中的一个重要概念&#xff0c;它允许多个线程之间交换信息或共享数据。 以下是几种常见的线程间通信方式及其示例&#xff1a; 1. 共享内存 共享内存是最基本的线程间通信方式。多个线程可以访问同一块内存区域&#xff0c;通过读写这块内存区域来实现数…

【问题解决】 PyAutoGUI was unable to import pyscreeze.

解决方案&#xff1a; 打开终端&#xff08;winr 输入cmd回车&#xff09;执行 pip install pyscreeze 再执行&#xff1a;pip install pillow

详解并掌握AXI4总线协议(四)、AXI4_FULL_SLAVE接口源码分析以及仿真验证

系列文章目录 详解并掌握AXI4总线协议&#xff08;一&#xff09;、AXI4-FULL接口介绍 详解并掌握AXI4总线协议&#xff08;二&#xff09;、AXI4_FULL_MASTER接口源码分析以及仿真验证 详解并掌握AXI4总线协议&#xff08;三&#xff09;、基于AXI4_FULL接口的BRAM读写仿真验…

免费好用!阿里这5款AI神器,太强了,打工人必备!(建议收藏)

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 《黑神话&#xff1a;悟空》太爆了&#xff01;最近感觉都要被…

Eclipse部署一个项目到Tomcat和部署多个项目到Tomcat

Eclipse部署一个项目到Tomcat&#xff1a; https://blog.csdn.net/weixin_42334396/article/details/105902994 Eclipse部署多个项目到Tomcat&#xff1a; https://blog.csdn.net/zhanglin1220/article/details/82056185 使用cmd方法强制关闭端口&#xff0c;解除端口占用方法&…

2.初识springcloud

文章目录 1.什么是SpringCloud1.1版本的介绍 2.Spring Cloud实现方案3.环境搭建4.服务拆分原则5.数据准备5.1订单服务5.2商品服务 大家好&#xff0c;我是晓星航。今天为大家带来的是 初识springcloud 相关的讲解&#xff01;&#x1f600; 1.什么是SpringCloud 简单来说&…

Excel表格添加趋势线_数据拟合

一个曲线通过补偿算法拟合为另一个曲线&#xff0c;通常可以通过多种数学和计算技术实现。这里也可以通过Excel表格添加趋势线&#xff0c;然后对趋势线进行拟合&#xff0c;得到趋势预测公式来达到数据补偿。 通过把你需要的数据导入到Excel表格中。 通过 “ 插入 ” --> “…

从单一到互联:KNX网关如何改变你的家居生活

从单一到互联&#xff1a;KNX网关如何改变你的家居生活 在科技日新月异的今天&#xff0c;家居生活正经历着一场前所未有的变革。从过去单一、孤立的设备操作&#xff0c;到如今智能、互联的生态系统&#xff0c;KNX网关作为这一转变的关键角色&#xff0c;正悄然改变着我们的日…

探索Unity3D URP后处理在UI控件Image上的应用

探索Unity3D URP后处理在UI控件Image上的应用 前言初识URP配置后处理效果将后处理应用于UI控件方法一&#xff1a;自定义Shader方法二&#xff1a;RenderTexture的使用 实践操作步骤一&#xff1a;创建RenderTexture步骤二&#xff1a;UI渲染至RenderTexture步骤三&#xff1a;…

养宠家庭一定要试 希喂、美的两大品牌宠物空气净化器性能对比

随着养宠家庭的增多&#xff0c;宠物市场上产品也在不断丰富。这段时间最热门的产品非宠物空气净化器莫属&#xff0c;讨论度非常高&#xff0c;大家对它的评价褒贬不一。作为三只毛孩子的家长&#xff0c;它们的毛发清理问题一直令我头大&#xff0c;所以决定试试号称专为吸附…

科技守护健康:氧气检测仪的工作原理与应用深探

科技守护健康&#xff1a;氧气检测仪的工作原理与应用深探 在科技飞速进步的今天&#xff0c;我们身边的许多设备都融入了科技的智慧&#xff0c;其中氧气检测仪便是守护人类健康与安全的重要一环。它以其独特的工作原理&#xff0c;在工业生产、医疗护理等多个领域发挥着至关重…

数字图像处理【15】特征检测——SIFT特征检测

一、引入SIFT算法 上一篇文章我们重温学习了Harris角点检测算法的基本原理&#xff0c;但在实际生产使用Harris检测角点的时候&#xff0c;会发现一个问题&#xff0c;就是用于检测的输入图像的尺寸大小会直接影响到Harris的检测结果。这是为什么呢&#xff1f;主要是Harris角…

引领未来的NVR方案:海思3520D芯片与全套NVR模组源代码解析

随着视频监控技术的发展&#xff0c;NVR&#xff08;网络视频录像机&#xff09;已成为安全保障系统的核心设备。市场上NVR芯片方案主要由几大厂商主导&#xff0c;其中海思35XX系列在中高端市场占据主导地位&#xff0c;特别适用于图像处理和多种应用场景。 我们研发了一款基…

探索提示工程 Prompt Engineering的奥妙

一、探索提示工程 1. 介绍通用人工智能和专用人工智能 人工智能&#xff08;AI&#xff09;可以分为通用人工智能&#xff08;AGI&#xff09;和专用人工智能&#xff08;Narrow AI&#xff09;。AGI是一种能够理解、学习和执行任何人类可以完成的任务的智能。与此相对&#x…