PCL IO 操作

简介: PCL IO 操作

PCD文件介绍

PCL以PCD文件形式保存点云。 (主要是为了保存n维点类型)

其文件格式如下:

每一个PCD文件都包含一个文件头,它确定和声明文件中存储的点云数据的某种特性。

PCD文件头必须使用ASCII码来编码。PCD文件中指定的每一个文件头字段以及ASCII点数据都用一个新行(\n)分开了。

从0.7版本开始,PCD文件头包含下面的这些字段

  • VERSIO:指定PCD文件版本
  • FEIELDS:指定一个点可以有的每一个维度和字段的名字。例如
FEIELDS x y z     # XYZ data
FEIELDS x y zrgb  # XYZ+colors
  • SIZE: 用字节数指定每一个维度的大小
unsigned char/char/  1个字节
unsigned short/short 2个字节
unsigned int/int/float 4个字节
double  8个字节
  • TYPE:用要给字符指定每一个维度的类型。可以使用的类型有:
I 表示有符号类型 int8(char)、int16(short)、int32(int)
U 表示无符号类型 uint8(unsigned char)、uint16(unsigned short)、uint32(unsigned int)
F 表示 浮点型
  • COUNT:指定每一个维度包含的元素数目。x这元素就是1.默认没有COUNT ,所有维度数目设置为1
  • WIDTH:用点的数量表示点云数据集的宽度。根据是有序点云还是无序点云。有序就是一行的宽度,无序就是点云总个数
  • HEIGHT: 用点的数量表示点云数据集的高度。被用于检查有序还是无序。无序为1 ,有序为高度
//有序点云
WIDTH 640  #像图像一样的有序结构 640*480
HEIGHT 480

//无序点云
WIDTH 307200
HEIGHT 1        #  无序点 共 307200个
  • VIEWPOINT:指定数据集中点云的获取视点。在不同坐标系转换的时候用到。 平移+四元数 默认为 VIEWPOINT 0 0 0 1 0 0 0
  • DATA :指定存储点云数据的数据类型。

从PCD文件中读点云数据

在这里插入图片描述
需要包含的头文件

在这里插入图片描述
创建一个点云变量 的共享指针 并实例化

在这里插入图片描述
从 pcd文件 读取 点云
如果没有读到 报错相关信息 结束进程

这里要重点说明下 loadPCDFile 这个函数了 。 这个就是 pcl 里面 从PCD文件读取点云的核心函数

结合上面的例子 用法就是:
pcl::io::loadPCDFile< 点云类型 >(PCD文件路径,读取后存入的 地址指向)

在这里插入图片描述
计算点云数量 打印相关信息

在这里插入图片描述

Code

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

int main(int argc,char** argv)
{
    /*创建一个点云变量 的共享指针  并实例化*/
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

      /*从 pcd文件  读取 点云*/
    if(pcl::io::loadPCDFile<pcl::PointXYZ>("../test_pcd.pcd",*cloud)==-1)
    {    
        //  返回值是 -1  代表 没有读到
        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(size_t i=0;i<cloud->points.size();++i)
    {
        std::cout<<"    "<<cloud->points[i].x
        <<" "<<cloud->points[i].y
        <<" "<<cloud->points[i].z<<std::endl;
    }
    return(0);
}

Result

原pcd
在这里插入图片描述
读取终端 显示 内容
在这里插入图片描述

从PCD读取自定义的点云类型

上面的例子是 读取 pcl原定义好的点云类型

如果像之前我们 定义了 新的点云类型,此时 如何读取?

此时需要在 main函数前 加上 自己的点云定义

struct MyPointType    //定义点类型结构
{
    PCL_ADD_POINT4D;  //该点类型有4个元素      
 
    /*尝试新增一个自定义*/  
    float JoneAdd;    //定义自己新增的类型名称
     //测试了添加这么多个也没问题
    float JoneAdd1;
    float JoneAdd2;
    float JoneAdd3;
    float JoneAdd4;
    float JoneAdd5;
    float JoneAdd6;
    float JoneAdd7;
    float JoneAdd8;
    float JoneAdd9;

    EIGEN_MAKE_ALIGNED_OPERATOR_NEW   //确保new操作符对齐操作 

}EIGEN_ALIGN16;   //强制SSE 对齐

POINT_CLOUD_REGISTER_POINT_STRUCT(MyPointType,    //注册点类型宏
    (float ,x,x)
    (float ,y,y)
    (float ,z,z)
    (float ,JoneAdd,JoneAdd)
    (float ,JoneAdd,JoneAdd1)
    (float ,JoneAdd,JoneAdd2)
    (float ,JoneAdd,JoneAdd3)
    (float ,JoneAdd,JoneAdd4)
    (float ,JoneAdd,JoneAdd5)
    (float ,JoneAdd,JoneAdd6)
    (float ,JoneAdd,JoneAdd7)
    (float ,JoneAdd,JoneAdd8)
    (float ,JoneAdd,JoneAdd9)
    )

或者 定义在 一个.hpp文件里面 。 引用这个文件

然后 函数里面的 内容 改成 如下 形式

在这里插入图片描述
那么如果 加载的pcd 文件不是 我们 定义 的点云类型 会怎么办 ?
出现下面的结果
在这里插入图片描述
设置 打印 信息 如下
在这里插入图片描述

原PCD文件
在这里插入图片描述

终端打印读取信息
在这里插入图片描述

相关文章
|
7月前
|
存储 Linux API
Linux应用开发基础知识——文件IO操作(三)
Linux应用开发基础知识——文件IO操作(三)
87 2
Linux应用开发基础知识——文件IO操作(三)
|
Java 测试技术 Apache
Java IO 与 NIO:高效的输入输出操作探究
输入输出(IO)是任何编程语言中的核心概念,而在Java中,IO操作更是应用程序成功运行的基石。随着计算机系统变得越来越复杂,对IO的要求也日益增加。在本文中,我们将探讨Java IO和非阻塞IO(NIO)的重要性以及如何在Java中实现高效的输入输出操作。
|
存储 数据处理 索引
【100天精通python】Day27:文件与IO操作_CSV文件处理
【100天精通python】Day27:文件与IO操作_CSV文件处理
79 0
|
7月前
|
数据采集 异构计算
LabVIEW编程LabVIEW开发高级数据采集技术 操作数字IO 例程与相关资料
LabVIEW编程LabVIEW开发高级数据采集技术 操作数字IO 例程与相关资料
96 22
|
6月前
|
缓存 NoSQL Redis
redis管道操作(节省网络IO开销)
pipeline中发送的每个command都会被server立即执行,如果执行失败,将会在此后的响应中得到信息;也就是pipeline并不是表达“所有command都一起成功”的语义,管道中前面命令失败,后面命令不会有影响,继续执行。
54 1
|
7月前
|
Java
|
7月前
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版操作报错之在执行任务时遇到了一个IO错误,具体表现为无法从本地主机(localhost)下载文件,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
7月前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
84 2
|
7月前
|
存储 Go 数据处理
Golang简单实现IO操作
Golang简单实现IO操作
56 1
|
7月前
|
存储 Java 编译器
Java文件IO操作基础
Java文件IO操作基础
54 0