激光雷達-相機標定工具:支持普通相機和魚眼相機的交互式標定
前言
在自動駕駛、機器人導航等領域,激光雷達和相機的標定是一個基礎而重要的問題。準確的標定結果直接影響后續的感知算法性能。本文將介紹一個開源的激光雷達-相機標定工具,支持普通針孔相機和魚眼相機,并提供交互式GUI界面進行實時參數調整。
項目介紹
功能特性
- ? 支持普通針孔相機標定
- ? 支持魚眼相機標定
- ? 實時可視化激光雷達點云投影
- ? 交互式參數調整
- ? 支持距離和強度兩種顯示模式
- ? 重疊點過濾功能
- ? 自動保存標定結果
技術棧
- OpenCV 4.x: 圖像處理和相機校正
- PCL: 點云處理
- Pangolin: GUI界面
- Eigen3: 矩陣運算
- CMake: 構建系統
安裝和使用
1. 環境準備
首先確保系統已安裝必要的依賴:
# Ubuntu/Debian系統
sudo apt-get update
sudo apt-get install libopencv-dev libpcl-dev libeigen3-dev libpangolin-dev cmake build-essential
2. 克隆項目
git clone https://github.com/Guoc0529/ZJU_lidar_camera_calib.git
cd ZJU_lidar_camera_calib
3. 編譯項目
mkdir -p build && cd build
cmake .. && make
4. 運行標定
方法一:使用便捷腳本(推薦)
# 使用默認參數(普通相機)
./run_calib.sh# 指定相機類型
./run_calib.sh normal
./run_calib.sh fisheye# 指定所有參數
./run_calib.sh normal /path/to/image.jpg /path/to/cloud.pcd /path/to/intrinsic.json /path/to/extrinsic.json
方法二:直接運行程序
./bin/run_lidar2camera <圖像路徑> <點云路徑> <內參JSON> <外參JSON> <相機類型>
數據格式要求
圖像文件
支持常見的圖像格式:.jpg
, .png
, .bmp
等
點云文件
支持PCL庫支持的格式:.pcd
, .ply
等
內參JSON文件格式
{"camera_name": {"param": {"cam_K": {"data": [[fx, 0, cx], [0, fy, cy], [0, 0, 1]]},"cam_dist": {"data": [[k1, k2, p1, p2]],"cols": 4}}}
}
外參JSON文件格式
{"sensor_name": {"param": {"sensor_calib": {"data": [[r11, r12, r13, tx], [r21, r22, r23, ty], [r31, r32, r33, tz], [0, 0, 0, 1]]}}}
}
交互式標定界面
程序啟動后會顯示一個GUI界面,包含以下控制選項:
顯示控制
- Intensity Color: 切換距離/強度顯示模式
- Overlap Filter: 啟用/禁用重疊點過濾
- Point Size: 調整點云顯示大小
標定參數調整
- deg step: 角度調整步長
- t step(cm): 平移調整步長
- fxfy scale: 焦距調整比例
外參調整按鈕
- +/- x degree: 調整X軸旋轉
- +/- y degree: 調整Y軸旋轉
- +/- z degree: 調整Z軸旋轉
- +/- x trans: 調整X軸平移
- +/- y trans: 調整Y軸平移
- +/- z trans: 調整Z軸平移
內參調整按鈕
- +/- fx: 調整焦距fx
- +/- fy: 調整焦距fy
其他功能
- Reset: 重置所有參數到初始值
- Save Image: 保存當前標定結果
鍵盤快捷鍵
q
: 退出程序w/s
: 調整Y軸平移a/d
: 調整X軸平移z/c
: 調整Z軸平移r/f
: 調整X軸旋轉t/g
: 調整Y軸旋轉y/h
: 調整Z軸旋轉
相機類型選擇
普通相機 (normal)
- 使用
cv::initUndistortRectifyMap()
進行校正 - 適用于針孔相機模型
- 畸變參數:k1, k2, p1, p2
魚眼相機 (fisheye)
- 使用
cv::fisheye::initUndistortRectifyMap()
進行校正 - 適用于魚眼相機模型
- 畸變參數:k1, k2, k3, k4
標定結果
程序會生成 calibration_X.txt
文件,包含:
外參矩陣
R: 旋轉矩陣 (3x3)
t: 平移向量 (3x1)
內參矩陣
K: 相機內參矩陣 (3x3)
JSON格式
Extrinsic: [R11,R12,R13,tx],[R21,R22,R23,ty],[R31,R32,R33,tz],[0,0,0,1]
Intrinsic: [fx,0,cx],[0,fy,cy],[0,0,1]
Distortion: [k1,k2,p1,p2]
使用示例
示例1:普通相機標定
# 使用項目提供的示例數據
./run_calib.sh normal# 使用自定義數據
./run_calib.sh normal /path/to/image.jpg /path/to/cloud.pcd /path/to/intrinsic.json /path/to/extrinsic.json
示例2:魚眼相機標定
# 使用魚眼相機模式
./run_calib.sh fisheye /path/to/image.jpg /path/to/cloud.pcd /path/to/intrinsic.json /path/to/extrinsic.json
標定技巧
1. 數據準備
- 確保圖像和點云是同步采集的
- 選擇特征豐富的場景(如建筑物、道路標線等)
- 避免純色或紋理單一的區域
2. 初始參數設置
- 提供合理的初始外參可以提高標定效率
- 可以通過CAD圖紙或粗略測量獲得初始值
- 內參通常可以從相機標定工具獲得
3. 標定過程
- 先調整大致的旋轉和平移
- 再微調內參(如果需要)
- 最后進行精細調整
- 保存多個版本的結果進行對比
4. 驗證標定結果
- 檢查點云投影是否與圖像特征對齊
- 在不同距離和角度驗證標定精度
- 使用標定板進行定量評估
常見問題
Q1: 編譯時出現依賴庫錯誤
A: 確保安裝了所有必要的依賴庫:
sudo apt-get install libopencv-dev libpcl-dev libeigen3-dev libpangolin-dev
Q2: 運行時點云不顯示
A: 檢查以下幾點:
- 外參是否合理
- 點云是否在相機視野范圍內
- ROI設置是否合適
Q3: 標定精度不夠
A: 嘗試以下方法:
- 使用更多角度的數據
- 調整初始參數
- 選擇特征更豐富的場景
Q4: 魚眼相機校正效果不好
A: 確保:
- 選擇了正確的相機類型(fisheye)
- 畸變參數格式正確
- 畸變參數數量匹配
項目結構
ZJU_lidar_camera_calib/
├── src/ # 源代碼
│ └── run_lidar2camera.cpp
├── include/ # 頭文件
│ ├── projector_lidar.hpp
│ ├── intrinsic_param.hpp
│ └── extrinsic_param.hpp
├── data/ # 示例數據
├── example_data/ # 示例數據
├── CMakeLists.txt # CMake配置
├── run_calib.sh # 便捷運行腳本
├── test_fisheye_calib.sh # 測試腳本
└── README.md # 項目文檔
技術原理
1. 相機模型
- 針孔相機模型: 適用于普通相機,使用徑向和切向畸變模型
- 魚眼相機模型: 適用于廣角相機,使用魚眼畸變模型
2. 點云投影
- 應用外參變換:
P_camera = R * P_lidar + t
- 投影到圖像平面:
p_image = K * P_camera
- 應用去畸變校正
- 根據距離或強度進行顏色編碼
3. 標定優化
- 使用交互式界面進行手動調整
- 實時可視化投影結果
- 支持多種顯示模式便于判斷
總結
這個激光雷達-相機標定工具提供了完整的標定解決方案,支持普通相機和魚眼相機,具有以下優勢:
- 易用性: 提供便捷的運行腳本和詳細的文檔
- 靈活性: 支持多種相機類型和數據格式
- 可視化: 實時顯示標定結果,便于判斷
- 交互性: 提供豐富的控制選項和快捷鍵
- 開源: 代碼完全開源,可自由修改和擴展
無論是學術研究還是工程應用,這個工具都能提供有效的支持。希望這個工具能夠幫助到有激光雷達-相機標定需求的研究者和工程師。
相關鏈接
- 項目地址: https://github.com/Guoc0529/ZJU_lidar_camera_calib.git
- 問題反饋: 歡迎在GitHub上提交Issue
- 貢獻代碼: 歡迎提交Pull Request
- 在浙大標定工具的基礎上改的,原始標定github地址