激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定
激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定
前言
在自动驾驶、机器人导航等领域,激光雷达和相机的标定是一个基础而重要的问题。准确的标定结果直接影响后续的感知算法性能。本文将介绍一个开源的激光雷达-相机标定工具,支持普通针孔相机和鱼眼相机,并提供交互式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地址