多相机坐标转换_使用KITTI数据集实现坐标转换
本文的主要內容,是討論如何將KITTI激光雷達的點云數據,映射到圖像中去。
KITTI數據集是怎么采集的
下面這幅圖是車的俯視圖,可以看到,用到了2個彩色相機,2個灰度相機,1個激光雷達。1個GPS/IMU。
圖1 KITTI車俯視圖KITTI標系是怎么定義的
比較值得注意的是,藍字部分標注的Velodyne激光雷達的坐標系中, X坐標是向前的。也就意味著激光雷達數據中的X數據,給的是物體的距離信息。這點在我的代碼中的時候會有體現。
KITTI車傳感器坐標定義KITTI怎么從點云映射到圖像?
我看了Kitti官方論文《Vision meets Robotics: The KITTI Dataset》,要想把點云映射到圖像,核心的公式就是
圖2 點云坐標x映射到圖像坐標y先說說映射流程流程。
- 首先經過 矩陣映射。經過這一步,點云坐標被映射到了0號相機坐標系里。
- 然后經過 矩陣映射。這一步我也沒太搞懂。比較奇怪的是,不管像映射到哪個編號的相機,似乎都需要左乘 矩陣。而且這個矩陣看上去僅僅是一個內參矩陣……
- 最后經過 矩陣映射,被變換到了i號相機所在的圖像坐標系。
再說說各部分長什么樣。
- 是點云數據的齊次坐標形式,一個4行1列的列向量, 。
- 是4*4的矩陣。它并非是平移矩陣,而是標定得到的激光雷達和相機的外參矩陣。包括了旋轉矩陣 和平移矩陣 兩部分, 如下
|
|- 是4*4的矩陣,最后一行為 ,是從3*3矩陣擴展來的。
- 是3*4的矩陣。
- 是最終映射得到的圖像坐標,是一個3行1列的列向量, 。為了變換成齊次坐標的形式,需要做一個歸一化,除以 。
KITTI怎么獲取上述映射矩陣?
公式中:
為點云數據,使用.bin二進制文件儲存,可以使用c++讀取。里面包括了三維坐標信息和反射率。對于幾個轉換矩陣,KITTI提供了三類標定文件,分別叫
- calib_cam_to_cam.txt: 相機之間的坐標轉換矩陣
- calib_imu_to_velo.txt: IMU和激光雷達的坐標轉換
- calib_velo_to_cam.txt: 相機和激光雷達之間的坐標轉換
本文中要將激光雷達的點云數據,映射到圖像中去。因此用到的是calib_cam_to_cam.txt和calib_velo_to_cam.txt。
就是calib_cam_to_cam.txt中的P_rect_0i。是由calib_cam_to_cam.txt的3*3的R_rect_00矩陣擴展一個維度而來。由calib_velo_to_cam.txt中的R和T,擴展出來的。在這些標定txt文件中,所有的數據都是按行存儲的,也就是P_rect的1-4個數據,是矩陣
的第一行。怎么顯示出映射后融合效果?
通過上述公式,我們已經可以把3維點云數據映射至圖像坐標了。可以直接在圖像上標記出這些點。
但是,為了更酷炫的顯示這個效果,我們可以根據點云的x坐標給這些點上色。用x坐標的原因,也就是剛剛上面提到的因為激光雷達的坐標系x軸是朝前的,實際上坐標x就是物體距離。
一般使用各大編程語言的colormap里的JET色彩就能實現漸變效果,距離遠的點是藍色的,距離近的點是紅色的。
映射后的效果圖如下:
Kitti官方提供了 MATLAB代碼run_demoVelodyne.m。這份代碼里,為了顯示融合效果,用到了幾個tricks:
這里velo(i,1)就是距離。由于他把x<5的點去掉了,所以5/velo(i,1)范圍在(0,1]之間。64*5/velo(i,1)就到了(0,64]之間。取整之后,就變成了0-63的整數。
c++代碼
依據官方代碼,我實現了c++版本的。
https://gitee.com/cuiry/learn3D/tree/master/learnKitti?gitee.com里面有1張kitti彩色圖像,和對應的點云bin文件、標定txt文件。
代碼實現了bin文件和標定txt數據的讀取、從點云坐標轉換成圖像坐標、以及融合效果的顯示。
代碼運行在Ubuntu18.04,需要opencv4.4.0和PCL庫。
參考資料
kitti數據集坐標轉換_馮子材的博客-CSDN博客?blog.csdn.nethttps://github.com/ZouCheng321/fusion_kitti/blob/master/run_demoVelodyne.m?github.com總結
以上是生活随笔為你收集整理的多相机坐标转换_使用KITTI数据集实现坐标转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux系统下定时备份,在Linux系
- 下一篇: JDBC练习二