目的
使用雷達點雲提供的深度信息
如何實現
將雷達的三維點雲投影到相機的二維圖像上
kitti數據集簡介
kitti的數據采集平台,配置有四個攝像機和一個激光雷達,四個攝像機中有兩個灰度攝像機,兩個彩色攝像機。
從圖中可看出,關於相機坐標系(camera)的方向與雷達坐標系(velodyne)的方向規定:
camera: x = right, y = down, z = forward
velodyne: x = forward, y = left, z = up
那么velodyne所采集到的點雲數據中,各點的x軸坐標,即為所需的深度信息。
更多詳細的簡介網絡上都能搜索到,這里只列舉了與當前目的相關的必要信息。
kitti數據集的raw_data
raw_data對於每個序列都提供了同步且校准后的數據、標定數據。
同步且校准后的數據:
./imageXX 包含有各個攝像機采集到的圖像序列
./velodyne_points 包含有雷達掃描到的數據,點雲形式,每個點以 (x,y,z,i) 格式存儲,i為反射值
(雷達采集數據時,是繞着豎直軸旋轉掃描,只有當雷達旋轉到與相機的朝向一致時會觸發相機采集圖像。不過在這里無需關注這一點,直接使用給出的同步且校准后的數據即可,它已將雷達數據與相機數據對齊,也就是可以認為同一文件名對應的圖像數據與雷達點雲數據屬於同一個場景。)
標定數據:
./cam_to_cam 包含有各個攝像機的標定參數
./velo_to_cam 包含有雷達到攝像機的變換參數
對於raw_data,kitti還提供了樣例工具,方便讀取各種數據文件並輸出,參見官網raw_data下載頁的development kit
利用kitti提供的devkit以及相應數據集的calib文件
解讀calib文件夾
cam_to_cam,包含各相機的標定參數
- S_xx: 1x2 矯正前xx號相機的圖片尺寸
- K_xx: 3x3 矯正前xx號相機的標定參數
- D_xx: 1x5 矯正前xx號相機的畸變系數
- R_xx: 3x3 外參,xx號相機的旋轉矩陣
- T_xx: 3x1 外參,xx號相機的平移矩陣
- S_rect_xx: 1x2 矯正后XX號相機的圖片尺寸
- R_rect_xx: 3x3 旋轉矩陣,用於矯正xx號相機,使得圖像平面共面(原話是make image planes co-planar)。
- P_rect_0x: 3x4 投影矩陣,用於從矯正后的0號相機坐標系 投影到 X號相機的圖像平面。
這里只用到最后兩個矩陣R_rect和P_rect
velo_to_cam,從雷達坐標系到0號相機坐標系的轉換
- R: 3x3 旋轉矩陣
- T: 3x1 平移矩陣
- delta_f 和delta_c 已被棄用
由此可以得出從雷達坐標系變換到xx號相機的圖像坐標系的公式:
設X為雷達坐標系中的齊次坐標 X = [x y z 1]',對應於xx號相機的圖像坐標系的齊次坐標Y = [u v 1]',則:
其中
(R|T) : 雷達坐標系 -> 0號相機坐標系
R_rect_00: 0號相機坐標系 -> 矯正后的0號相機坐標系
P_rect_0x: 矯正后的0號相機坐標系 -> x號相機的圖像平面
更詳細完整的解讀參見devkit中的readme.txt
解讀devkit
官網提供的樣例代碼中 run_demoVelodyne.m 實現了將雷達點雲投影到相機圖像
代碼流程
- 從所給路徑中讀取標定文件,獲取具體矩陣數值
- 根據上述公式,計算投影矩陣 P_velo_to_img,即 Y = P_velo_to_img * X
- 從所給路徑中讀取相機圖片,並加載雷達的點雲數據。由於只做展示用,為了加快運行速度,對於雷達點雲,每隔5個點只保留1個點
- 移除那些距離雷達5米之內(雷達的x方向)的點 (猜測這些點落在相機和雷達之間,故不會出現在圖像平面上)
- 作投影計算,得到投影到二維圖像上的點
6.在圖像上畫出投影后的點,按照深度(雷達點的x方向值)確定顏色,彩色則是暖色越近,冷色越遠;灰度則是深色越近,淺色越遠。
若需要從深度圖獲取深度值,應按照畫投影點時深度值到顏色(灰度)值的轉換。
來源:https://www.cnblogs.com/notesbyY/p/10478645.html