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

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

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

相关文章

CPQ配置报价 | 面向非标设备制造项目报价系统解决方案

在非标设备细分领域&#xff0c;企业面向定制型项目经常会遇到以下难题&#xff1a;第一&#xff0c;方案制作效率低&#xff0c;易出错&#xff1b;第二&#xff0c;成本核算过程不严谨&#xff0c;准备性差&#xff1b;第三&#xff0c;报价试算过程不科学&#xff1b;第四&a…

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…

C++知识点笔记

二维数组 定义方式&#xff1a; 1、数据类型 数组名[行数][列数]; 2、数据类型 数组名[行数][列数]{{数据1,数据2},{数据3,数据4}}; 3、数据类型 数组名[行数][列数]{数据1,数据2,数据3,数据4}; 4、数据类型 数组名[][列数]{数据1,数据2,数据3,数据4}; 建议&#xff1a;以…

ERROR Failed to get response from https://registry.npm.taobao.org/ 错误的解决

这个问题最近才出现的。可能跟淘宝镜像的证书到期有关。 解决方式一&#xff1a;更新淘宝镜像&#xff08;本人测试无效&#xff0c;但建议尝试&#xff09; 虽然无效&#xff0c;但感觉是有很大关系的。还是设置一下比较好。 淘宝镜像的地址&#xff08;registry.npm.taobao…

leetcode hot 100 电话号码的字母组合

在本题目中&#xff0c;要求我们根据给的数字字符串对应电话号码上的字母组合。所以我们需要建立起数字和电话上字母的对应关系。 然后&#xff0c;组合问题依旧采用回溯来做。首先我们需要确定一下参数&#xff0c;我们需要给的digits&#xff0c;然后还需要字母和数字对应关…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

HTML - 介绍

一.简介 HTML&#xff0c;超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;是一种用于创建网页的标准标记语言。我们可以使用HTML建立自己的WEB网站或特定页面。HTML运行在浏览器上&#xff0c;由浏览器解析。 ⚠️注意&#xff1a;HTML文件的后缀…

HTML以及CSS相关知识总结(二)

css文件写样式时建议遵循以下顺序&#xff1a; 1.布局定位属性:display/position/float/ear/visibility/overflow(建议display第一个写&#xff0c;毕竟关系到模式) 2.自身属性: width/height/margin/ padding /border/ background 3.文本属性: color/font / text-decoration/t…

区块链中分叉机制

在区块链中我们经常会听到分叉【fork】的概念&#xff0c;今天通过这篇文章来详细的介绍下分叉 什么是分叉 在介绍区块链的分叉机制中&#xff0c;我们以公有链来说明&#xff0c;公有链是去中心化的。任何协议的改变都是代价巨大的&#xff0c;因为全网那么多节点&#xff0…

国产GC6610应用于打印机,医疗器械等产品中,可替代TMC2208/2209/trinamic的参数分析

电机驱动芯片应用范围十分广泛&#xff0c;目前已经广泛应用于消费电子、电动工具、打印机、3D打印、安防监控、通信设备、汽车&#xff0c;以及工业控制等领域。据市场调研机构ResearchAndMarkets统计&#xff0c;2021年全球电机驱动芯片是市场规模为38.8亿美元&#xff0c;预…

uniapp小程序:内存超过2mb解决方法(简单)message:Error: 上传失败:网络请求错误 代码包大小超过限制。

分析&#xff1a;这种情况是代码文件内存超过2mb无法进行预览上传 解决方法&#xff1a; 1、Hbuilder中点击运行-->运行到小程序模拟器--->运行时是否压缩代码 2、在微信小程序中点击详情--->本地设置&#xff1a; 3、点击预览即可运行了

Java通过模板替换实现excel的传参填写

以模板为例子 将上面$转义的内容替换即可 package com.gxuwz.zjh.util;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.*; import java.util.HashMap; import java.util.Map; import java.io.IOException; impor…

vue3 常见的路由传参无刷新修改当前路由url带参

无刷新修改当前路由url带参 //tabs切换部分 <el-tabs v-model"activeName" class"demo-tabs" tab-click"handleClick"><el-tab-pane v-for"(item,index) in tagList" :label"item.title" :name"item.name…

4-4 D. 银行排队问题之单队列多窗口加VIP服务

题目描述 假设银行有K个窗口提供服务&#xff0c;窗口前设一条黄线&#xff0c;所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时&#xff0c;下一位顾客即去该窗口处理事务。当有多个窗口可选择时&#xff0c;假设顾客总是选择编号最小的窗口。 有些银行会给VIP客户以…

gitee仓库使用中的警告

当 Git 执行 git pull 命令时&#xff0c;有时候会出现类似下面的警告信息&#xff1a; warning: ----------------- SECURITY WARNING ---------------- warning: | TLS certificate verification has been disabled! | warning: ------------------------------------------…

计算机毕业设计 基于SpringBoot的线上心理咨询室系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

勤学苦练“prompts“,如沐春风“CodeArts Snap“

前言 CodeArts Snap 上手一段时间了&#xff0c;对编程很有帮助。但是&#xff0c;感觉代码编写的不尽人意。 我因此也感到困惑&#xff0c;想要一份完整的 CodeArts Snap 手册看看。 就在我感觉仿佛"独自彷徨在这条悠长、悠长又寂寥的雨巷"时&#xff0c;我听了大…

Transformers Tutorial教程3-7

Introduction Transformers库的一个使用&#xff0c;用这个库就可以很轻松地去使用和训练自己的一个预训练语言模型。 outline 介绍什么是Transformers&#xff0c;为什么要用它 介绍一些比较常用的接口 最后会给出一个demo&#xff0c;帮助你们快速地入门 what is Transf…

重装Windows系统出现Windows无法安装到这个磁盘,选中的磁盘采用GPT分区

文章目录 1.问题描述2.问题解决 1.问题描述 重装Windows系统时&#xff0c;出现Windows无法安装到这个磁盘&#xff0c;选中的磁盘采用GPT分区这个提示 2.问题解决 1.shiftF10&#xff0c;打开命令行 2.输入&#xff1a;diskpart (打开分区工具) 3.输入&#xff1a;list di…