天天看點

由點雲建立深度圖

首先,在PCL(Point Cloud Learning)中國協助發行的書提供CD光牒的第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且值域為無窮大。
編譯和運作程式
利用CD光牒提供的CMakeLists.txt檔案,在cmake中建立工程檔案,并生成相應的可執行檔案。生成執行檔案後,就可以運作了,在cmd中鍵入指令:
...>range_image_creation.exe      

 本回答由網友推薦 評論  1  1