從點雲數據生成深度圖像

一、 定義

  1. 深度圖像的每個像素點的灰度值可用於表徵場景中某一點距離攝像機的遠近。 直接反應了景物可見表面的幾何形狀。
  2. 深度圖像經過座標轉換可以計算爲點雲數據,點雲數據也可以轉換爲深度圖像。

二、PCL相關函數庫

  1. 所在頭文件:#include <pcl/range_image/range_image.h>

  2. PCL類

     RangeImage是一個工具類,用於在特定視角捕捉的3D場景。
    

2.1 函數:


template<typename PointCloudType > 
void pcl::RangeImage::createFromPointCloud  ( const PointCloudType &  point_cloud,  
  float  angular_resolution = pcl::deg2rad (0.5f),  
  float  max_angle_width = pcl::deg2rad (360.0f),  
  float  max_angle_height = pcl::deg2rad (180.0f),  
  const Eigen::Affine3f &  sensor_pose = Eigen::Affine3f::Identity (),  
  RangeImage::CoordinateFrame  coordinate_frame = CAMERA_FRAME,  
  float  noise_level = 0.0f,  
  float  min_range = 0.0f,  
  int  border_size = 0  
 )   
 
參數 描述
point_cloud 輸入的點雲數據
angular_resolution 圖像中各個像素之間的角差(弧度)。 角差是一次信號與二次信號的相位之差。
max_angle_width 定義傳感器水平邊界的角度(弧度)。
max_angle_height 定義傳感器垂直邊界的角度(弧度)。
sensor_pose 傳感器姿態的變換矩陣
coordinate_frame 座標系統 (默認爲相機座標系 CAMERA_FRAME)
noise_level 近鄰點對查詢點距離的影響水平
min_range 最小可視深度 (defaults to 0)
border_size 點雲邊界的尺寸大小 (defaults to 0)

三、例子分析


int main (int argc, char** argv) {
  pcl::PointCloud<pcl::PointXYZ> pointCloud;
  
  // Generate the data 生成表示矩形的點雲數據
  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;
  
  // We now want to create a range image from the above point cloud, with a 1deg angular resolution
  float angularResolution = (float) (  1.0f * (M_PI/180.0f));  //   1.0 degree in radians
  float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f));  // 360.0 degree in radians
  float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f));  // 180.0 degree in radians
  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;
  
  pcl::RangeImage rangeImage;
  rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight,
                                  sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
  
  std::cout << rangeImage << "\n";
}
  float angularResolution = (float) (  1.0f * (M_PI/180.0f));  //   1.0 degree in radians
  float maxAngleWidth     = (float) (360.0f * (M_PI/180.0f));  // 360.0 degree in radians
  float maxAngleHeight    = (float) (180.0f * (M_PI/180.0f));  // 180.0 degree in radians
  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;

angularResolution 表示相鄰像素之間的角差是一度。

maxAngleWidth=360 maxAngleHeight=180,表示我們模擬的距離傳感器對周圍環境是一個完整的360度視圖。 通過調整這個值設置激光器掃描的視角,從而減少計算量。 比如:一個激光只需要描述前方的180度的數據,後面的數據可以忽視,那麼設置 maxAngleWidth=180 就足夠了。

傳感器姿態,包含6DoF (6個自由度), 其中roll=pitch=yaw=0.

coordinate_frame=CAMERA_FRAME 表示x面向右,y向下,z軸向前。另一種選擇是LASER_FRAME, x面向前,y向左,z向向上。

noiseLevel=0 表示 深度圖使用一個歸一化的z緩衝區創建的。如果想讓鄰近點都落在同一個像素單元,用戶可以使用較高的值。例如noiseLevel=0.05,深度距離值是通過查詢點半徑爲5cm的圓內包含的點,平均計算而得到的。

如果minRange是大於0的,那麼所有深度值小於這個值的點都將被忽略。

minRange = 0.0f 及 minRange=2.0f 結果對比

 

minRange = 0

 

minRange = 0

 

 

minRange=2.0f

 

minRange=2.0f

 

當裁剪時,borderSize 大於0會在圖像周圍留下當前視點看過去不可見點的邊界。

  pcl::RangeImage rangeImage;
  rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight,
                                  sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
  

深度圖像值繼承自PointCloud類 而且 它的點有 x,y,z和range 四個成員。有三類點,可用的真實點是深度大於0, 不可被觀察的點是 x=y=z=NAN 並且 range=-INFINITY. 最遠距離的點是 x=y=z=NAN 並且 range=INFINITY.

補充:

什麼是6DoF
自由度總共有6個,可分成兩種不同的類型:平移和旋轉。
1. 平移運動

剛體可以在3個自由度中平移:向前/向後,向上/向下,向左/向右。

 

平移運動

 

平移運動

 

2. 旋轉運動

剛體也可以在3個自由度中旋轉:縱搖(Pitch)、橫搖(Roll)和垂搖(Yaw)。

 

旋轉運動

 

旋轉運動

 

因此,3種類型的平移自由度+3種類型的旋轉自由度 = 6自由度! 在任意一個自由度中,物體可以沿兩個“方向”自由運動
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章