PCL-IO输入输入模块

news2024/10/2 10:26:36

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> int
     load (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> int
     save (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 data
  cloud.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.coloradmin.cn/o/1412878.html

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

相关文章

sony ps3 eye 摄像头win10、win11directShow补丁驱动,补充CL5.3驱动无法外部程序调用问题

最近把几年前&#xff0c;淘的sony ps3 eye 摄像头拿出来测试&#xff0c;发现升值了。原来4个打算做动捕用&#xff0c;结果发现安装完CL-Eye-Driver-5.3.0.0341驱动后&#xff0c;无法用外部程序驱动摄像头&#xff0c;后来知乎里发现有人解决了这个为题&#xff0c;是win10下…

2982. 找出出现至少三次的最长特殊子字符串 II

字典树思路 用字典树搞一下就好了&#xff0c;比如aaaaa &#xff1a; a存5次 aa 4次以此类推&#xff5e; 字典树板子复习&#xff1a;P8306 【模板】字典树 这里这个清空方式 很好 因为很多时候memset T #include<iostream> #include<cstring> using namesp…

1. MySQL 数据库

本章内容 关系型数据库基础 安装 MySQL 管理数据库和表 用户和权限管理 函数&#xff0c;存储过程&#xff0c;触发器和事件 MySQL 架构 存储引擎 服务器选项&#xff0c;系统和状态变量 优化查询和索引管理 锁和事务管理 日志管理 备份还原 MySQL 集群 压力测试…

Tensorflow2.0笔记 - tensor排序操作

本笔记主要记录sort,argsort,以及top_k操作&#xff0c;加上一个求Top K准确度的例子。 import tensorflow as tf import numpy as nptf.__version__#sort,argsort#对1维的tensor进行排序 tensor tf.random.shuffle(tf.range(10)) print(tensor) #升序 print("tf.sort(d…

晨曦记账本,你的账目整理专家

传统的账目明细记录和整理方式不仅费时费力&#xff0c;还容易出错。在数字化时代&#xff0c;【晨曦记账本】为你提供了一个全新的账目明细整理模式。它不仅能让你的账目明细变得井井有条&#xff0c;更能让你在管理财务的过程中得心应手。 所需工具&#xff1a; 一个【晨曦…

Ubuntu18编译jdk8源码

环境 系统 ubuntu18 Linux ubuntu 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux jdk源码openjdk-8u41-src-b04-14_jan_2020.zip bootJdk jdk-8u391-linux-x64.tar.gz ps -e|grep ssh sudo apt-get install ssh…

BabylonJS 6.0文档 Deep Dive 摄像机(六):遮罩层和多相机纹理

1. 使用遮罩层来处理多个摄影机和多网格物体 LayerMask是分配给每个网格&#xff08;Mesh&#xff09;和摄像机&#xff08;Camera&#xff09;的一个数。它用于位&#xff08;bit&#xff09;级别用来指示灯光和摄影机是否应照射或显示网格物体。默认值为0x0FFFFFFF&#xff…

语义分割(2) :自定义Dataset和Dataloader

文章目录 1. 数据处理1.1 标签转换(json2mask和json2yolo)1.1.1 json2mask1.1.2 json2yolo 1.2 划分数据集1.2 不规范的标签图片处理1.3 批量修改图片后缀 2 自定义Dataset 和 Dataloader2.1 自定义Dataset2.1.1 数据增强(1) 对图像进行缩放并且进行长和宽的扭曲(2) 随机翻转图…

【C++中STL】map/multimap容器

map/multimap容器 map基本概念map构造和赋值map的大小和交换map插入和删除map的查找和统计 map排序 map基本概念 map中的所有元素都是pair对组&#xff0c;高效率&#xff0c;pair中的第一个元素为key&#xff08;键值&#xff09;&#xff0c;起到索引作用&#xff0c;第二个…

仅使用 Python 创建的 Web 应用程序(前端版本)第07章_商品列表

在本章中,我们将实现一个产品列表页面。 完成后的图像如下 创建过程与User相同,流程如下。 No分类内容1Model创建继承BaseDataModel的数据类Item2MockDB创建产品表并生成/添加虚拟数据3Service创建一个 ItemAPIClient4Page定义PageId并创建继承自BasePage的页面类5Applicati…

K8s-持久化(持久卷,卷申明,StorageClass,StatefulSet持久化)

POD 卷挂载 apiVersion: v1 kind: Pod metadata:name: random-number spec:containers:- image: alpinename: alpinecommand: ["/bin/sh","-c"]args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]volumeMounts:- mountPath: /optname: da…

Halcon指定区域的形状匹配

Halcon指定区域的形状匹配 文章目录 Halcon指定区域的形状匹配1.在参考图像中选择目标2.创建模板3.搜索目标 在这个实例中&#xff0c;会介绍如何根据选定的ROI选择合适的图像金字塔参数&#xff0c;创建包含这个区域的形状模板&#xff0c;并进行精确的基于形状模板的匹配。最…

08 BGP 华为官方文档 十一条选路原则

BGP 华为官方文档 十一条选路原则 丢弃下一跳不可达的路由 1&#xff09;比较“协议首选值-pref-val”属性&#xff0c;数值越大越好&#xff0c;默认值是0&#xff0c;只在本设备生效&#xff0c;不在网络中传递 2&#xff09;比较“本地优先级-local_pref”属性&#xff0c;…

初识数据库

数据库技术的基础术语 在学习数据库技术之前&#xff0c;我们先认识与该技术密切相关的基本术语&#xff0c;分别是数据库 (Database, DB)、数据库管理系统(Database Management System, DBMS)和数据库 系统(Database System, DBS)&#xff0c;具体介绍如下。 1. 数据库 数…

win10安装redis并配置加自启动(采用官方推荐unix子系统)

记录&#xff0c;为啥有msi安装包&#xff0c;还这么麻烦的用linux版本redis的安装方式&#xff0c;是因为从github上下载别人制作的msi报毒&#xff0c;还不止一处&#xff0c;这种链接数据库的东西&#xff0c;用别人加工过的&#xff0c;都报毒了还用就是傻逼了。 所以采用…

13.while条件循环语句 (4)

while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句&#xff0c;它的循环结构往往在执行前并不确定最终执行的次数&#xff0c;完全不同于for循环语句中有目标、有范围的使用场景。 while循环语句通过判断条件测试的真假来决定是否继续执行命令&#xff0c;若条件…

IP 地址如何进行动态分配?

由于 IP 地址资源的有限性&#xff0c;大部分用户上网都是使用动态 IP 地址&#xff0c;而不是静态 IP 地址。动态 IP 地址指的是在需要的时候才进行 IP 地址分配的方式&#xff0c;而静态 IP 地址是固定分配一个 IP 地址&#xff0c;每次都用这一个地址。因此&#xff0c;IP 地…

AI PC的引擎 – 英特尔第 14 代处理器Meteor Lake架构分析

英特尔从2023年12月开始在笔记本电脑中发售首款 Meteor Lake 第 14 代 Core Ultra 芯片&#xff0c;开启新的“AI PC”时代。这款芯片采用了全新的架构&#xff0c;将CPU分为四块“瓷砖”&#xff08;tiles&#xff09;&#xff1a;CPU Tile&#xff0c;SoC Tile&#xff0c;Gr…

Python学习从0到1 day9 Python函数

苦难是花开的伏笔 ——24.1.25 函数 1.定义 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段 2.案例 在pycharm中完成一个案例需求&#xff1a;不使用内置函数len&#xff08;&#xff09;&#xff0c;完成字符串长度的计算 #统计字…

海外云手机三大优势

在全球化潮流下&#xff0c;企业因业务需求对海外手机卡等设备的需求不断攀升&#xff0c;推动了海外云手机业务的蓬勃发展。相较于自行置备手机设备&#xff0c;海外云手机不仅能够降低成本&#xff0c;还具备诸多优势&#xff0c;让我们深入探讨其中的三大黄金优势。 经济实惠…