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()的返回值。
    在大多数实现中,这个分数通常是平均平方误差,所以较低的分数意味着两个点云之间的对应点的距离较近,表明配准的质量较高。

补充内容

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

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

相关文章

人工智能论文GPT-3(3):2020.5 Language Models are Few-Shot Learners;架构;训练数据集;开源

2.1 模型与架构 我们使用了与GPT-2相同的模型和架构&#xff0c;包括其中描述的改进初始化、预归一化和可逆分词技术&#xff0c;但有所不同的是&#xff0c;我们在Transformer的各层中使用了交替的密集和局部带状稀疏注意力模式&#xff0c;类似于Sparse Transformer 。为了研…

普通人切入抖音的黄金赛道 软件自动生成文字动画视频 3天15个作品涨粉5000

文字动画&#xff0c;就是导入一段文字&#xff0c;用软件可以自动生成一条文字动画视频&#xff0c;因为这是软件自动生成的&#xff0c;所以过原创的话是很简单没什么问题的。 这种视频的特点是什么? 首先第一点就是非常简单&#xff0c;找好素材直接导入软件就可以自动生成…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

【CSAPP/计组】#1 数的存储与表示方法、机器中浮点数加减法详解

文章目录 前言一、定点格式定点整数 二、浮点数的表示方法2.1 浮点数存储2.2 浮点数加减法a. 操作数检查b. 对阶c. 尾数相加与检查溢出d. 结果规格化与溢出处理e.舍入处理 Some tips: 为什么进位/双符号判断法有效的通俗解释&#xff1f;Some tips:符号位拓展 前言 计算机中常…

【图论 单源最短路】100276. 最短路径中的边

本文时间知识点 单源最短路 图论知识汇总 LeetCode100276. 最短路径中的边 给你一个 n 个节点的无向带权图&#xff0c;节点编号为 0 到 n - 1 。图中总共有 m 条边&#xff0c;用二维数组 edges 表示&#xff0c;其中 edges[i] [ai, bi, wi] 表示节点 ai 和 bi 之间有一条…

Java 初学者必看 最全详细入门指南(一)

--------------------------------------------------------------------- 1.AIGC未来发展前景 未完持续… 1.1 人工智能相关科研重要性 拥有一篇人工智能科研论文及专利软著竞赛是保研考研留学深造以及找工作的关键门票&#xff01;&#xff01;&#xff01; 拥有一篇人工…

C++ 程序的内存分配

C 程序的内存分配 C 程序的内存分配栈堆数据区程序代码区参考 C 程序的内存分配 一个 C 编译的程序占用内存分为以下几个部分&#xff08;从高地址到低地址&#xff09;&#xff1a; 内核空间&#xff1a;由操作系统创建并控制&#xff0c;用户代码不能读写。栈&#xff1a;由…

文件系统和软硬链接

文章目录 文件系统磁盘磁盘逻辑抽象inode 软硬链接软链接硬链接 文件系统 文件分为打开的文件和没有被打开的文件&#xff0c;而只有打开的文件是在内存的&#xff0c;也就是我们之前讲的&#xff0c;然而大部分文件都不是被打开的(当前不需要被访问的)&#xff0c;它们都在磁…

arping命令详解

arping – send ARP REQUEST to a neighbour host. arping 是一个在网络中发送 ARP 请求以查找特定 IP 地址对应的 MAC 地址的命令行工具。它的功能类似于 ping 命令&#xff0c;基于ARP协议报文的交互机制&#xff0c;只能测试同一网段或子网的网络主机的连通性。 ARP 是 Add…

中国人的谦逊与生俱来

中国人的谦逊是与生俱来的&#xff0c;我们从老子的《道德经》就能探知一二&#xff1a; 一、不自夸、不自傲 《道德经》原文&#xff1a;自见者不明&#xff1b;自是者不彰&#xff1b;自伐者无功&#xff1b;自矜者不长。&#xff08;第二十四章&#xff09; 译文&#xff…

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置&#xff0c;部署&#xff0c;和管理被控节点的剧本。   通过 playbook 的详细描述&#xff0c;执行其中的一系列 tasks &#xff0c;可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…

AI助力科研创新与效率双提升:ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

Virtualenv:Python项目管理的救星

在Python的世界里&#xff0c;依赖包冲突是开发者的噩梦&#xff0c;但也是成长的催化剂。最近在写Python项目中就碰到了这样的问题&#xff0c;明明代码在自己的电脑上表现都是正常的&#xff0c;在另外一台电脑上却始终有些小问题&#xff0c;两台电脑安装的Python版本都是一…

(1)认识人工智能

第一章 认识人工智能 引言 本人目前大三&#xff0c;双非一本的人工智能专业&#xff0c;代码能力不算太差&#xff0c;做过项目&#xff0c;也打了比赛&#xff0c;获了奖&#xff0c;但是走技术路线总会有否定自己的感觉&#xff0c;可能是感觉自己的才能没有在搞技术方面实…

java-Spring-入门学习-第二天(单例模式和多例模式)

目录 Bean作用域 单例模式(默认可以不写) Spring下的 AutoWired 依赖注入 JaveEE下的 Resource 依赖注入 多例模式 Bean作用域 ​在Spring框架中&#xff0c;Bean是按照作用域来创建的&#xff0c;常见的作用域有两种&#xff1a;Singleton 和 Prototype。Singleton (单例…

数据结构----顺序表

在学习顺序表之前&#xff0c;我们先来了解一下数据结构。 数据是什么呢&#xff1f; 我们在生活中常见的名字&#xff0c;数字&#xff0c;性别等都属于数据。 结构又是什么呢&#xff1f; 在计算机中&#xff0c;结构就是用来保存数据的方式。 总的来说&#xff0c;数据…

anaconda配置的环境对应的地址查看,环境安装位置

打开conda指令窗口 这个和上面的都一样&#xff0c;哪个都行 点开后&#xff0c;输入 conda env list 这里显示的就是自己的每个环境对应的地址了

OpenCV杂记(1):绘制OSD(cv::getTextSize, cv::putText)

1. 简述 我们使用OpenCV时&#xff0c;有时会在图像的某个位置绘制OSD信息&#xff0c;如绘制一些字符串作为指示信息。 本文将简要介绍在图像&#xff08;cv::Mat&#xff09;上绘制固定的字符串信息。 2. 使用的API &#xff08;1&#xff09;cv::getTextSize() CV_EXPORT…

C++模板template(二十一)

在C的模板体现了一种泛型编程的思想&#xff0c;当我们不确定要传入的参数是何种数据类型时我们可以写一个模板类型来代替&#xff0c;当传入参数时才将类型告诉它。模板也是属于一种静态多态&#xff0c;&#xff0c;模板的不同类型发生在编译时。泛型编程&#xff1a;不是针对…

react中useState的值没有改变,而是旧的数值

问题背景 想实现点击按钮就改变数据的效果&#xff0c;但是在控制台的打印结果&#xff0c;总是上一次的修改情况&#xff0c;并不是最新的修改后的数据 代码&#xff1a; import { useState, useRef } from "react";// 实现sonA的数据传递给sonB const SonA () …