pcl+vtk(四)pcd和ply方式存储点云简单介绍,以及ply格式转换为pcd格式点云方法

一、pcd格式

一个pcd文件中通常由两部分组成:文件说明和点云数据

1.文件说明

由11行组成

# .PCD v0.7 - Point Cloud Data file format
VERSION 0.7  #版本说明

FIELDS x y z #每个数据组成
SIZE 4 4 4  #每个数据占用的字节数
TYPE F F F   #每个数据对应的类型,F表示浮点类型,U表示无符号整型,I表示整型
COUNT 1 1 1  #每个数据对应的维度
WIDTH 35947  #对于无序点云为点的数量,对于有序点云为一圈点的数量。
HEIGHT 1   #对于无序点云取值默认为1,对于有序点云为垂直方向上的点数,比如多少线雷达
VIEWPOINT 0 0 0 1 0 0 0  #点云获取的视点,用于坐标变换
POINTS 35947  #点的数量
DATA ascii  #点云数据的存储类型,0.7版本支持两种存储方式:ascii和binary。

其中数据组成FIELDS还可以有下面多种组成

FIELDS x y z        // xyz
FIELDS x y z rgb     //xyz + colors
FIELDS x y z normal_x normal_y normal_z   // xyz + surface normals

rgb的数据格式在pcl-1.9以后为uint,之前为float。所以在pcl-1.9之后TYPE类型为TYPE F F F U,之前为TYPE F F F F。

2.点云数据

例子:

-0.037829701 0.12794 0.0044746702
-0.044779401 0.128887 0.00190497
-0.068009503 0.151244 0.037195299
-0.00228741 0.13015001 0.0232201
-0.022605401 0.12667499 0.0071558701
-0.025107799 0.125921 0.0062422599
-0.037120901 0.12744901 0.0017956001
0.033213001 0.112692 0.0276861
0.038042501 0.109755 0.0161689

3.报错

读取pcd文件中的rgb信息时,报错

Failed to find match for field 'rgb'

 原因有两个:

一是读取的pcd文件中没有rgb数据。

二是pcl的版本与文件中存储的rgb数据格式不一致。

二 、ply格式

 通常由两部分组成:分别是文件说明和点云数据

1.文件说明

ply  #声明是ply文件
format ascii 1.0  #存储方式
comment zipper output  #备注说明,解释性描述
element vertex 35947 #表示第一种元素构成是顶点,共35947个,下面的property对应点的组成。
property float x  #点的第一个元素,x,浮点型
property float y  #点的第二个元素,y,浮点型
property float z  #点的第三个元素,z,浮点型
property float confidence #点的第四个元素,置信度,浮点型
property float intensity  #点的第五个元素,强度,浮点型
element face 69451 #表示第二种元素构成是面,共69451个,下面的property对应面的组成
property list uchar int vertex_indices  #list uchar 表示面类型,int vertex_indices面中对应上述点的索引
end_header   #描述结束,下面开始逐一按行列举上述两种元素,第一种元素是35947个点,每行有5个属性,共35947行。同样地,然后开始按行列举上述第二种元素。

一般元素以下面的格式描述:

        element   <元素名>   <在文件中的个数> 
        property   <数据类型>   <属性名-1> 
        property   <数据类型>   <属性名-2> 
        property   <数据类型>   <属性名-3>

2.点云数据

例子:

-0.0378297 0.12794 0.00447467 0.850855 0.5
-0.0447794 0.128887 0.00190497 0.900159 0.5
-0.0680095 0.151244 0.0371953 0.398443 0.5
-0.00228741 0.13015 0.0232201 0.85268 0.5
-0.0226054 0.126675 0.00715587 0.675938 0.5
-0.0251078 0.125921 0.00624226 0.711533 0.5
-0.0371209 0.127449 0.0017956 0.888639 0.5
0.033213 0.112692 0.0276861 0.652757 0.5
0.0380425 0.109755 0.0161689 0.708171 0.5

 三 、ply转为pcd文件

#include <pcl/io/ply_io.h>
#include <pcl/io/pcd_io.h>
#include <QFileDialog>
    pcl::PCLPointCloud2 cloud;
    //加载ply文件
    pcl::PLYReader reader;
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.ply)");
    if(fileName == "") return;
    reader.read(fileName.toStdString(), cloud);
    //将ply文件保存为pcd文件
    pcl::PCDWriter writer;
    writer.write(QString("/home/li/pcd/"+fileName.section('/',-1,-1).section('.',0,0)+".pcd").toStdString(), cloud);

 四 、pcd转为ply文件

    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
    if(fileName == "") return;
    pcl::io::loadPCDFile<pcl::PointXYZ>(fileName.toStdString(), *cloud);
    pcl::PLYWriter writer;
    writer.write(QString("/home/li/pcd/"+fileName.section('/',-1,-1).section('.',0,0)+".ply").toStdString(), *cloud);
    //pcl::io::savePLYFile("test.ply", *cloud);

猜你喜欢

转载自blog.csdn.net/m0_67254672/article/details/133884123
今日推荐