天天看點

(二)PCL基本資料類型PointCloud

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代表了點雲中的單元-點的類型。

繼續閱讀