当前位置: 首页 > news >正文

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

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

在这里插入图片描述

前言

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

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

3. 标定优化

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

总结

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

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

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

相关链接

  • 项目地址: https://github.com/Guoc0529/ZJU_lidar_camera_calib.git
  • 问题反馈: 欢迎在GitHub上提交Issue
  • 贡献代码: 欢迎提交Pull Request
  • 在浙大标定工具的基础上改的,原始标定github地址

http://www.xdnf.cn/news/1189369.html

相关文章:

  • 字节跳动扣子 Coze 宣布开源:采用 Apache 2.0 许可证,支持商用
  • 6.数组和字符串
  • J2EE模式---表现层集成模式
  • 备份一下我的 mac mini 的环境变量配置情况
  • net-snmp添加自定义mib树
  • 【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p
  • 详解力扣高频SQL50题之619. 只出现一次的最大数字【简单】
  • PCIe 的L状态(链路状态)和D状态(设备状态)
  • 前端组件梳理
  • 【WPF】NumericUpDown的用法
  • 【CTF-WEB-反序列化】利用__toString魔术方法读取flag.php
  • 教育培训系统源码解析:如何打造高可扩展的在线学习平台?
  • 【CTF-Web】dirsearch寻找download.php进行?path=flag.txt任意文件下载
  • Android Studio 提示信息 ‘equals(““)‘ can be replaced with ‘isEmpty()‘
  • 《Java 程序设计》第 6 章 - 字符串
  • VTK交互——Callback
  • NLua和C#交互
  • 访问者模式感悟
  • 泰山派GPIO编译 ADB下载 万用表测量GPIO电压
  • 【ELasticsearch】节点角色分类与作用解析
  • OpenCV学习探秘之二 :数字图像的矩阵原理,OpenCV图像类与常用函数接口说明,及其常见操作核心技术详解
  • 分治算法 (Divide and Conquer)原理、及示例-JS版
  • AI 编程工具 Trae 重要的升级。。。
  • 经典IDE之Turbo C
  • nginx的 `root` 和 `alias` 笔记250726
  • 0.深度学习环境配置步骤
  • VTK交互——ClientData
  • 英语听力口语词汇-8.美食类
  • (AC)Playlist
  • 【橘子分布式】gRPC(番外篇-监听流)