激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定

激光雷达-相机标定工具:支持普通相机和鱼眼相机的交互式标定

前言

在自动驾驶、机器人导航等领域,激光雷达和相机的标定是一个基础而重要的问题。准确的标定结果直接影响后续的感知算法性能。本文将介绍一个开源的激光雷达-相机标定工具,支持普通针孔相机和鱼眼相机,并提供交互式GUI界面进行实时参数调整。

项目介绍

功能特性

  • ✅ 支持普通针孔相机标定
  • ✅ 支持鱼眼相机标定
  • ✅ 实时可视化激光雷达点云投影
  • ✅ 交互式参数调整
  • ✅ 支持距离和强度两种显示模式
  • ✅ 重叠点过滤功能
  • ✅ 自动保存标定结果

技术栈

  • OpenCV 4.x: 图像处理和相机校正
  • PCL: 点云处理
  • Pangolin: GUI界面
  • Eigen3: 矩阵运算
  • CMake: 构建系统

安装和使用

1. 环境准备

首先确保系统已安装必要的依赖:

bash 复制代码
# Ubuntu/Debian系统
sudo apt-get update
sudo apt-get install libopencv-dev libpcl-dev libeigen3-dev libpangolin-dev cmake build-essential

2. 克隆项目

bash 复制代码
git clone https://github.com/Guoc0529/ZJU_lidar_camera_calib.git
cd ZJU_lidar_camera_calib

3. 编译项目

bash 复制代码
mkdir -p build && cd build
cmake .. && make

4. 运行标定

方法一:使用便捷脚本(推荐)
bash 复制代码
# 使用默认参数(普通相机)
./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
方法二:直接运行程序
bash 复制代码
./bin/run_lidar2camera <图像路径> <点云路径> <内参JSON> <外参JSON> <相机类型>

数据格式要求

图像文件

支持常见的图像格式:.jpg, .png, .bmp

点云文件

支持PCL库支持的格式:.pcd, .ply

内参JSON文件格式

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文件格式

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:普通相机标定

bash 复制代码
# 使用项目提供的示例数据
./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:鱼眼相机标定

bash 复制代码
# 使用鱼眼相机模式
./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: 确保安装了所有必要的依赖库:

bash 复制代码
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. 点云投影

  1. 应用外参变换:P_camera = R * P_lidar + t
  2. 投影到图像平面:p_image = K * P_camera
  3. 应用去畸变校正
  4. 根据距离或强度进行颜色编码

3. 标定优化

  • 使用交互式界面进行手动调整
  • 实时可视化投影结果
  • 支持多种显示模式便于判断

总结

这个激光雷达-相机标定工具提供了完整的标定解决方案,支持普通相机和鱼眼相机,具有以下优势:

  1. 易用性: 提供便捷的运行脚本和详细的文档
  2. 灵活性: 支持多种相机类型和数据格式
  3. 可视化: 实时显示标定结果,便于判断
  4. 交互性: 提供丰富的控制选项和快捷键
  5. 开源: 代码完全开源,可自由修改和扩展

无论是学术研究还是工程应用,这个工具都能提供有效的支持。希望这个工具能够帮助到有激光雷达-相机标定需求的研究者和工程师。

相关链接


相关推荐
GDAL20 天前
viewer.camera.flyTo 全面教程
cesium·camera·flyto
STCNXPARM1 个月前
Linux camera之V4L2子系统详解
android·linux·camera·v4l2架构
STCNXPARM1 个月前
Android camera之硬件架构
android·硬件架构·camera
STCNXPARM1 个月前
Linux camera之Media子系统
linux·camera·v4l2·media子系统
习惯就好zz1 个月前
地图编辑部分教程总结
godot·camera·tilemap·2d·game·tileset
sunfove1 个月前
VCSEL原理与应用简述
lidar·vcsel
故事不长丨2 个月前
安卓相机开发:Camera、Camera2与CameraX的使用对比及选型指南
android·相机·camera·camerax·camera2·移动设备·相机开发
原野风霜3242 个月前
激光雷达(Lidar)介绍
雷达·激光雷达·lidar·毫米波雷达
一口Linux2 个月前
camera|16.一种修改摄像头分辨率的方法
camera·瑞芯微
jamie_chu2 个月前
显微图像采集 - 工业摄像机与图像采集软件介绍
图像处理·数码相机·camera·摄像头·图像测量·jcamerapro