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不变价累计值(亿元…

性能优化-高通的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;我们从数字集成电路的角度再次补充学习一下存储器的知识。 定义和分类 从这里面我们能知道一些关键词。 存储介质主要是半导体器件和磁性材料。…

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

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

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)},

【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;这个问题可能也适用于…

Linux的文件系统、软硬链接、动静态库

前要&#xff1a;本次我想给您带来关于 IO 和文件的知识&#xff0c;而文件在本系列中分为内存上的文件和磁盘上的文件。 1.文件概念 1.1.文件读写 在谈及系统接口之前&#xff0c;我们先来从 C 语言的角度来谈及一些前要知识&#xff0c;以辅助我们后续来理解系统 IO。 我们…

LeetCode.2859. 计算 K 置位下标对应元素的和

题目 题目链接 分析 这道题的题意很明确。就是求每一个下标的二进制中1的个数为k的下标所对应的元素值之和。 Java 中有 库函数 Integer.bitCount(num)&#xff0c;这个函数的返回值就是 num 中 1 的个数。 代码 class Solution {public int sumIndicesWithKSetBits(List…

uniapp状态管理Vuex介绍及vuex核心概念

状态管理Vuex Vuex 是什么&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 Vuex 什么是“状态管理模式”&#xff1f; <!…

英特尔正式发布OpenVINO™ 2023.3版本

2024年1月24日&#xff0c;英特尔正式发布了OpenVINO™ 2023.3版本&#xff08;Release Notes for Intel Distribution of OpenVINO Toolkit 2023.3&#xff09;。OpenVINO™是英特尔针对自家硬件平台开发的一套深度学习工具库&#xff0c;包含推断库&#xff0c;模型优化等等一…

决策树的基本构建流程

决策树的基本构建流程 决策树的本质是挖掘有效的分类规则&#xff0c;然后以树的形式呈现。 这里有两个重点&#xff1a; 有效的分类规则&#xff1b;树的形式。 有效的分类规则&#xff1a;叶子节点纯度越高越好&#xff0c;就像我们分红豆和黄豆一样&#xff0c;我们当然…