PCL点云库(2) — IO模块

news/2024/4/26 6:22:53/文章来源:https://blog.csdn.net/qq_41921826/article/details/130286950

目录

2.1 IO模块接口

2.2 PCD数据读写

(1) PCD数据解析

(2)PCD文件读写示例

2.3 PLY数据读写

(1)PLY数据解析

(2)PLY文件读写示例

2.4 OBJ数据读写

(1)OBJ数据解析

(2)OBJ文件读写示例

2.5 VTK数据读写

(1)VTK数据解析

(2)VTK文件读写示例

2.6 保存为PNG


2.1 IO模块接口

参考文章:PCL函数库摘要——IO模块_pcl/io_悠缘之空的博客-CSDN博客

(1)Class pcl::FileReader

类FileReader定义了PCD文件的读取接口,主要用做其他读取类的父类。

(2)Class pcl::FileWriter

类FileWriter 与 FileReader对应,是写人PCD文件的类接口定义,可以作为其它写入类的父类。

(3)Class pcl::Grabber

类Grabber为PCL1.X对应的设备驱动接口的基类定义。

(4)Class openni_wrapper::OpenNIDevice

类OpenNIDevice定义OpenNI设备的基类,继承该基类可以实现不同的OpenNI设备子类,用于获取包括红外数据、RGB数据、深度图像数据等。

(5)Class openni_wrapper::DeviceKinect

(6)Class openni_wrapper::DevicePrimesense

(7)Class openni_wrapper::DeviceXtionPro

以上3个类分别封装了Kinect,Primesense,XtionPro相关设备操作和数据获取操作实现,其详细接口参考其父类OpenNIDevice的关键函数说明。

(8)Class openni_wrapper::DeviceONI

封装了利用ONI文件回放虚拟类kinect设备的操作和数据获取操作实现,其详细接口参考其父类OpenNIDevice的关键函数说明。

(9)Class openni_wrapper::OpenNIDriver

类OpenNIDriver采用单例模式实现对底层驱动的封装,里面包含一xn::Context对象,提供给所有设备使用。该类提供了枚举和访问所有设备的方法实现。

(10)Class openni_wrapper::OpenNIException

类OpenNIException封装一般的异常处理实现。

(11)Class openni_wrapper::Image

类Image是简单的图像数据封装基类。

(12)Class openni_wrapper::ImageBayerGRBG

(13)Class openni_wrapper::ImageRGB24

(14)Class openni_wrapper::ImageYUV422 Class Reference

以上3个类分别实现了对原始数据 BayerGRBG ,RGB24、YUV422到图像转化接口,详细参考其父类关键函数说明。

(15)Class pcl::OpenNIGrabber

类OpenNIGrabber 实现对OpenNI设备(例如Primesense PSDK,MicrosoftKinect,Asus XTion Pro/Live)数据的采集接口,详细参考其父类Grabber 关键函数说明。

(16)Class pcl::PCDReader

(17)Class pcl::PLYReader

以上两个类分别是PCD、PLY文件格式读入接口的实现,详细参考其父类pcl: :FileReader。

(18)Class pcl::PLYWriter

(19)Class pcl::PCDWriter

以上两个类分别是PCD、PLY文件格式写出接口的实现,详细参考其父类pcl: :FileWriter。

(20)Class pcl::io::IOException

类pcl::io::IOException 是I/O相关的异常处理接口实现,详细参考其父类PCLEx-ception。

(21)I/O模块其他关键成员

2.2 PCD数据读写

(1) PCD数据解析

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7
FIELDS x y z _
SIZE 4 4 4 1
TYPE F F F U
COUNT 1 1 1 4
WIDTH 112099
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 112099
DATA binary
  • VERSION 0.7:指定pcd文件的版本。
  • FIELDS:指定每个点可以具有的维度,以及每个维度所代表的含义。例如:FIELDS x y z r g b表示该点的位置信息(x,y,z),颜色信息(r,g,b)。
  • SIZE:以字节为单位指定每个数据所占用的内存。
  • TYPE:指定每个数据的数据类型。其中无效的点的通常存储为NAN类型。

            I:可表示int8,int16,int32。
            U:可表示uint8,unit16,uint32。
            F:表示float(上图所用的为浮点类型)。

  • COUNT:指定每个维度有多少元素。例如xyz数据通常只有一个元素。
  • WIDTH:指定数据点的宽度,它包含两个含义:(1)可指定点云总个数(与POINTS相同),用于无组织的数据。(2)可指定有组织点云数据的宽度(连续点的总数)。
  • HEIGTH: 指定数据点的高度,它包含两个含义:(1)可指定有组织的点云数据的高度(总行数)。(2)对未组织的数据,它被设置为1。
  • POINTS:指定点云总个数。
  • VIEWPOINT:采集数据时的视点(由平移tx,ty,tz和四元数qw,qx,qy,qz组成)。
  • DATA:点云数据存储的数据类型(支持ascii和binary)。如果以ASCII形式,每一点占据一个新行。

(2)PCD文件读写示例

cmake_minimum_required(VERSION 2.6)
project(pcd)find_package(PCL 1.10 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(pcd pcd.cpp)target_link_libraries (pcd ${PCL_LIBRARIES})install(TARGETS pcd RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std;int main()
{pcl::PCDReader reader;pcl::PCLPointCloud2 org;pcl::io::loadPCDFile("../pcdfile.pcd",org);for(auto &f : org.fields)cout << f.name;pcl::PointCloud<pcl::PointXYZ> cloud;pcl::fromPCLPointCloud2<pcl::PointXYZ>(org,cloud);pcl::PCDWriter writer;pcl::io::savePCDFileBinaryCompressed("../savepcdfile.pcd",cloud);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);viewer->setWindowName("PCDFile");viewer->addPointCloud(cloud.makeShared());while (!viewer->wasStopped()){viewer->spinOnce(100);}return 0;
}

2.3 PLY数据读写

(1)PLY数据解析

典型的PLY文件结构:

  • 头部
  • 顶点列表
  • 面片列表
  • 其他元素列表
ply
format ascii 1.0
element vertex 14806
property float x
property float y
property float z
property float nx
property float ny
property float nz
element face 0
property list uchar int vertex_indices
end_header
0.91441 -0.536438 0.822624 -0.0442205 -0.930906 0.362575
0.933494 -0.545228 0.820276 0.073409 -0.981856 0.174844
...

(2)PLY文件读写示例

cmake_minimum_required(VERSION 2.6)
project(ply)find_package(PCL 1.10 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(ply ply.cpp)target_link_libraries (ply ${PCL_LIBRARIES})install(TARGETS ply RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/ply_io.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std;int main()
{pcl::PCLPointCloud2 cloud;pcl::io::loadPLYFile("../ply.ply",cloud);pcl::PLYReader reader;pcl::PLYWriter writer;pcl::PointCloud<pcl::PointXYZ> cloud1;pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud,cloud1);pcl::io::savePLYFile("saveply.ply",cloud,Eigen::Vector4f::Zero (),Eigen::Quaternionf::Identity (),true);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);viewer->setWindowName("PLYFile");pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloud1.makeShared(), "y");viewer->addPointCloud(cloud1.makeShared(),color);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2);while(!viewer->wasStopped())viewer->spinOnce(100);return 0;
}

2.4 OBJ数据读写

(1)OBJ数据解析

mtllib cube.mtl
g default
v -0.500000 -0.500000 0.500000
v 0.500000 -0.500000 0.500000
v -0.500000 0.500000 0.500000
v 0.500000 0.500000 0.500000
v -0.500000 0.500000 -0.500000
v 0.500000 0.500000 -0.500000
v -0.500000 -0.500000 -0.500000
v 0.500000 -0.500000 -0.500000
vt 0.001992 0.001992
vt 0.998008 0.001992
vt 0.001992 0.998008
vt 0.998008 0.998008
...

mtllib:代表材质库,通常指向到某个mtl文件

  • v(vertices):几何形状的顶点,因为物体是由面构成的,而面是由线构成的,线由点构成的,所以无论是何形状,都必须要有几何顶点;一些应用支持顶点颜色,通过在x y z后面跟上red, green, blue值来表示。颜色值的范围为0到1.0。
  • vt(vertex texture):顶点纹理,代表当前顶点对应纹理图的哪个像素,通常是0-1,如果大于1,就相当于将纹理重新扩充然后取值,比如镜像填充、翻转填充之类的,然后根据纹理图的宽高去计算具体像素位置
  • vn(vertex normal):顶点法线,物理里面有说过眼睛看到物体是因为光线经过物体表面反射到眼睛,所以这个法线就是通过入射光线计算反射光线使用的法线。
  • f(face):大部分几何体都包括面,除非是像头发丝那一类模型只包含一根根头发的顶点,而且大部分模型的头发也用的面片的方法渲染的。

        其他参考:obj格式解析_obj格式详解_风翼冰舟的博客-CSDN博客

(2)OBJ文件读写示例

cmake_minimum_required(VERSION 2.6)
project(obj)find_package(PCL 1.10 REQUIRED)include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(obj obj.cpp)target_link_libraries (obj ${PCL_LIBRARIES})install(TARGETS obj RUNTIME DESTINATION bin)
#include <iostream>#include <pcl/point_cloud.h>
#include <pcl/io/obj_io.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std;int main()
{pcl::PolygonMesh mesh;pcl::PCLPointCloud2 cloud;pcl::TextureMesh tmesh;#if 0pcl::io::loadOBJFile("../obj.obj",cloud);pcl::io::loadOBJFile("../obj.obj",mesh);pcl::io::loadOBJFile("../obj.obj",tmesh);
#elsepcl::OBJReader objreader;objreader.read("../obj.obj",cloud);objreader.read("../obj.obj",mesh);objreader.read("../obj.obj",tmesh);
#endifpcl::io::saveOBJFile("../saveobj.obj",mesh);pcl::PointCloud<pcl::PointXYZ> cloudxyz;pcl::fromPCLPointCloud2<pcl::PointXYZ>(cloud,cloudxyz);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);viewer->setWindowName("OBJFile");pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloudxyz.makeShared(), "z");viewer->addPointCloud(cloudxyz.makeShared(),color);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2);viewer->addPolygonMesh(mesh);while(!viewer->wasStopped())viewer->spinOnce(100);return 0;
}

2.5 VTK数据读写

(1)VTK数据解析

# vtk DataFile Version 2.0
vtk output
ASCII
DATASET POLYDATA
POINTS 2312 float
0.263107 0 0.425176 0.33131 0 0.374478 0.389942 0 0.312962 
0.43731 0 0.242405 0.472045 0 0.164845 0.493143 0 0.0825238 
  • 第一行是说明vtk文件的version(这是legacy 版本,此外还有较新的xml版本)
  • 第二行是文件描述,随便写什么
  • 第三行是ASCII或者BINARY
  • 第四行是说明数据类型,有STRUCTURED_POINTS,STRUCTURED_GRID,RECTILINEAR_GRID,POLYDATA
  • 后面为数据,它分为三个部分:POINTS 点数据,CELSS 网格数据,CELL_TYPES网格类型
     

(2)VTK文件读写示例

cmake_minimum_required(VERSION 2.6)
project(vtkfile)find_package(PCL 1.10 REQUIRED)
find_package(VTK REQUIRED)include(${VTK_USE_FILE})
link_directories(${VTK_LIBRARY_DIRS})include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})add_executable(vtkfile vtkfile.cpp)target_link_libraries (vtkfile ${PCL_LIBRARIES} ${VTK_LIBRARIES})
target_link_libraries (vtkfile ${VTK_LIBRARIES})install(TARGETS vtkfile RUNTIME DESTINATION bin)
#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/vtk_io.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/io/obj_io.h>using namespace std;int main()
{pcl::PCLPointCloud2 cloud;pcl::PolygonMesh mesh,mesh1,mesh2;#if 0pcl::io::loadPolygonFile("../vtk.vt",mesh);
#elsepcl::io::loadPolygonFileVTK("../vtk.vtk",mesh);pcl::io::loadPolygonFileVTK("../vtk.vtk",mesh2);
#endifpcl::PointCloud<pcl::PointXYZ> cloudxyz;pcl::fromPCLPointCloud2<pcl::PointXYZ>(mesh.cloud,cloudxyz);pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);viewer->setWindowName("VTKFile");pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloudxyz.makeShared(),"y");viewer->addPointCloud(cloudxyz.makeShared(),color);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,3);viewer->addPolygonMesh(mesh);while(!viewer->wasStopped())viewer->spinOnce(100);return 0;
}

2.6 保存为PNG

#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/png_io.h>
#include <pcl/visualization/pcl_visualizer.h>using namespace std;int main()
{pcl::PCDReader reader;pcl::PCLPointCloud2 org;pcl::io::loadPCDFile("../cow.pcd",org);for(auto &f : org.fields)cout << f.name << endl;pcl::PointCloud<pcl::PointXYZ> cloud;pcl::fromPCLPointCloud2<pcl::PointXYZ>(org,cloud);pcl::io::savePNGFile("../savepng.png",cloud,"rgb");pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> color(cloud.makeShared(), "z");pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer);viewer->setWindowName("savePNG");viewer->addPointCloud(cloud.makeShared(),color);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE,2);while(!viewer->wasStopped())viewer->spinOnce(100);return 0;
}}

 

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

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

相关文章

C语言指针2大问题:指针类型有什么用?指针如何运算?

如题&#xff0c;本篇博客主要解决2个疑点&#xff1a;指针类型的用处&#xff0c;指针如何运算。 1.指针类型 C语言中的指针类型&#xff0c;在X86环境下大小是4个字节&#xff0c;在X64环境下大小是8个字节。既然指针的大小和指针类型无关&#xff0c;那么指针类型究竟有什么…

银行系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 ​​​​​​​ 本系统源码地址&#xff1a;​​​​​​​https://download.csdn.net/download/qq_50…

从零开始写ChatGLM大模型的微调代码

cursor 的下载及安装&#xff08;免费版每月100次&#xff0c;升级pro 20刀/月&#xff09; cursor是一款与openai合作的&#xff0c;使用gpt-4的一款编程工具&#xff0c;它可以让你通过gpt-4进行辅助编程&#xff0c;以此提高效率。 下载地址&#xff1a;https://www.curso…

USART串口协议和USART串口外设(USART串口发送串口发送和接收)

1、通信接口 • 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 • 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 异步&#xff1a;需要双方约定一个频率 2、 硬件电路 • 简单双向串口通信有两根通信…

【Unity-ML】Unity机器学习(一)

安装环境&#xff1a;Windows10 Anaconda3(64-bit)&#xff0c;网上很多教程&#xff0c;例如这个anaconda下载及安装(保姆级教程) - 知乎anaconda包管理器和环境管理器&#xff0c;强烈建议食用 1.下载官网下载太慢可选用镜像下载 官网下载&#xff1a; Anaconda | Individua…

〖ChatGPT实践指南 - 零基础扫盲篇④〗- OpenAI API 相关介绍、提示-Prompt 与 完成-Completion

文章目录 ⭐ OpenAI API介绍⭐ 提示-Prompt 与 完成-Completion 介绍 这一章节将为各位小伙伴介绍一下 OpenAI 的 API 相关内容&#xff0c;以及在 ChatGPT 中两个经常被用来比较的名词&#xff1a;“提示-prompt” 与 “完成-completion”。 ⭐ OpenAI API介绍 OpenAI API 概…

JavaScript常用方法整理

文章目录 前言1.栈方法&#xff1a;push()、pop()2.队列方法&#xff1a;unshift()、shift()3.indexof()、lastIndexOf()、includes()4.操作方法&#xff1a;concat()、slice()、splice()5.Array.isArray()6.排序方法:sort()、reverse()7.转换方法&#xff1a;toString()、join…

【Winform学习笔记(二)】TextBox文本框实现按回车键触发Button事件

TextBox文本框实现按回车键触发Button事件 前言正文1、实现方法2、具体代码3、实现效果 前言 在本文中主要介绍 如何基于 Winform 框架实现 TextBox 文本框实现按回车键触发 Button 事件&#xff0c;该功能可实现在文本框中输入密码后不需要按登录或确定按钮&#xff0c;直接回…

vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

什么是postMessage postMessage是html5引入的API,它允许来自不同源的脚本采用异步方式进行有效的通信,可以实现跨文本文档,多窗口,跨域消息传递.多用于窗口间数据通信,这也使它成为跨域通信的一种有效的解决方案. vue父页面&#xff08;嵌入iframe的页面&#xff09; 在vue中…

webAPI学习笔记2(DOM事件高级)

1. 注册事件&#xff08;绑定事件&#xff09; 1.1 注册事件概述 给元素添加事件&#xff0c;称为注册事件或者绑定事件。 注册事件有两种方式&#xff1a;传统方式和方法监听注册方式 传统注册方式 利用 on 开头的事件 onclick <button οnclick“alert(hi~)”><…

如何构建可靠的台账数据——详解台账管理系统的使用方法

随着数字化的发展&#xff0c;越来越多的企业开始采用电子台账管理&#xff0c;实现了对各项业务数据的及时准确保存和管理。而在台账管理应用中&#xff0c;发票管理、工单管理和库房台账是三大重要方面。下面我将详细介绍一下台账管理系统。 一、发票管理 1.收票台账报表 …

【Python小技巧】使用Gradio构建基于ChatGPT的 Web 应用(附源码)

文章目录 前言一、Gradio是什么&#xff1f;二、使用Gradio构建基于ChatGPT的 Web 应用1. 安装gradio库2. 安装openai库&#xff08;ChatGPT的python库&#xff09;3. Web 应用示例&#xff08;源代码&#xff09; 总结 前言 随着人工智能的不断发展&#xff0c;各种智能算法越…

UE4架构初识(五)

UE4仿真引擎学习 一、架构基础 1. GameInstance UE提供的方案是一以贯之的&#xff0c;为我们提供了一个GameInstance类。为了受益于UObject的反射创建能力&#xff0c;直接继承于UObject&#xff0c;这样就可以依据一个Class直接动态创建出来具体的GameInstance子类。 UGam…

【Golang项目实战】手把手教你写一个备忘录程序|附源码——建议收藏

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Go语言核心编程近期目标&#xff1a;写好专栏的每一篇文章 前几天瑶瑶子…

blender 制作城市建筑模型

我不是很会用blender 但是他可以直接制作一篇区域的建筑模型 BlenderGIS插件 城市建筑3D模型自动生成 教程_Zhichao_97的博客-CSDN博客 学习了两种 一种是通过geo.json自己加了一堆mesh 或者geometry 自己用three 做的模型 另一种是用blender 做一个整个的模型直接导入进去 …

降低风险和最大化成功:如何解决项目管理中的成本差异

作为项目经理&#xff0c;你知道让项目按计划进行并按预算进行对于项目管理的成功至关重要。你可以使用的关键工具之一是成本差异分析。但成本差异到底是什么&#xff0c;如何利用它来发挥优势呢&#xff1f; 定义成本差异 成本差异是项目实际成本与预算或计划成本之间的差异…

企业本地文档如何实现规范在线管理?

随着企业数字化生产方式的不断推进&#xff0c;网络办公和在线协作越来越普遍&#xff0c;企业内部可能出现大量的文件和文档&#xff0c;这些文档多存在于不同的设备和存储介质上&#xff0c;这给企业的信息管理带来了一定程度的困难。为了提高企业的知识管理效率&#xff0c;…

【大数据之Hadoop】二十、Yarn基础框架及工作机制

1、Yarn基础框架 Yarn是一个资源调度平台&#xff0c;负责为运算程序提供服务器运算资源&#xff0c;相当于一个分布式的操作系统平台&#xff0c;而MapReduce等运算程序则相当于运行于操作系统之上的应用程序。 YARN主要由ResourceManager、NodeManager、ApplicationMaster和…

修炼汇编语言第二章:内存地址空间(概述)

目录 前言 一、主板和接口卡 二、存储器各类芯片 三&#xff1a;内存地址空间 总结 前言 什么是内存地址空间呢&#xff1f;如果地址线为10&#xff0c;那么可以寻址1024个地址空间&#xff0c;这1024个地址空间就构成这个CPU的内存地址空间&#xff0c;下面本文将会介绍…

Python如何连接Mysql及基本操作

1.什么要做python连接mysql&#xff0c;一般是解决什么问题的 做自动化测试时候&#xff0c;注册了一个新用户&#xff0c;产生了多余的数据&#xff0c;下次同一个账号就无法注册了&#xff0c;这种情况怎么办呢&#xff1f;自动化测试都有数据准备和数据清理的操作&#xff…