PCL-IO输入输入模块

IO输入输入模块

  • 一、概述
  • 二、点云数据格式
    • 1. PCD 格式
    • 2. PLY 格式
    • 3. OBJ 格式
    • 4. STL 格式
    • 5. OFF 格式
  • 三、读取3D文件
    • 1. API 总览
    • 2. 示例
  • 四、保存3D文件
    • 1. API 总览
    • 2. 示例

一、概述

PCL 库提供了一个模块用来对3D数据进行读写操作,这个库提供了一个模块:pcl_io库包含用于读取和写入文件以及从各种传感设备捕获点云的类和函数。每一个版本的函数接口可能有些差异,具体还是得去看官网的参考文档才能正确的使用。

我这里的环境

PCL版本: PCL 1.14.0-dev
编程语言:C++

在这里插入图片描述

二、点云数据格式

1. PCD 格式

2. PLY 格式

3. OBJ 格式

4. STL 格式

5. OFF 格式

三、读取3D文件

1. API 总览

第一列是文件格式类型;第一行表头代表文件中的数据是什么内容、可以是点云、多边形mesh、材质。

PCL 为我们提供了针对于专门文件格式的读写API,就想 loadPCDFile、loadPLYFile等。也有提供了不区分格式的文件读取API,就像 load 函数一样。

pcl::PointCloudpcl::PCLPointCloud2pcl::PolygonMeshpcl::TextureMesh
PCD (ASCII/BINARY/COMPRESSED)loadPCDFileloadPCDFile
PLY (ASCII/BINARY)loadPLYFileloadPLYFileloadPLYFile
OBJ (ASCII)loadOBJFileloadOBJFileloadOBJFileloadOBJFile
IFSloadIFSFileloadIFSFileloadIFSFile
STL (ASCII/BINARY)loadPolygonFileSTL
VTKloadPolygonFileVTK
CSV/ASCIIvia pcl::ASCIIReadervia pcl::ASCIIReader
Automatic format detectionloadloadloadload

这个就需要看这个PCL的源代码怎么写的,一般我只用 load 函数,我们看看PCL load 函数的实现就明白了。其实 load 函数就是对 load**File函数的一些列的封装,暂时支持的格式也只有上面提到的pcd、ply等格式之类的。

namespace pcl{namespace io{template<typename PointT> intload (const std::string& file_name, pcl::PointCloud<PointT>& cloud){pcl_fs::path p (file_name.c_str ());std::string extension = p.extension ().string ();int result = -1;if (extension == ".pcd")result = pcl::io::loadPCDFile (file_name, cloud);else if (extension == ".ply")result = pcl::io::loadPLYFile (file_name, cloud);else if (extension == ".ifs")result = pcl::io::loadIFSFile (file_name, cloud);else if (extension == ".obj")result = pcl::io::loadOBJFile (file_name, cloud);else{PCL_ERROR ("[pcl::io::load] Don't know how to handle file with extension %s\n", extension.c_str ());result = -1;}return (result);}}}

2. 示例

最常用的格式就是 ply、obj、pcd格式的文件格式。下面简单看一下部分常用函数的定义:

#include <pcl/io/pcd_io.h>template<typename PointT >
int pcl::io::loadPCDFile(const std::string & file_name, pcl::PointCloud< PointT > & cloud)	
#include <pcl/io/ply_io.h>
template<typename PointT >
int pcl::io::loadPLYFile(const std::string & file_name, pcl::PointCloud< PointT > & cloud)	

我主要用作读取点云数据。我也只会介绍点云相关的数据。

实例

#include <pcl/io/io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_cloud.h>// 闭合写法
pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud (new pcl::PointCloud<pcl::PointXYZ>); //	输入点云的指针
pcl::io::loadPLYFile("pointcloud.ply", *input_cloud);	//	读取数据// 分离写法
pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud;
input_cloud = pcl::PointCloud<pcl::PointXYZ>::Ptr(new pcl::PointCloud<pcl::PointXYZ>);	//	输入点云的指针
pcl::io::loadPLYFile("pointcloud.ply", *input_cloud);	//	读取数据

上面的 pcl::PointCloud<pcl::PointXYZ>::Ptr 其实就是宏定义的一个 share_ptr,我们其实也可以自己去管理这个类型的指针。

pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud;// 宏定义
#include <pcl/point_cloud.h>
using Ptr = shared_ptr<PointCloud<PointT> >;
using ConstPtr = shared_ptr<const PointCloud<PointT> >;

官网完整的读取PCD文件

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>int main ()
{pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) //* load the file{PCL_ERROR ("Couldn't read file test_pcd.pcd \n");return (-1);}std::cout << "Loaded "<< cloud->width * cloud->height<< " data points from test_pcd.pcd with the following fields: "<< std::endl;for (const auto& point: *cloud)std::cout << "    " << point.x<< " "    << point.y<< " "    << point.z << std::endl;return (0);
}

四、保存3D文件

1. API 总览

第一列是文件格式类型;第一行表头代表文件中的数据是什么内容、可以是点云、多边形mesh、材质。

这里面的 PCD ASCII 和 PCD BINARY 只是保存的数据格式不一样,内容是一样的,ASCII是用文本保存、BINARY则是以二进制保存数据。其他带这些也是以这个为原则保存的。

pcl::PointCloudpcl::PCLPointCloud2pcl::PolygonMeshpcl::TextureMesh
PCD ASCIIsavePCDFilesavePCDFile
PCD BINARYsavePCDFilesavePCDFile
PCD COMPRESSEDsavePCDFileBinaryCompressedvia pcl::PCDWriter
PLY ASCIIsavePLYFilesavePLYFilesavePLYFile
PLY BINARYsavePLYFilesavePLYFilesavePLYFileBinary
OBJ (ASCII)saveOBJFilesaveOBJFile
IFSsaveIFSFilesaveIFSFile
STL (ASCII/BINARY)savePolygonFileSTL
VTKsaveVTKFilesaveVTKFile or savePolygonFileVTK
Automatic format detectionsavesavesavesave

和 读取 文件的接口类似,save也是封装了以上的这些格式。

namespace pcl{namespace io{ template<typename PointT> intsave (const std::string& file_name, const pcl::PointCloud<PointT>& cloud){pcl_fs::path p (file_name.c_str ());std::string extension = p.extension ().string ();int result = -1;if (extension == ".pcd")result = pcl::io::savePCDFile (file_name, cloud, true);else if (extension == ".ply")result = pcl::io::savePLYFile (file_name, cloud, true);else if (extension == ".ifs")result = pcl::io::saveIFSFile (file_name, cloud);else{PCL_ERROR ("[pcl::io::save] Don't know how to handle file with extension %s\n", extension.c_str ());result = -1;}return (result);}}
}	

2. 示例

部分的接口如下,参数也是非常的明了,最后一个参数:是否以二进制保持数据,默认是以ASCII,也就是人看得到的数据保存。

#include <pcl/io/ply_io.h>
template<typename PointT >
int pcl::io::savePLYFile(const std::string &file_name, const pcl::PointCloud<PointT> &cloud,bool binary_mode = false)#include <pcl/io/ply_io.h>
template<typename PointT >
int pcl::io::savePCDFile(const std::string &file_name, const pcl::PointCloud<PointT> &cloud, bool binary_mode = false) 	

知道这些API就可以去保持啦

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>int  main ()
{pcl::PointCloud<pcl::PointXYZ> cloud;// Fill in the cloud datacloud.width    = 5;cloud.height   = 1;cloud.is_dense = false;cloud.resize (cloud.width * cloud.height);for (auto& point: cloud){point.x = 1024 * rand () / (RAND_MAX + 1.0f);point.y = 1024 * rand () / (RAND_MAX + 1.0f);point.z = 1024 * rand () / (RAND_MAX + 1.0f);}pcl::io::savePCDFile ("test_pcd.pcd", cloud);std::cerr << "Saved " << cloud.size () << " data points to test_pcd.pcd." << std::endl;for (const auto& point: cloud)std::cerr << "    " << point.x << " " << point.y << " " << point.z << std::endl;return (0);
}

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

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

相关文章

2007-2022年全国货币供应量M2、失业率、CPI、第三方互联网支付、出口、人口等宏观经济指标数据(年度、季度)

2007-2022年全国货币供应量M2、失业率、CPI、第三方互联网支付、出口、人口等宏观经济指标数据&#xff08;年度、季度&#xff09; 1、时间&#xff1a;2007-2022年&#xff08;季度、年度&#xff09; 2、指标&#xff1a; 季度指标&#xff1a;时间、GDP不变价累计值(亿元…

python ffmpeg将mp4文件实时转码为ts,并指定pid等信息,输出到udp

要将MP4文件实时转码为TS格式&#xff0c;并将PID等信息指定为UDP输出&#xff0c;可以使用subprocess模块和ffmpeg命令行工具来实现。以下是一个示例代码&#xff0c;用于实时转码并将输出发送到UDP服务器&#xff1a; import subprocess import timeinput_file "input.…

性能优化-高通的Hexagon DSP和NPU

原文来自【 Qualcomm’s Hexagon DSP, and now, NPU 】 本文主要介绍Qualcomm Hexagon DSP和NPU&#xff0c;这些为处理简单大量运算而设计的硬件。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xf…

多臂老虎机理论系列

[多臂老虎机理论](Lower bounds for non-adaptive exploration) 多臂老虎机之Lower bounds 定理 2.12&#xff1a; 定理的意义在于&#xff0c;对于任何不调整探索策略的算法&#xff0c;存在至少一个问题实例&#xff0c;使得随着时间的推移&#xff0c;该算法的预期遗憾将…

Linux常见的管理命令

1. whoami 作用&#xff1a; 显示出当前有效的用户名称&#xff0c;Linux是多用户多任务 语法&#xff1a;whoami(选项) 选项&#xff1a; --help&#xff1a;在线帮助 --version&#xff1a;显示版本信息和退出 场景使用&#xff1a; 1. 当用户想要查看当前登录系统的用户…

14.case条件测试语句(5)

case语句是在多个范围内匹 配数据&#xff0c;若匹配成功则执行相关命令并结束整个条件测试&#xff1b;如果数据不在所列出的范围内&#xff0c; 则会去执行星号&#xff08;*&#xff09;中所定义的默认命令&#xff08;C语言中的default语句&#xff09; 提示用户输入一个字…

爬取樱花动漫名侦探柯南最新剧场版ts格式

import os import requests import zipfile from tqdm import tqdm import tkinter as tkfilename 名侦探柯南\\ if not os.path.exists(filename):os.mkdir(filename) # https://vip.ffzy-online6.com/20231129/22304_740e70d0/2000k/hls/cedd2dc1ecb000001.ts # https://vip…

硬件基础:存储器

之前对存储器做过简单的汇总&#xff0c;参考这篇文章&#xff1a; 计算机/微机存储技术_路溪非溪的博客-CSDN博客 这次&#xff0c;我们从数字集成电路的角度再次补充学习一下存储器的知识。 定义和分类 从这里面我们能知道一些关键词。 存储介质主要是半导体器件和磁性材料。…

Java技术栈高级攻略之专栏简介

Java是一种广泛应用于企业级应用开发的编程语言&#xff0c;具备强大的生态系统和丰富的工具支持。想要在Java技术栈中取得更高的成就&#xff0c;你需要不断深入学习和实践。本专栏为你提供很多高级攻略&#xff0c;帮助你更好地掌握Java技术栈。 一、多线程编程 多线程编程是…

亿发中小型企业erp软件智能化赋能,专业助力广东制造行业生产流程管理

在当前经济全球化的环境下&#xff0c;广东省的中小型制造业企业正面临多方面的严峻挑战。包括产品质量的维护、分销渠道的稳定、生产成本降低以及减轻生产过程中的资源消耗等难题。目前&#xff0c;随着信息技术的迅速发展&#xff0c;一些先进的IT工具&#xff0c;比如企业资…

【owt】webrtc的随机数生成

SSRC 是32位的随机值 在 WebRTC 中,确保 RTP(Real-time Transport Protocol)的 SSRC(Synchronization Source Identifier)不冲突是非常重要的。SSRC 是一个 32 位的标识符,用于标识 RTP 流中的同步源。理论上,由于 SSRC 是随机生成的,存在一定的冲突概率。但是,由于 3…

地址解析协议

地址解析协议ARP(Address Resolution Protocol)是用来将IP地址解析为MAC地址的协议 ARP数据包格式(直接封装在ethernet_II上面) 1.Hardware Type:表示硬件地址类型,一般为以太网; 2.Protocol Type:表示三层协议地址类型,一般为IP; 3.Hardware Length和Protocol Leng…

STM32实现软件IIC协议操作OLED显示屏(1)

时间记录&#xff1a;2024/1/25 一、IIC协议介绍 &#xff08;1&#xff09;协议介绍 IIC&#xff08;又称I2C&#xff0c;Inter-Integrated Circuit&#xff09;&#xff0c;即集成电路总线&#xff0c;是一种两线式串行总线&#xff0c;由PHILIPS公司开发&#xff0c;用…

OSS上传下载乱码问题

配置headers&#xff1a; "Content-Disposition": attachment; filename*UTF-8${encodeURIComponent(file.file.name)},

chatGPT辅助写硕士毕业论文

一、写作顺序 1.标题、研究问题、研究方法 2.文献综述&#xff08;占比1/5-1/6&#xff09; 3.论证章节 4.结论、不足、启示 5.处理图表、参考文献的格式 6.绪论或引言 7.摘要、关键词 8.查重、装订 http://【硕士毕业论文写不下去&#xff0c;多亏听了张博士的论文写…

【GitHub项目推荐--开源小游戏】【转载】

01 回合制生存游戏 Cataclysm-DDA 是一款回合制生存游戏&#xff0c;背景设置在后世界末日的世界中。虽然有些人将其描述为“僵尸游戏”&#xff0c;但《大灾变》远不止这些。努力在一个严酷、持久、程序生成的世界中生存。 为食物、设备寻找一个死去的文明的残余物。或者&am…

ThinkPHP+uni-app框架熊猫电竞赏金电竞系统源码PHP含APP+H5

熊猫电竞赏金电竞系统源码&#xff0c;包含APP、H5和搭建视频教程&#xff0c;支持运营级搭建&#xff0c;这套源码是基于ThinkPHPUniaapp框架开发的。 赏金电竞系统源码 APPh5搭建视频 可搭建&#xff01;运营级&#xff01; 赏金赛源码&#xff0c;用户通过平台打比赛&#x…

小白水平理解面试经典题目LeetCode 594 Longest Harmonious Subsequence(最大和谐字符串)

594 最大和谐字符串 这道题属于字符串类型题目&#xff0c;解决的办法还是有很多的&#xff0c;暴力算法&#xff0c;二分法&#xff0c;双指针等等。 题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums …

用vue实现微信小程序的点餐首页-纯前端效果

一、效果图 图片来源于网络 二、代码 <template><view class"container"><view class"top"><image src"../../static/img/home.png" class"home"></image></view><view class"content&…

安装好IntelliJ IDEA点击无反应,如何解决配置文件不一致导致的启动问题

在我们的开发生涯中&#xff0c;遇到IDE工具出现问题是在所难免的。最令人头疼的莫过于&#xff0c;你的IDEA(IntelliJ IDEA)无法启动&#xff0c;而且没有任何错误提示。这篇文章将详细讲解如何解决IntelliJ IDEA 2023.3.3版本启动失败的问题&#xff0c;这个问题可能也适用于…