点云数据介绍

news2024/9/23 19:21:14

本篇内容

  • 通过PCD文件介绍点云数据
  • 如何通过PCL库读取和保存PCD点云数据文件

1 点云数据

最简单的点云数据就是一堆三维坐标点(x,y,z),除了坐标还可以记录每个点的颜色信息(r,g,b),或者强度信息(intensity)等

2 PCD文件详解

把一个pcd文件放入vscode中,如下图所示:
PS:要保证pcd文件是通过ascii类型,如果是二进制类型,通过vscode打开则是乱码
在这里插入图片描述

  1. VERSION
    指定pcd文件的版本
  2. FIELDS
    指定数据区每个数据所代表的意义,从上述示图中可以看到,数据区每行有4个float类型的数字,通过空格隔开,分别代表x坐标、y坐标、z坐标、强度值
  3. SIZE
    指定每个数据所占用的字节大小,float类型占用4个字节
  4. TYPE
    指定每个数据的类型,F代表float
  5. COUNT
    抱歉,不知道代表什么意义,但是平时也没用到
  6. WIDTH
    对于无序点云,WIDTH等于点云总数量;对于有序点云(通过深度相机采集),WIDTH等于图像宽度
  7. HEIGHT
    对于无序点云,HEIGHT等于1;对于有序点云,HEIGHT等于图像高度
  8. POINTS
    点云总数量
  9. VIEWPOINT
    指定观测视角,例如通过pcl_viewer打开pcd文件时,通过VIEWPOINT可以决定默认是从左边观测或是从其他方向观测。它本质上是一个位姿,由平移tx,ty,tz和四元数qw,qx,qy,qz组成
  10. DATA
    指定数据类型:ascii或binary

3 通过PCL读取点云文件

3.1 理解点云类型

大家对C++的vector很熟悉,声明一个vector变量方式如下:

std::vector<int> v;	//一个存储一堆int类型数据的vector

在PCL库中声明一个用于保存点云数据的变量方式如下:

pcl::PointCloud<pcl::PointXYZ> cloud;	//一个存储一堆pcl::PointXYZ类型数据的PointCloud

pcl::PointXYZ等价于int,用于描述每个点的类型,示例中就表示每个点只包含(x,y,z)坐标。Pcl库还提前定义了很多点云类型,这些点云类型对应了第2节中的FIELDS,FIELDS包含较多的信息,就可以更换对应的点云类型,通常至少会包含x,y,z,如下图所示:

在这里插入图片描述

3.2 读取点云文件流程

声明点云变量:

  • 由于点云文件通常占用内存较大,因此一般申请为指针
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

读取点云文件:

pcl::io::loadPCDFile<pcl::PointXYZ>(pcd_file_path, *cloud);

保存点云文件:

pcl::io::savePCDFileASCII(pcd_save_path, *cloud);

调试过程:
通过cloudcompare软件打开需要读取的pcd文件,可以看到这份pcd文件包含了397个点
在这里插入图片描述
代码debug,成功读取:
在这里插入图片描述

4 完整代码

#include <string>
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

int main(int argc, char **argv)
{
  if (argc < 3) {
    std::cout<<"Usage: ./read_pcd <pcd_file_path> <pcd_save_path>\n";
    return -1;
  }

  std::string pcd_file_path(argv[1]);
  std::string pcd_save_path(argv[2]);
  
  // 声明变量,用于保存点云数据
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

  // 读取pcd点云文件
  if (pcl::io::loadPCDFile<pcl::PointXYZ>(pcd_file_path, *cloud) == -1) {
    std::cerr<<"check pcd path\n";
    return -1;
  }

  // 打印点云info
  std::cout<<"pcd size:"<<cloud->size()<<"\n";
  std::cout<<"pcd width:"<<cloud->width<<"\n";
  std::cout<<"pcd height:"<<cloud->height<<"\n";

  // 保存点云数据
  pcl::io::savePCDFileASCII(pcd_save_path, *cloud);

  return 0;
}

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

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

相关文章

【Asio网络编程】socket的监听和连接

文章目录 一、VS2019配置boost库二、 网络编程基本流程三、 终端节点的创建3.1 客户端终端节点3.2 服务端终端节点 四、 创建SOCKET4.1 客户端创建socket4.2 服务端创建socket4.3 绑定acceptor 五、 连接5.1 客户端连接5.2 客户端通过域名连接(了解即可&#xff0c;用的少)5.2 …

使用 curl_cffi 解决 Web 抓取中的 TLS/JA3 指纹识别方法

在网站抓取过程中遇到反爬虫措施而苦苦挣扎&#xff1f;curl_cffi 是一个高级 Python 库&#xff0c;它包装了 cURL 工具&#xff0c;可以帮助您有效地绕过这些障碍。通过模拟浏览器行为并利用 cURL 的功能&#xff0c;curl_cffi 增强了您的抓取器避免检测并顺利执行的能力。在…

索迪迈科技油罐车监控系统中车载摄像头的布局策略

随着科技的不断发展&#xff0c;车载监控系统在油罐车上的安装已经成为了一种趋势。这不仅大大降低了车辆的安全隐患与运营成本&#xff0c;更对石油运输企业优化资源配置、提高市场竞争力起到了积极的促进作用。那么&#xff0c;在油罐车监控系统中&#xff0c;如何合理布局车…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现根据每次触发信号移动感兴趣区域ROI(Python)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现根据每次触发信号移动感兴趣区域ROI&#xff08;Python&#xff09; Baumer工业相机Baumer工业相机定序器功能的技术背景Baumer工业相机通过NEOAPI SDK使用定序器功能预期的相机动作测试的图像效果 Baumer工业相机通过NEOAPI S…

LoRA - 大型语言模型的低秩适应方法

人工智能咨询培训老师叶梓 转载标明出处 大规模预训练模型&#xff0c;如GPT-3&#xff0c;拥有高达1750亿参数&#xff0c;全参数微调不仅计算成本高昂&#xff0c;而且部署和维护多个微调实例变得非常困难。而且全参数微调需要大量的GPU内存&#xff0c;限制了同时训练的模型…

go 切片slice学习总结

切片的结构 切片的底层结构&#xff1a; type SliceHeader struct {Data uintptr // 指向底层数组的指针 Len int //长度Cap int //空间容量 } 切片的初始化 1 通过数组或者已有的slice创建新的slice 1.1 使用数组创建切片 通过数组的一部分来初始化切片。 …

fixed、absolute 和 relative 布局

https://andi.cn/page/621716.html

计算机视觉编程 1(图片处理)

目录 灰色度 缩略图 拷贝粘贴区域 调整图像尺寸 旋转图像45 画图线、描点 灰色度 灰度是指图像中每个像素的亮度值&#xff0c;用来描述图像中各个像素的明暗程度。在计算机视觉中&#xff0c;灰度可以通过以下方式来计算&#xff1a; 1. 平均值法&#xff1a;将图像中每…

核心技术揭秘:AI、低代码与定制开发的三重奏,如何应对复杂业务需求

背景介绍 在当今迅速发展的数字化时代&#xff0c;企业面临的业务环境变得日益复杂和多变。无论是面对不断变化的市场需求&#xff0c;还是处理海量数据并从中获取洞察力&#xff0c;企业都需要快速响应并灵活调整自身的策略。传统的开发模式在应对这种复杂性时往往显得力不从心…

大模型提示词工程技术2-设计有效的提示词技巧、角色与上下文在提示中的应用

大模型提示词工程技术2-设计有效的提示词技巧、角色与上下文在提示中的应用。《大模型提示词工程技术》的作者&#xff1a;微学AI&#xff0c;这是一本专注于提升人工智能大模型性能的著作&#xff0c;它深入浅出地讲解了如何通过优化输入提示词来引导大模型生成高质量、准确的…

技术赋能数字化转型:百数低代码平台在试点城市的应用与实践

在当今信息化高速发展的时代&#xff0c;数字化转型已成为城市和企业发展的必然趋势。为了推动这一进程&#xff0c;数字化转型城市试点政策应运而生。“据了解&#xff0c;中央财政将对每个试点城市给予1亿元资金奖补&#xff0c;支持中小企业实施数字化改造&#xff0c;以数字…

5 - ZYNQ GPIO

文章目录 0 前言1 GPIO基本概念1.1 MIO-EMIO基本介绍1.2 MIO-EMIO连接情况 0 前言 本文来参考博主徐晓康的博文 ZYNQ7000-GPIO详解&#xff0c;仅作为个人学习记录。 1 GPIO基本概念 在ZYNQ中&#xff0c;GPIO&#xff08;General Purpose Input/Output&#xff0c;通用输入…

嵌入式RTOS正在缩小与Linux系统之间的差异

RTOS与Linux的物联网设备操作系统之争已经持续了很多年。Linux以其强大的计算能力和丰富的软件生态,在需要复杂处理和软件支持的物联网设备上占据一席之地;RTOS凭借实时响应和资源节约的特性,在对实时性和资源占用有严格要求的场景中独领风骚。 如果时间倒回五年前,那…

[C++] C++11详解 (三)类的成员函数、完美转发

标题&#xff1a;[C] C11详解 &#xff08;三&#xff09;完美转发与lambda表达式 水墨不写bug 目录 一、C11新增两个类的默认成员函数 1.强制生成默认函数的关键字default: 2.禁止生成默认函数的关键字delete: 二、完美转发 正文开始&#xff1a; 一、C11新增两个类的默…

【YOLO5 项目实战】(8)PyQt5 图形界面—PCB缺陷检测系统

欢迎关注『youcans动手学模型』系列 本专栏内容和资源同步到 GitHub/youcans 【YOLO5 项目实战】&#xff08;8&#xff09;PyQt5 图形界面—PCB缺陷检测系统 1. PyQt5 图形界面开发工具1.1 PyQt5 的安装1.2 在 PyCharm 集成 QtDesigner 和 PyUIC1.3 使用 QtDesigner 开发 PyQt…

EPLAN在安装完成之后,输入文字时出现卡顿和死机的解决办法

EPLAN在安装完成之后,输入文字时出现卡顿和死机的解决办法 EPLAN在安装完成之后,插入文字时有时会卡顿,甚至出现软件卡死,无任何反映的情况,具体的解决办法可参考以下内容: 找到电脑右下角的输入法,右击进入设置, 如下图所示,点击进入常规设置, 如下图所示,向下找…

终于!我找到了开发的得力助手!阿里云天池云原生编程挑战赛参赛攻略

作者&#xff1a;ysevenk_7 参赛准备 我是机缘巧合在 6 月底了解到了天池云原生编程挑战赛&#xff0c;于是乎搜了一下&#xff0c;之前本人对于比赛并没有太多经验&#xff0c;看了大赛介绍之后莫名兴奋&#xff0c;果断拉了队友报名&#xff0c;完成认证、起队名、下载插件…

【STM32】RS485

RS485是常见的串口接口。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 串口、UART、TTL、RS232、RS422、RS485的关系 1.1 串口 1.2 UART、TTL、RS232、RS422、RS485 1.3 常见串口标准的比较 …

Apache Arrow 的列式内存格式

Apache Arrow 的列式存储格式是一种内存数据组织标准&#xff0c;它通过物理布局、Array&#xff08;数组&#xff09;、Schema&#xff08;模式&#xff09;和 RecordBatch&#xff08;记录批次&#xff09;等&#xff0c;优化了大数据的存储与处理。这种格式以列而非行来存储…

更改网络ip地址时出现错误怎么办

在日常的网络使用中&#xff0c;‌有时我们需要更改IP地址以满足特定的网络需求&#xff0c;‌然而&#xff0c;‌在更改IP地址的过程中&#xff0c;‌可能会遇到各种错误&#xff0c;‌导致无法成功更改或网络连接出现问题。‌‌而更改网络IP地址时出现错误是由于多种原因导致…