日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

多相机坐标转换_使用KITTI数据集实现坐标转换

發布時間:2025/3/12 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多相机坐标转换_使用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:

  • 把x<5的點去掉了。物理意義就是,距離小于5的范圍可能處于相機的盲區,拍不到。去掉這些點可以提高速度。
  • 點云中,每5個點取一個點。也是為了提高計算速度。
  • 在實現遠距離是藍色,近距離是紅色時,kitti官方代碼將距離映射成0-63的整數,每個整數對應一個顏色,實現方式很有趣。
  • col_idx = round(64*5/velo(i,1));

    這里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数据集实现坐标转换的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。