一、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\n");
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;
}