PCL 使用ICP点云拼接

一、简介

ICP算法详解——我见过最清晰的解释_负壹的博客-CSDN博客

两个点集,source和target,target不变,source经过旋转(Rotation)和平移(Translation)甚至加上尺度(Scale)变换,使得变换后的source点集尽量和target点集重合,这个变换的过程就叫点集配准。

  但是ICP的使用方法精度比较差,假如将一个原始点云在X方向上移动一定的距离(或者对原始点云进行降采样),然后进行配准分数也会有很大的差异,并且得到的旋转平移矩阵也差异比较大。

二、基本原理

假设用Qi,i=1,2,3,⋯Qi,i=1,2,3,⋯表示第一个点集,Pi,i=1,2,3,⋯Pi,i=1,2,3,⋯表示第二个点集。

ICP配准过程:


1.计算原始点云P中的每个点对于在匹配点云Q的最近点

2、 计算对应点的平均最小距离,计算R T 矩阵

3、对原始点云P进行RT转换得到P2

4、计算P2与Q之间的平均最小距离,继续迭代。

提示:这里的目标函数的要求,也可以是迭代次数
 

 20130518113251019 (752×606)

 

识别步骤:

1、分别找到两个点云数集中的兴趣点或者关键点

2、计算特征描述符

3、分别计算p1(x,y,z) p2(x,y,z)计算特征和位置之间的相关性,通过迭代测试来计算

4、计算之前一定要去除掉点云上面的噪声,ICP是暴力迭代的方法,计算内容是全部点云中的点

5、从特征点总找到一个匹配最好的特征计算出旋转平移矩阵


迭代最近点 Iterative Closest Point (ICP)

PCL学习笔记二:Registration (ICP算法)_rabbif的博客-CSDN博客

 ICP采用最小二乘法的最优配准方法,此算法重复进行点之间的对应关系,计算出一个刚性变换,知道满足收敛的精度。

	// ICP配准
	pcl::IterativeClosestPoint<pcl::PointXYZ,pcl::PointXYZ>icp; // 创建ICP对象  用来ICP配准
	//icp.setMaxCorrespondenceDistance(0.1);  // 
	icp.setTransformationEpsilon(0.1);  // 前一个变换矩阵和当前变换矩阵的差异小于阈值时,就认为已经收敛了,是一条收敛条件
	icp.setEuclideanFitnessEpsilon(0.01);  // 还有一条收敛条件是均方误差和小于阈值, 停止迭代
	icp.setMaximumIterations(10);  // 最大迭代次数
	icp.setInputCloud(cloud_tr);
	icp.setInputTarget(cloud_in);  // 输入目标点云
	icp.align(*cloud_icp);  //配准后的点云

transformation estimation是基于SVD的, SVD是奇异值分解 

基本过程


对于目标点云中的每个点,匹配参考点云(或选定集合)中的最近点。
求得使上述对应点对计算均方根(root mean square,RMS)最小的刚体变换,求得平移参数和旋转参数。
使用获得的转换矩阵来转换目标点云。
迭代(重新关联点),直到满足终止迭代的条件(迭代次数或误差小于阈值)。这里的误差最小,可以是相邻两次均方根差的绝对值小于某一限差。
 

三、代码:

添加头文件

#define BOOST_TYPEOF_EMULATION  //要加在#include <pcl/registration/icp.h>前
#include <pcl/registration/icp.h>   //ICP配准类相关头文件

 

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);// 原始点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_icp(new pcl::PointCloud<pcl::PointXYZ>);  // ICP 输出点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_tr(new pcl::PointCloud<pcl::PointXYZ>);   // 匹配点云
	string strfilepath = "C:\\Users\\Albert\\Desktop\\Binary.pcd";
	if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud_in)) {
		cout << "error input!" << endl;
		return -1;
	}
	cout << cloud_in->points.size() << endl;


	string strfilepath2 = "C:\\Users\\Albert\\Desktop\\Binary2.pcd";
	//if (-1 == pcl::io::loadPCDFile(strfilepath2, *cloud_icp)) {
	//	cout << "error input!" << endl;
	//	return -1;
	//}

	pcl::PointXYZ point;
	for (int i = 0; i < cloud_in->size();i++)
	{
		 point.x= cloud_in->points[i].x + 10;
		 point.y = cloud_in->points[i].y;
		 point.z = cloud_in->points[i].z;
		 cloud_icp->push_back(point);
	}
	cout << cloud_icp->points.size() << endl;

	pcl::io::savePCDFileBinaryCompressed(strfilepath2,*cloud_icp);

	int  iterations = 3;// 默认的ICP的迭代次数
	*cloud_tr = *cloud_icp;

	// ICP配准
	pcl::IterativeClosestPoint<pcl::PointXYZ,pcl::PointXYZ>icp; // 创建ICP对象  用来ICP配准
	//icp.setMaxCorrespondenceDistance(0.1);  // 
	icp.setTransformationEpsilon(0.1);  // 前一个变换矩阵和当前变换矩阵的差异小于阈值时,就认为已经收敛了,是一条收敛条件
	icp.setEuclideanFitnessEpsilon(0.01);  // 还有一条收敛条件是均方误差和小于阈值, 停止迭代
	icp.setMaximumIterations(10);  // 最大迭代次数
	icp.setInputCloud(cloud_tr);
	icp.setInputTarget(cloud_in);  // 输入目标点云
	icp.align(*cloud_icp);  //配准后的点云




	
	if (icp.hasConverged())//icp.hasConverged ()=1(true)输出变换矩阵的适合性评估
	{
		std::cout << "\nICP has converged, score is " << icp.getFitnessScore() << std::endl;
	}
	else
	{
		PCL_ERROR("\nICP has not converged.\n");
		return (-1);
	}

	cout<<icp.getFinalTransformation();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何监控和诊断JVM堆内和堆外内存使用?

第26讲 | 如何监控和诊断JVM堆内和堆外内存使用&#xff1f; 上一讲我介绍了 JVM 内存区域的划分&#xff0c;总结了相关的一些概念&#xff0c;今天我将结合 JVM 参数、工具等方面&#xff0c;进一步分析 JVM 内存结构&#xff0c;包括外部资料相对较少的堆外部分。 今天我要…

简单三步解决动态规划难题,记好这三步,动态规划就不难

目录一、简单的一维DP剑指 Offer 10- I. 斐波那契数列1、三板斧解决问题2、优雅的解决问题剑指 Offer 63 股票的最大利润1、三板斧解决问题2、优雅的解决问题二、进阶的二维DP剑指offer47 礼物的最大价值1、三板斧解决问题2、优雅的解决问题编辑距离1、三板斧解决问题2、优雅的…

图神经网络的数学原理总结

图深度学习(Graph Deep Learning) 多年来一直在加速发展。许多现实生活问题使GDL成为万能工具&#xff1a;在社交媒体、药物发现、芯片植入、预测、生物信息学等方面都显示出了很大的前景。 本文将流行的图神经网络及其数学细微差别的进行详细的梳理和解释&#xff0c;图深度学…

JavaSE思维导图——总结篇

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;学习时长两年半的java博主 &#x1f39f;️个人主页&#xff1a;君临๑ ps&#xff1a;点赞是免费的&#xff0c;却可以让写博客的作者开心好几天&#x1f60e; 进入正题。关于Java专栏的规划如下 写作计划&#xff1a;大概一…

前端已死?后端已亡?弯弯绕绕,几分真几分假

前段时间&#xff0c;我在掘金分享了一篇GPT-4 性能文章&#xff0c;也许是过于强大带来的威胁性&#xff0c;引来评论区的排队哀嚎&#xff08;如下图&#xff09;&#xff0c;所以“前端已死&#xff0c;后端已亡”这个概念真的成立吗&#xff1f;本文着重探讨前端。 前端和后…

GIS应用技巧之图斑四至坐标计算

一、前言某些时候需要计算图斑的四至坐标&#xff0c;其实坐标不仅在CAD中可以实现&#xff0c;在GIS中同样可以实现这个目标&#xff0c;通常来说&#xff0c;实现的过程其实相对比较简单&#xff0c;主要通过Python的代码去实现&#xff0c;具体按照下面的做法。二、具体步骤…

【Linux】环境变量(基本概念 常见环境变量 测试PATH 环境变量相关命令)

文章目录环境变量基本概念常见环境变量测试PATH别的环境变量通过系统调用获取或设置环境变量环境变量相关命令export: 设置一个新的环境变量set: 显示本地定义的shell变量和环境变量unset: 清除环境变量通过代码如何获取环境变量环境变量 基本概念 环境变量(environment vari…

RK3588平台开发系列讲解(视频篇)RTP H264 码流打包详解

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、单 NALU 封包方式二、组合封包方式三、分片封包方式沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 H264 码流是放在 RTP 的有效载荷部分的。因此有效载荷前面的 RTP 头部跟码流本身是没有关系的,所以我…

硬件速攻-AT24CXX存储器

AT24C02是什么&#xff1f; AT24CXX是存储芯片&#xff0c;驱动方式为IIC协议 实物图&#xff1f; 引脚介绍&#xff1f; A0 地址设置角 可连接高电平或低电平 A1 地址设置角 可连接高电平或低电平 A2 地址设置角 可连接高电平或低电平 1010是设备前四位固定地址 &#xf…

常见背包问题

一.前言若你想学习或正在学习动态规划&#xff0c;背包问题一定是你需要了解的一种题型&#xff0c;并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门。背包问题分为多种&#xff0c;你可以先掌握最常见的主要是三类&#xff1a;01背包、完全背包、多重背包二.分析…

三月份跳槽了,历经字节测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试字节的测试开发工程师的时候&#xff0c;灵魂拷问三小…

centos7安装mysql5.7.4(rpm安装版)与 MySQL5.7.4glibc版Linux安装

目录1.下载mysql5.7的rpm安装包2.上传mysql安装包到centos7的系统下3.安装依赖3.1 查看linux上是否已经安装了mysql,有则卸载。3.2 安装mysql5.7所需要的依赖4.安装mysql5.74.1 解压mysql5.7安装包4.2 安装mysql5.74.3 查看mysql5.7的状态,没有启动则把mysql启动4.4 修改密码4.…

如何设计一个锂电池充电电路(TP4056)

这个是个单节18650锂电池的充电模块&#xff0c;这个是个18650的锂电池&#xff0c;18指的是它的直径是18mm&#xff0c;65指的是它的高度为65mm。这个18650电池的标称电压是3.7V&#xff0c;电池充满时电压为4.2V&#xff0c;一般电池电压越高也就代表它所剩的电量越大。这种锂…

最好用的Markdown编辑器:MWeb Pro mac

MWeb pro Mac中文版是一款非常好用的Markdown编辑器和博客生成工具&#xff0c;支持语法高亮&#xff0c;预览&#xff0c;Fenced code blocks和代码高亮&#xff0c;Math ML支持&#xff0c;具有导出HTML/PDF&#xff0c;自定编辑器主题&#xff0c;字数统计&#xff0c;大纲视…

CSS实现文字凹凸效果

使用两个div分别用来实现凹凸效果&#xff1b;text-shadow语法 text-shadow: h-shadow v-shadow blur color; h-shadow&#xff1a;必需。水平阴影的位置。允许负值。 v-shadow &#xff1a;必需。垂直阴影的位置。允许负值。 blur&#xff1a;可选&#xff0c;模糊的距离。 co…

第十四届蓝桥杯第三期模拟赛 【python】

第十四届蓝桥杯第三期模拟赛 【python】 文章目录第十四届蓝桥杯第三期模拟赛 【python】✨最小的十六进制&#xff08;python的16进制&#xff09;❓️问题描述答案提交&#x1f9e0;思路&#x1f5a5;︎参考答案✨Excel的列&#xff08;进制转化&#xff09;❓️问题描述答案…

你真的会写软件测试计划吗?所有测试工作者都在找的软件测试计划模板在这

目录 1引言 1.1编写目的 1.2背景 1.3定义 1.4参考资料 2计划 2.1软件说明 2.2测试内容 2.3测试1&#xff08;标识符&#xff09; 2.3.1进度安排 2.3.2条件 2.3.3测试资料 2.3.4测试培训 2.4测试2&#xff08;标识符&#xff09; 3测试设计说明 3.1测试1&#x…

如何将pdf文件压缩?pdf压缩软件哪个好

PDF是一种常见的文档格式&#xff0c;因为包括文本格式和图像&#xff0c;我们往往采用这种格式进行文件传输和分享&#xff0c;但是也常常会因为pdf文件过大导致使用起来非常不方便&#xff0c;那么如何如何将pdf文件压缩&#xff08;https://www.yasuotu.com/pdfyasuo&#x…

百度CTO王海峰:全栈AI技术加持,打造新一代大语言模型文心一言

3月16日&#xff0c;百度在北京总部召开新闻发布会&#xff0c;百度创始人、董事长兼首席执行官李彦宏和百度首席技术官王海峰出席&#xff0c;李彦宏展示了新一代知识增强大语言模型文心一言在文学创作、商业文案创作、数理逻辑推算、中文理解、多模态生成五个使用场景中的综合…

【数据分析之道①】字符串

文章目录专栏导读1、字符串介绍2、访问字符串中的值3、字符串拼接4、转义字符5、字符串运算符6、字符串格式化7、字符串内置函数专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领域知识。 ✍ 本文录入于《数据分析之…
最新文章