Ubuntu 20.04.06 PCL C++学习记录(二十六)

@[TOC]PCL中点云配准模块的学习

学习背景

参考书籍:《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,,PCL版本为1.10.0,CMake版本为3.16,可用点云下载地址

学习内容

在代码中使用ICP迭代最近点算法,程序随机生成一个点与作为源点云,并将其沿x轴平移后作为目标点云,然后利用ICP估计源到目标的刚体变换橘子,中间对所有信息都打印出来。在 ICP 配准过程中,算法会迭代地寻找源点云和目标点云之间的最佳变换矩阵,使得两个点云之间的距离最小化。

源代码及所用函数

源代码

//迭代最近点算法
#include<iostream>//标准输入输出头文件
#include<pcl/io/pcd_io.h>//PCD输入输出头文件
#include<pcl/point_types.h>//点类型定义头文件
#include<pcl/registration/icp.h>//ICP(迭代最近点)配准算法头文件。
int main()
{//**********************************************初始化点云并填充打印***************************************//pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>(5,1));pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_out (new pcl::PointCloud<pcl::PointXYZ>);//*******************填充点云第一种写法**************************//// // 随机填充点云// cloud_in->width    = 5;               //设置点云宽度// cloud_in->height   = 1;               //设置点云为无序点// cloud_in->is_dense = false;// cloud_in->points.resize (cloud_in->width * cloud_in->height);// for (size_t i = 0; i < cloud_in->points.size(); i++)// {//     cloud_in->points[i].x = 1024.0f*rand()/(RAND_MAX +1.0f);//     cloud_in->points[i].y = 1024.0f*rand()/(RAND_MAX +1.0f);//     cloud_in->points[i].z = 1024.0f*rand()/(RAND_MAX +1.0f);// }//*********************填充点云第二种方法**********************//for (auto& point : *cloud_in){point.x = 1024 * rand() / (RAND_MAX + 1.0f);point.y = 1024 * rand() / (RAND_MAX + 1.0f);point.z = 1024 * rand() / (RAND_MAX + 1.0f);}//打印点云std::cout << "已保存:" << cloud_in->points.size () << "个点,其坐标为:" << std::endl;//*******************打印点云第一种方法************************//// for (size_t i = 0; i < cloud_in->points.size (); ++i)// {//     std::cout << "    " << cloud_in->points[i].x << " " << cloud_in->points[i].y << " " << cloud_in->points[i].z << std::endl;// }//******************打印点云的第二种方法***********************//for (auto& point : *cloud_in){std::cout << point << std::endl;    }//****************************************实现一个简单的点云刚体变换,以构造目标点云******************************//*cloud_out = *cloud_in; std::cout << "点云大小:" << cloud_out->size() << std::endl;for (auto& point : *cloud_out){point.x += 0.7f;}std::cout << "转移了 " << cloud_in->size () << "个点" << std::endl;for(auto& point : *cloud_out){std::cout << point << std::endl;}pcl::IterativeClosestPoint<pcl::PointXYZ,pcl::PointXYZ> icp;//创建IterativeClosestPoint的对象icp.setInputSource(cloud_in); //cloud_in设置为点云的源点icp.setInputTarget(cloud_out);//cloud_out设置为与cloud_in对应的匹配目标pcl::PointCloud<pcl::PointXYZ> Final;//存储经过配准变换点云后的点云icp.align(Final);//打印配准相关输入信息std::cout << "已收敛" << icp.hasConverged() << "总共" << icp.getFitnessScore() << std::endl;std::cout << icp.getFinalTransformation() << std::endl;return 0;}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16 FATAL_ERROR)#指定CMake的最低版本要求为3.16
project(project)#设置项目名称
find_package(PCL 1.10 REQUIRED)#查找PCL库,要求版本为1.10或更高。
include_directories(${PCL_INCLUDE_DIRS})#将PCL库的头文件目录添加到包含路径中
link_directories(${PCL_LIBRARY_DIRS})#将PCL库的库文件目录添加到链接器搜索路径中。
add_definitions(${PCL_DEFINITIONS})#添加PCL库的编译器定义
add_executable (iterative_closest_point iterative_closest_point.cpp)
target_link_libraries (iterative_closest_point ${PCL_LIBRARIES})#将PCL库链接到可执行文件目标。

运行结果

在这里插入图片描述红色是随机生成点云,绿色是ICP配准后的点云
在这里插入图片描述

函数

  • icp.hasConverged() 是 PCL 库中 IterativeClosestPoint 类的一个成员函数,用于检查 ICP 配准算法是否收敛。hasConverged() 函数返回一个布尔值,表示 ICP 算法是否达到了收敛条件。当 ICP 算法满足收敛条件时,hasConverged() 函数将返回 true,表示配准过程已经完成,得到了最佳的变换矩阵。

  • icp.getFitnessScore()是ICP(迭代最近点)算法中的一个函数,用于计算当前变换矩阵的适应度得分(Fitness Score)用来评估当前变换矩阵的性能。具体来说,getFitnessScore()通常会计算以下指标:
    对应点之间的欧氏距离之和或均值。距离越小,说明对齐效果越好。
    内点(Inlier)的数量或比例。内点指的是在一定误差范围内匹配的点对。内点越多,说明对齐效果越好。
    误差的标准差。误差越集中,说明对齐更加一致。

    关于返回值的大小通常有两种常见的情况:
    得分越小越好:如果getFitnessScore()返回的是误差或距离的度量,如对应点之间的欧氏距离之和或均值,则得分越小表示对齐效果越好。在这种情况下,ICP算法的目标是最小化getFitnessScore()的返回值。
    得分越大越好:如果getFitnessScore()返回的是内点的数量、比例或其他表示对齐质量的指标,则得分越大表示对齐效果越好。在这种情况下,ICP算法的目标是最大化getFitnessScore()的返回值。
    在大多数实现中,这个分数通常是平均平方误差,所以较低的分数意味着两个点云之间的对应点的距离较近,表明配准的质量较高。

补充内容

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

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

相关文章

2024上海(国际)智慧氧舱暨生物细胞博览会

2024上海(国际)智慧氧舱暨生物细胞博览会 时间 2024年9月21日-23日 地址 上海市浦东新区张江科学会堂 展会亮点 展示国内外医疗器械行业最新发展动态&#xff0c;探讨医疗器械行业发展趋势促进医疗 器械行业健康发展将为全国从事微高压氧舱、医用气调库及其他医用设备、医…

二极管分类及用途

二极管分类及用途 通用开关二极管 特点&#xff1a;电流小&#xff0c;工作频率高 选型依据&#xff1a;正向电流、正向压降、功耗&#xff0c;反向最大电压&#xff0c;反向恢复时间&#xff0c;封装等 类型&#xff1a;BAS316 ; IN4148WS 应用电路: 说明&#xff1a;应用…

【Linux】引导过程与服务控制

目录 一、Linux操作系统引导过程 1.linux开机引导过程 2.系统初始化进程 1.init进程 2.进程启动方式 二、运行级别和Systemd单元类型 1.运行级别 2.Systemd 三、启动类故障恢复 1.修复MBR扇区故障 2.修复GRUB引导故障 3.root密码忘记的修改方式 四、系统服务控制 …

MATLAB求和函数

语法 S sum(A) S sum(A,“all”) S sum(A,dim) S sum(A,vecdim) S sum(,outtype) S sum(,nanflag) 说明 示例 S sum(A) 返回沿大小大于 1 的第一个数组维度计算的元素之和。 如果 A 是向量&#xff0c;则 sum(A) 返回元素之和。 如果 A 是矩阵&#xff0c;则 sum(A) 将…

配置静态路由实现全网互通

1、实验环境 如图下所示&#xff0c;三台路由器R1&#xff0e;R2&#xff0c;R3两两互连&#xff0c;每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由&#xff0c;以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

UI5 快速入门教程

环境准备 node >16.8 ,VSCode&#xff0c;官方网址 开始 创建一个根文件夹&#xff0c;根文件中创建一个package.json文件 {"name": "quickstart-tutorial","private": true,"version": "1.0.0","author":…

【JavaWeb】Day51.Mybatis动态SQL

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

flutter 实现表单的封装包含下拉框和输入框

一、表单封装组件实现效果 //表单组件 Widget buildFormWidget(List<InputModel> formList,{required GlobalKey<FormState> formKey}) {return Form(key: formKey,child: Column(children: formList.map((item) {return Column(crossAxisAlignment: CrossAxisAlig…

java优先级队列(堆)详解

一、优先级概念 什么是优先级&#xff1a;比如女士优先&#xff0c;个子低的优先排到前面去&#xff0c;有一部分数据具备优先级&#xff0c;要以优先级的顺序将顺序存储起来。 前面介绍过队列&#xff0c;队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#…

Java:String类

目录 1.String类的重要性2.String对象的比较2.1 比较是否引用同一个对象2.2 boolean equals(Object anObject) 方法&#xff1a;按照字典序比较2.3int compareTo(String s)方法: 按照字典序进行比较2.4 boolean equalsIgnoreCase(Object anObject)方法&#xff1a;忽略大小写的…

word批量修改表格样式

利用宏&#xff0c;批量选中表格&#xff0c;然后利用段落和表设计来操作。 利用宏&#xff0c;批量选中表格&#xff0c;参考百度安全验证段落&#xff0c;表格里面的内容有空格&#xff0c;应该是有缩进&#xff0c;在段落中去掉缩进&#xff0c;即缩进-特殊&#xff0c;选择…

node的事件循环

异步同步啥的就不多说了&#xff0c;直接看node中有哪些是异步 其中灰色部分和操作系统有很大的关系&#xff0c;就不多说了&#xff0c;其中定时器属于timers队列&#xff0c;I/O操作属于poll队列&#xff0c;setImmediate属于check队列&#xff0c;其中nextTick和promise不属…

【Java IO】那字节流和字符流有什么区别?

&#x1f331;以贴近现实的【面试官面试】形式涵盖大部分Java程序员需要掌握的后端知识、面试问题&#xff0c;系列博客收录在我开源的JavaGetOffer中&#xff0c;会一直完善下去&#xff0c;希望收到大家的 ⭐️ Star ⭐️支持&#xff0c;这是我创作的最大动力&#xff1a; h…

2024团体程序设计天梯赛L1-101 别再来这么多猫娘了!

题目链接L1-101 别再来这么多猫娘了&#xff01; #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; string s[105], text; int n, k, ans, a[5005];int main() { // ios::s…

第21天:信息打点-公众号服务Github监控供应链网盘泄漏证书图标邮箱资产

第二十一天 一、开发泄漏-Github监控 1.短期查看 1.密码搜索 根据攻击目标的域名在GitHub上进行搜索密码&#xff0c;如果目标网站的文件与搜索到的源码相关&#xff0c;那就可以联想目标网站是否使用这套源码进行开发 原理就是开发者在上传文件的时候忘记更改敏感文件或者…

利用FFmpeg 转换课程vtt 字幕到 srt字幕

字幕转换工具 经常学习udemy 视频课程的&#xff0c;可能知道&#xff0c;从网络下载的udemy 课程文件里面有时候字幕是vtt 格式的&#xff0c;有时候想导入到百度网盘里面&#xff0c;怎奈百度网盘&#xff0c;不支持vtt 字幕格式。有字幕的时候&#xff0c;会比较好多了。既可…

【机器学习】《ChatGPT速通手册》笔记

文章目录 第0章 前言第1章 ChatGPT的由来&#xff08;一&#xff09;自然语言处理任务&#xff08;二&#xff09;ChatGPT所用数据数据大小&#xff08;三&#xff09;ChatGPT的神经网络模型有175亿个参数&#xff08;四&#xff09;模型压缩 方案 第2章 ChatGPT页面功能介绍&a…

日期相关的题目

日期相关的题目 1. 计算日期到天数转换2. 日期累加3. 打印日期4. 日期差值 1. 计算日期到天数转换 输出示例: 思路&#xff1a;计算前n-1个月的天数在加上这个月的天数。 #include <iostream> using namespace std;int main() {int year, month, day;cin >> yea…

llama2 与 llama3比较

Llama 3 刚刚在4月18号推出&#xff0c;距 Llama 2 发布正好 9 个月。它已经可以在 Meta 网站上进行聊天&#xff0c;可以从 Huggingface 以 safetensors 或 GGUF 格式下载。 llama 2 与 llama3 比较 1. 模型输出&#xff08;model output&#xff09; llama 2 输出只能是文本…

const成员函数 以及 取地址及const取地址操作符重载

目录 const成员函数 结论&#xff1a; 取地址及const取地址操作符重载 const成员函数 将const 修饰的 “ 成员函数 ” 称之为 const成员函数 &#xff0c; const 修饰类成员函数&#xff0c;实际修饰该成员函数的&#xff08;*this&#xff09; &#xff0c;表明在该成员函数…