1. 程式人生 > >由點雲建立深度圖

由點雲建立深度圖

首先,在PCL(Point Cloud Learning)中國協助發行的書提供光碟的第9章例1資料夾中,開啟名為range_image_creation.cpp的程式碼檔案。
解釋說明
下面來解析開啟原始碼中的關鍵語句。
#include <pcl/range_image/range_image.h>          //深度影象標頭檔案
int main (int argc, char** argv) {
  pcl::PointCloud<pcl::PointXYZ> pointCloud;      //定義點雲物件
  for (float y=-0.5f; y<=0.5f; y+=0.01f) {        //迴圈產生點資料
   for (float z=-0.5f; z<=0.5f; z+=0.01f) {
      pcl::PointXYZ point;
      point.x = 2.0f - y;
      point.y = y;
      point.z = z;
      pointCloud.points.push_back(point);          //迴圈新增點資料到點雲物件
    }
  }
  pointCloud.width = (uint32_t) pointCloud.points.size();
  pointCloud.height = 1;                            //設定點雲物件的頭資訊
這段程式首先建立一組資料作為點雲的資料內容,再設定檔案頭的資訊,整個實現生成一個呈矩形形狀的點雲。
  float angularResolution = (float) (  1.0f * (M_PI/180.0f)); // 按弧度1度
  float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f)); // 按弧度360.0度
  float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f)); // 按弧度180.0度
  Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f,0.0f);                                                           //採集位置
  pcl::RangeImage::CoordinateFrame coordinate_frame =pcl::RangeImage::CAMERA_FRAME;                           //深度影象遵循的座標系統
  float noiseLevel=0.00;
  float minRange = 0.0f;
  int borderSize = 1;
這部分定義了建立深度影象時需要的設定引數,將角度解析度定義為1度,意味著由鄰近的畫素點所對應的每個光束之間相差1度,maxAngleWidth=360和maxAngleHeight=180意味著,我們進行模擬的
距離感測器
對周圍的環境擁有一個完整的360度視角,使用者在任何資料集下都可以使用此設定,因為最終獲取的深度影象將被裁剪到有空間物體存在的區域範圍。但是,使用者可以通過減小數值來節省一些計算資源,例如:對於感測器後面沒有可以觀測的點時,一個水平視角為180度的鐳射掃描器,即maxAngleWidth=180就足夠了,這樣只需要觀察距離感測器前面就可以了,因為後面沒有需要觀察的場景。sensorPose定義了模擬深度影象獲取感測器的6自由度位置,其原始值為橫滾角roll、俯仰角pitch、偏航角yaw都為0,coordinate_frame=CAMERA_FRAME說明系統的X軸是向右的,Y軸是向下的,Z軸是向前的,另外一個選擇是LASER_FRAME,其X軸向前,Y軸向左,Z軸向上。noiseLevel=0是指使用一個歸一化的Z緩衝器來建立深度影象,但是如果想讓鄰近點集都落在同一個畫素單元,使用者可以設定一個較高的值,例如noiseLevel=0.05可以理解為,深度距離值是通過查詢點半徑為125px的圓內包含的點用來平均計算而得到的。如果minRange>0,則所有模擬器所在位置半徑minRange內的鄰近點都將被忽略,即為盲區。在裁剪影象時,如果borderSize>0,將在影象周圍留下當前視點不可見點的邊界。 pcl::RangeImage rangeImage; rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize); std::cout << rangeImage << "\n"; 其餘的程式碼是使用那些使用者給定的引數,從點雲建立深度影象,並且在終端下打印出一些資訊。 深度影象繼承於PointCloud類,它的點型別具有x,y,z和range距離欄位,共有三種類型的點集,有效點集是距離大於零的點集,當前視點不可見點集x=y=z=NAN且值域為負無窮大,遠距離點集x=y=z=NAN且值域為無窮大。 編譯和執行程式 利用光碟提供的CMakeLists.txt檔案,在cmake中建立工程檔案,並生成相應的可執行檔案。生成執行檔案後,就可以運行了,在cmd中鍵入命令: ...>range_image_creation.exe
 本回答由網友推薦 評論  1 1