• PCD文件格式详解及在PCL下读取PCD文件


    一、PCD简介

    1.1 PCD版本

    在点云库PCL 1.0发布之前,PCD文件格式就已经发展更新了许多版本。这些新旧不同的版本用PCD_Vx来编号(例如PCD_V5、PCD_V6和PCD_V7等),分别代表PCD文件的0.5版、0.6版和0.7版。在PCL中,用到的PCD文件格式的正式发布是0.7版,即PCD_V7。

    1.2 头文件格式

    PCD文由 “头文件 + 点云数据” 构成,头文件声明了该点云数据集的基本特性。下面以PCD_V7版本的PCD文件为例,对头文件进行介绍。打开经典的兔子模型(用记事本就能打开),头文件及部分点云数据如下所示:

    # .PCD v0.7 - Point Cloud Data file format
    VERSION 0.7
    FIELDS x y z  
    SIZE 4 4 4  
    TYPE F F F  
    COUNT 1 1 1 
    WIDTH 35947  
    HEIGHT 1  
    VIEWPOINT 0 0 0 1 0 0 0  
    POINTS 35947  
    DATA ascii 
    -1.10698 3.272394 -0.447241
    -1.80195 3.367094 -0.704211
    -4.12496 5.602794 2.824819

    1.2.1 VERSION

    指定PCD文件的版本,由0.7可知该点云数据集是0.7版本的。

    VERSION 0.7 //PCD版本号为0.7版

    1.2.2 FIELDS

    指定本点云数据集中任意一个点可以有的维度信息和其他附加信息。如:FIELDS x y z  指每个点都有xyz三个维度信息,FIELDS x y z rgb 指每个点除了xyz维度信息外还有颜色信息等。

    FIELDS x y z  //该数据集中包含每一个点的xyz纬度信息

    1.2.3 SIZE 

    储存每个维度信息占用的字节数(byte)。1指用char型数据存储维度信息,2指用short型数据存储维度信息,4指用int或float型数据存储维度信息,8指用double型数据存储维度信息。

    SIZE 4 4 4  //x y z每个维度均占用4个字节

    1.2.4 TYPE

    用字符指定每一个维度的数据类型。I表示有符号类型:int8(char),int16(short),int32(int);U表示无符号类型:uint8(unsigned char),uint 16(unsigned short),uint32(unsigned int);F表示浮点型float和double。

    TYPE F F F  //x y z每个维度的均为4字节的浮点型,即为float

    1.2.5 COUNT

    每个维度包含的元素个数。

    COUNT 1 1 1  //x y z每个维度均包含1个元素

    1.2.6 WIDTH

    点云数据集可分为有序数据集和无序数据集两种。有序数据集类似矩阵,有行列之分,无序数据集则无行列之分。根据数据集是否有序,WIDTH由不同的含义。

    对有序数据集而言:表示数据集的宽度(每行点的数目);

    对于无序数据集而言:表示数据集中点的总数(和下面的POINTS一样)。

    1.2.7 HEIGHT

    对有序数据集而言:表示数据集的高度(行数);

    对于无序数据集而言:被设置为1,用于声明一个数据集是否有序。

    //该数据集为无序数据集,共有35947个点
    WIDTH 35947  
    HEIGHT 1  

    1.2.8 VIEWPOINTS

    数据集中点云的获取视点。视点信息被指定为“平移(txtytz) + 四元数(qwqxqyqz)”,默认值是:VIEWPOINT 0 0 0 1 0 0 0

    VIEWPOINT 0 0 0 1 0 0 0  //数据集的获取视点

    1.2.9 POINTS

    点云中点的总数,从0.7版本就开始显得有点多余,可能会在后续版本中舍去这个参数。

    POINTS 35947  //该数据集中共有35947个点

    1.2.10 DATA

    指定存储点云数据的数据存储格式:ASCLL码或二进制数据。

    DATA ascii //该数据集用ASCLL码存储数据

    1.3 点云数据

    以ASCLL码存储的点云数据,每一个点占据一行,“nan”表示不存在或非法的数据。

    -1.10698 3.272394 -0.447241
    -1.80195 3.367094 -0.704211
    -4.12496 5.602794 2.824819
    ......

    二、PCD文件在PCL下的读取

    #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>("rabbit.pcd", *cloud )== -1)//读入PCD格式文件,如果文件不存在,返回-1
    	{
    	PCL_ERROR("Couldn't read file rabbit.pcd
    ");
    	return -1;
    	}
    
    	std::cout << "Loaded"
    		<< cloud->points.size()
    		<< "data points from rabbit.pcd with the following fields: "
    		<< std::endl;
    
    	//for (size_t i = 0; i < cloud->points.size(); i++) 显示所有的点
    	//显示前5个点
    	for (size_t i = 0; i < 5; i++)
    	{
    		std::cout << "  " << cloud->points[i].x << "  " << cloud->points[i].y << "  " << cloud->points[i].z << std::endl;
    	}
    
    	system("pause");
    	return 0;
    }

  • 相关阅读:
    PL/SQL快捷键
    <c:if>条件判断 和 取值做乘法运算
    文档保存后找不到了误以为丢失,重做!
    Gson将参数放入实体类中进行包装之后再传递
    [leedcode 66] Plus One
    [leedcode 65] Valid Number
    [leedcode 64] Minimum Path Sum
    [leedcode 63] Unique Paths II
    [leedcode 62] Unique Paths
    [leedcode 61] Rotate List
  • 原文地址:https://www.cnblogs.com/HL-space/p/10546593.html
Copyright © 2020-2023  润新知