PCL 点云配准衡量指标

news2024/12/26 21:15:30

0. 简介

PCL作为目前最为强大的点云库,内部存在有大量集成好的算法。而对于数据量大、非同源、含大量噪声且部分重叠的激光点云与影像重建点云,其稀疏程度、噪声程度等不同,非重叠区域的面积很大。真实场景的点云尤其是影像重建点云噪声较多,提取的法向量误差也很大,有的时候NDT和ICP并不能形成良好的匹配,这个时候我们该怎么样评估通过IPC或NDT算出的变换矩阵来估算出算法的精度呢?这个时候就需要通过均方根误差以及重合度来综合评判结果了。

1. 从Cloudcompare对点云配准进行了解

Cloudcompare是一个开源的免费点云处理软件,可以实现常用的点云处理功能,使用也是简单方便。官网网址为http://www.cloudcompare.org/,由于其良好的可视化,这里我们来从这个软件开始,向读者来介绍配准的一些基础概念。
首先,我们打开安装好的cloudcompare,打开要配准的点云文件。这里使用斯坦福的兔子点云。
选中45°点云,改变颜色(edit–>colors–>set unique,或者快捷键alt+c)
在这里插入图片描述
选中两个点云,点击配准按钮,参考点云(reference)选择0°,重叠度改成70%(不同数据视情况而定,这里目测70%重叠差不多),精度(RMS difference)没改变。
在这里插入图片描述
在这里插入图片描述
此时,我们就可以快捷的拿到我们想要的配准结果了。在上面我们注意到在Cloudcompare中提到了两个重要的概念,分别是重叠度和精度(均方根误差)。而这也是我们下面文章中主要介绍的内容。

2. 均方根误差(RMSE)

下面这部分的内容是计算方根误差的,其中内部主要是通过kd-tree完成了dist的搜索,从而计算出最近邻匹配点对欧氏距离的平方,并最终拿到我们的RMSE,从而评判出点云的重合性。

float caculateRMSE(pcl::PCLPointCloud2::Ptr& cloud_source, pcl::PCLPointCloud2::Ptr& cloud_target)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr xyz_source(new pcl::PointCloud<pcl::PointXYZ>());
	fromPCLPointCloud2(*cloud_source, *xyz_source);
	pcl::PointCloud<pcl::PointXYZ>::Ptr xyz_target(new pcl::PointCloud<pcl::PointXYZ>());
	fromPCLPointCloud2(*cloud_target, *xyz_target);

	float rmse = 0.0f;

	pcl::KdTreeFLANN<pcl::PointXYZ>::Ptr tree(new pcl::KdTreeFLANN<pcl::PointXYZ>());
	tree->setInputCloud(xyz_target);

	for (auto point_i : *xyz_source)
	{
		// 去除无效的点
		if (!pcl_isfinite(point_i.x) || !pcl_isfinite(point_i.y) || !pcl_isfinite(point_i.z))
			continue; 
		pcl::Indices nn_indices(1);
		std::vector<float> nn_distances(1);
		if (!tree->nearestKSearch(point_i, 1, nn_indices, nn_distances)) // K近邻搜索获取匹配点对
			continue;
		/*dist的计算方法之一
		size_t point_nn_i = nn_indices.front();
		float dist = squaredEuclideanDistance(point_i, xyz_target->points[point_nn_i]);
		*/

		float dist = nn_distances[0]; // 获取最近邻对应点之间欧氏距离的平方
		rmse += dist;                 // 计算平方距离之和
	}
	rmse = std::sqrt(rmse / static_cast<float> (xyz_source->points.size())); // 计算均方根误差

	return rmse;
}

// ---------------------------计算均方根误差------------------------------
//auto Rmse= caculateRMSE(cloud_source, cloud_target);
//cout << "配准误差为:" << Rmse << endl;

3. 重合率计算

下面的代码提供了两种方法计算匹配的区域的点云的重合率,分别使用CorrespondenceEstimation以及kd-tree来实现了点云重合率的计算,当然现在的PCL算法已经自带了均方误差以及变换矩阵和当前变换矩阵的差性等情况,但是这也不妨碍我们通过RMSE以及重合率来单帧分析问题所在

…详情请参照古月居

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

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

相关文章

用javascript分类刷leetcode23.并查集(图文视频讲解)

并查集&#xff08;union & find&#xff09;&#xff1a;用于处理一些元素的合并和查询问题 Find&#xff1a;确定元素属于哪一个子集&#xff0c;他可以被用来确定两个元素是否属于同一个子集&#xff0c;加入路径压缩&#xff0c;复杂度近乎O(1) Union&#xff1a;将两…

如何在 ESXi 7.x 上安装 Windows Server 2019

安装 Windows Server 2019 连接 ESXi 7.0上传 Windows Server 2019 镜像创建虚拟机安装 Windows Server 2019在本文中,我们将逐步在 ESXi 7.x 上安装 Windows Server 2019。 连接 ESXi 7.0 使用 VMware 主机或 vSphere Web 客户端连接到 VMware vSphere Hypervisor 7.0(ESX…

Unity-ROS与话题与服务(二)

0. 简介 对于ROS而言&#xff0c;其最常用的就是Topic话题以及Service两个了。之前我们在了解Unity Robotics Hub时候就了解到基本的Unity和ROS的通讯&#xff0c;下面我们来详细介绍一下Unity与ROS的话题与服务。 ROS和Unity之间的通信是通过Unity的“ROS-TCP-Connector”软…

Linux学习07-vim程序编辑器

1 vi与vim vi 是老式的文书处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则可以说是程序开发者的一项很好用的工具&#xff0c;就连 vim 的官方网站 &#xff08;http://www.vim.org&#xff09; 自己也说 vim 是一个“程序开发工具”而…

服务器内存CPU负载监控

1&#xff0c;系统平均负载(Load average)&#xff1a; 系统平均负载被定义为在特定时间间隔内运行队列中的平均进程树&#xff0c;一般来说只要每个CPU的当前活动进程数不大于3那么系统的性能就是良好的&#xff0c;如果每个CPU的任务数大于5&#xff0c;那么就表示这台机器的…

SpringBoot+MDC实现链路调用日志

1.首先介绍什么是MDC MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 、logback及log4j2 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的哈希表&#xff0c;可以往其中添加键值对。MDC 中包含的…

毕业设计 STM32自行车智能无线防盗报警器 -物联网 单片机 嵌入式

0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过…

【C++进阶】C++11新特性下篇(万字详解)

&#x1f387;C学习历程&#xff1a;入门 博客主页&#xff1a;一起去看日落吗持续分享博主的C学习历程博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 也许你现在做的事情&#xff0c;暂时看不到成果&#xff0c;但不要忘记&…

京东前端高频vue面试题(边面边更)

Redux 和 Vuex 有什么区别&#xff0c;它们的共同思想 &#xff08;1&#xff09;Redux 和 Vuex区别 Vuex改进了Redux中的Action和Reducer函数&#xff0c;以mutations变化函数取代Reducer&#xff0c;无需switch&#xff0c;只需在对应的mutation函数里改变state值即可Vuex由…

【树莓派】擦灰重启行动

高中时候看大佬各种秀项目&#xff0c;于是乎兴致冲冲买了一块树莓派4B&#xff0c;400r&#xff0c;当时没想到光是开机&#xff0c;就折腾了两个星期~后来不出意外它在房间的角落很安逸地吃灰&#xff0c;但是&#xff0c;后来&#xff0c;我误打误撞学了CS&#xff0c;再误打…

Okhttp源码分析实践(五)【实践环节:Okhttp的基本框架搭建请求实现】

http的基础知识、okhttp的框架基本源码,我们通过之前课程都已学习总结过,接下来,就是关键的实践课程。 各位coder,需要紧跟小编脚步,要开始加速飙车了。 1.基本框架的搭建实现 既然不知道如何入手,我们不妨就以okhttp的基本使用代码为例,作为入手点,去开始编程实现。…

机器学习理论介绍

前言 图灵奖获得者、著名数据库专家James Gray 博士观察并总结人类自古以来&#xff0c;在科学研究上&#xff0c;先后历经了实验、理论、计算和数据四种范式。 科学研究第一种范式&#xff1a;实验 在古代&#xff0c;人们的认知水平较低&#xff0c;对事物的认识很大程度上…

React redux使用

1.redux是什么 redux是一个专门用于状态管理的JS库&#xff08;不是react插件库&#xff09; 它可以用在react,angular,vue等项目中&#xff0c;但基本与react配合使用 作用&#xff1a;集中式管理react应用中多个组件共享的状态 2.为什么要使用redux 某个组件的状态&#…

Windows命令行到底有多强大?

程序员宝藏库&#xff1a;https://gitee.com/sharetech_lee/CS-Books-Store DevWeekly收集整理每周优质开发者内容&#xff0c;包括开源项目、资源工具、技术文章等方面。 每周五定期发布&#xff0c;同步更新到 知乎&#xff1a;Jackpop。 欢迎大家投稿&#xff0c;提交issu…

高可用系列文章之三 - NGINX 高可用实施方案

前文链接 高可用系列文章之一 - 概述 - 东风微鸣技术博客 (ewhisper.cn)高可用系列文章之二 - 传统分层架构技术方案 - 东风微鸣技术博客 (ewhisper.cn) 四 NGINX 高可用实施方案 高可用的实施, 主要步骤概述如下: NGINX 的安装及基础配置负载均衡层高可用: NGINX Keepali…

在BSV上运行深度神经网络

我们已经实现了一个用于手写数字分类的深度神经网络。已经训练好的模型完全在链上运行。它使用手写数字的 MNIST 数据集进行离线训练。该模型采用 28x28 灰度像素的图像并输出 0 到 9 的数字。 深度神经网络简介 人工神经网络是受生物神经网络启发而构建的。网络通过接触大量带…

[附源码]计算机毕业设计Python的小说阅读系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

智云通CRM:如何正确的提出报价?(一)

智云通CRM认为完成销售包括三个步骤&#xff1a;提出报价&#xff0c;解决最后问题&#xff0c;讨论下一步方案。 第一步是提出报价&#xff0c;首先我们讨论如何将提出报价。 在与客户讨论费用问题时&#xff0c;我们应当向客户提出两个不同报价&#xff0c;一个销售方案对应…

前缀和与差分算法

目录 一 前缀和 算法定义 算法分类 算法作用 一维前缀和 问题引入 暴力法&#xff1a; 前缀和法&#xff1a; 算法原理 问题解答 算法实践 江山白日梦 题目描述 题目解答 二维前缀和 问题引入 算法原理 问题解答 二 差分 算法定义 算法分类 算法作用 一…