目前深度圖像的擷取方法有雷射雷達深度成像法,計算機立體視覺成像,坐标測量機法,莫爾條紋法,結構光法等等,針對深度圖像的研究重點主要集中在以下幾個方面,深度圖像的分割技術 ,深度圖像的邊緣檢測技術 ,基于不同視點的多幅深度圖像的配準技術,基于深度資料的三維重建技術,基于三維深度圖像的三維目辨別别技術,深度圖像的多分辨率模組化和幾何壓縮技術等等,在PCL 中深度圖像與點雲最主要的差別在于 其近鄰的檢索方式的不同,并且可以互相轉換。
(這一章是我認為非常重要的)
子產品RangeImage相關概念以及算法的介紹
深度圖像(Depth Images)也被稱為距離影像(Range Image),是指将從圖像采集器到場景中各點的距離值作為像素值的圖像,它直接反應了景物可見表面的幾何形狀,利用它可以很友善的解決3D目标描述中的許多問題,深度圖像經過點雲變換可以計算為點雲資料,有規則及有必要資訊的點雲資料可以反算為深度圖像資料

不同視角獲得深度圖像的過程:
(1)PCL中的子產品RangeImage相關類的介紹
pcl_range_image庫中包含兩個表達深度圖像和對深度圖像進行操作的類,其依賴于pcl::common子產品,深度圖像(距離圖像)的像素值代表從傳感器到物體的距離以及深度, 深度圖像是物體的三維表示形式,一般通過立體照相機或者ToF照相機擷取,如果具備照相機的内标定參數,就可以将深度圖像轉換為點雲
1.class pcl::RangeImage
RangeImage類繼承于PointCloud,主要功能是實作一個特定視點得到一個三維場景的深度圖像。其繼承關系如下:
類RangeImage的成員有:
template<typename PointCloudType >
void
從點雲建立深度圖像,point_cloud為指向建立深度圖像所需要的點雲的引用,angular_resolution為模拟的深度傳感器的角度分辨率,即深度圖像中一個像素對應的角度大小,max_angle_width為模拟的深度傳感器的水準最大采樣角度,max_angle_height為模拟傳感器的垂直方向最大采樣角度,sensor_pose設定模拟的深度傳感器的位姿是一個仿射變換矩陣,預設為4*4的機關矩陣變換,coordinate_frame定義按照那種坐标系統的習慣預設為CAMERA_FRAME,noise_level擷取深度圖像深度時,近鄰點對查詢點距離值的影響水準,min_range設定最小的擷取距離,小于最小擷取距離的位置為傳感器的盲區,border_size獲得深度圖像的邊緣的寬度 預設為0 該函數中涉及的角度的機關都是弧度
從點雲建立深度圖像,其中參數中有關場景大小的提示,提高了擷取深度圖像時的計算速度。point_cloud為指向建立深度圖像所需要的點雲的引用,angular_resolution為模拟的深度傳感器的角度分辨率,弧度表示,point_cloud_center為點雲外接球體的中心,預設為(0,0,0)point_cloud_radius為點雲外接球體的半徑,sensor_pose設定模拟的深度傳感器的位姿是一個仿射變換矩陣,預設為4*4的機關矩陣變換,coordinate_frame定義按照那種坐标系統的習慣預設為CAMERA_FRAME,noise_level擷取深度圖像深度時,近鄰點對查詢點距離值的影響距離,以米為機關,min_range設定最小的擷取距離,小于最小擷取距離的位置為傳感器的盲區,border_size獲得深度圖像的邊緣的寬度 預設為0 該函數中涉及的角度的機關都是弧度
template<typename PointCloudTypeWithViewpoints >
從點雲建立深度圖像,點雲中包含深度資訊,其中,point_cloud為指向建立深度圖像所需要的點雲的引用,angular_resolution為模拟的深度傳感器的角度分辨率,即深度圖像中一個像素對應的角度大小,max_angle_width為模拟的深度傳感器的水準最大采樣角度,max_angle_height為模拟傳感器的垂直方向最大采樣角度,sensor_pose設定模拟的深度傳感器的位姿是一個仿射變換矩陣,預設為4*4的機關矩陣變換,coordinate_frame定義按照那種坐标系統的習慣預設為CAMERA_FRAME,noise_level擷取深度圖像深度時,近鄰點對查詢點距離值的影響水準,如果該值比較小,則常用Z-緩沖區中深度平均值作為查詢點的深度,min_range設定最小的可視深度,小于最小擷取距離的位置為傳感器的盲區,border_size獲得深度圖像的邊緣的寬度 預設為0 該函數中涉及的角度的機關都是弧度
建立一個空的深度圖像,以目前視點不可見點填充,其中,angle_width為模拟的深度傳感器的水準采樣角度,預設為PI*2(360);angle_height垂直方向的采樣角度預設為PI(180)*****其他參數同上
将已有的遠距離測量結果融合到深度圖像中,
PCL_EXPORTS void
裁剪深度圖像到最小尺寸,使這個最小尺寸包含所有點雲,其中,board_size設定裁剪後深度圖像的邊界尺寸, top為裁剪框的邊界***********預設都為-1
設定從深度圖像坐标系(傳感器的坐标系)轉換到世界坐标系的變換矩陣
float
獲得深度圖像X和Y方向的角分辨率 弧度表示
設定深度圖像在X方向和Y方向的新的角分辨率,angular_resolution即每個像素所對應的弧度
根據深度圖像點(X Y)和距離(range)計算傳回場景中的3D點的point
根據給定的深度圖像點和離該點最近像素上的距離值計算傳回場景中的3D 點point
(詳細的解釋請官網檢視)
(2)class pcl::RangeImagePlanner
RangeImagePlanner 來源于最原始的深度圖像,但又差別于原始的深度圖像,因為該類不使用球類投影方式,而是通過一個平面投影方式進行投影(相機一一般采用這種投影方式),是以對于已有的利用深度傳感器擷取的深度圖像來說比較實用,類的繼承關系如下:
從給定的視差圖像中建立圖像,其中disparity_image是輸入的視差圖像,di_width視差圖像的寬度di_height視差圖像的高度focal_length, 産生視差圖像的照相機的焦距,base_line是用于産生視差圖像的立體相對的基線長度,desired_angular_resolution預設的角分辨率 每個像素對應的弧度,該值不能大于點雲的密度,
從已存在的深度影像中建立深度圖像,其中,depth_image是輸入的浮點形的深度圖像,di_width,深度圖像的寬度,di_height圖像的高度,di_center_x di_center_y 是照相機投影中心XY的坐标。di_focal_length_x di_focal_length_y是照相機水準 垂直方向上的焦距,desired_angular_resolution預設的角分辨率 每個像素對應的弧度,該值不能大于點雲的密度,
從已存在的點雲中建立圖像,point_cloud為指向建立深度圖像所需要的點雲對象的引用,di_width視差圖像的寬度di_height視差圖像的高度 di_center_x di_center_y 是照相機投影中心XY的坐标 di_focal_length_x di_focal_length_y是照相機水準 垂直方向上的焦距 sensor_pose是模拟深度照相機的位姿 coordinate_frame為點雲所使用的坐标系 noise_level傳感器的水準噪聲,
virtual void
根據給定圖像點和深度圖建立3D點,其中image_x iamge_y range 分别為XY 坐标和深度,point為生成的3D點
從給定的3D點point中計算圖像點(X Y)和深度值
等等具體看官網
(3)應用執行個體
如何從點雲建立深度圖,如何從點雲和給定的傳感器的位置來建立深度圖像,此程式是生成一個矩形的點雲,然後基于該點雲建立深度圖像
建立檔案range_image_creation.cpp:
顯示結果
微信公衆号号可掃描二維碼一起共同學習交流
未完待續******************************88888