PointCloud
在PCL 1.x中最基本的資料類型就是PointCloud了。它是一個C++類,包含了如下的資料成員(括号中是這個資料的資料類型):
- width(int)
==指定了點雲資料中的寬度==。width有兩層含義:
- 可以指定點雲的數量,但是隻是對于無序點雲而言。
- 指定有序點雲中,一行點雲的數量。
有序點雲(organized point cloud ):有序點雲中的點排列情況類似圖檔(或矩陣),是按照行和列的結構排列的。這樣的點雲資料通常來自立體相機或TOF相機。有序點雲的優勢在于,通過知道兩個相鄰點的關系,最近鄰點操作會變得更加有效,是以可以加速計算,并且降低PCL中一些算法的開銷。
投影點雲(projectable point cloud):投影點雲首先屬于有序點雲,并且投影點雲中點的下标表示–(u,v)類似圖檔中像素的坐标,與這個點的3D坐标(x,y,z)有一定的關系。這個關系可以由針孔相機模型導出:
u=fxz u = f x z 和 v=fyz v = f y z
例如:
-
height(int)
==指定了點雲資料中的高度==。height有兩層含義:
- 指定有序點雲中,點雲行的數量。
-
對于無序點雲,将height設為1(它的width即為點雲的大小),以此來區分點雲是否有序。
例如:
// 有序點雲--類似圖檔中像素的組織結構,擁有行,列,總共有* = 個點
cloud.width = ;
cloud.height = ;
// 無序點雲--高度為,寬度與點雲大小相同為
cloud.width = ;
cloud.height = ;
-
points(std::vector)
points是存儲類型為PointT的點的向量。舉例來說,對于一個包含XYZ資料的點雲,points成員就是由pcl::PointXYZ類型的點構成的向量:
pcl::PointCloud<pcl::PointXYZ> cloud;
std::vector<pcl::PointXYZ> data = cloud.points;
-
is_dense(bool)
指定點雲中的所有資料都是有限的(true),還是其中的一些點不是有限的,它們的XYZ值可能包含inf/NaN 這樣的值(false)。
-
sensor_origin_(Eigen::Vector4f)
指定傳感器的采集位姿(==origin/translation==)這個成員通常是可選的,并且在PCL的主流算法中用不到。
-
sensor_orientaion_(Eigen::Quaternionf)
指定傳感器的采集位姿(方向)。這個成員通常是可選的,并且在PCL的主流算法中用不到。
為了簡化開發,PointCloud類包含許多幫助成員函數。舉個例子,如果你想判斷一個點雲是否有序,不用檢查height是否等于1,而可以使用isOrganized()函數來判斷:
if (!cloud.isOrganized ())
...
PointT代表了點雲中的單元-點的類型。