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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章