ILCC

ILCC

3D激光雷达与相机自动外参标定方法

ILCC是一个开源项目,提供基于激光反射强度的3D激光雷达和相机自动外参标定方法。项目功能包括点云分割、棋盘格检测、角点提取和外参优化,支持多种激光雷达型号。ILCC适用于全景和单目相机标定,提供3D点云可视化工具。项目附有使用说明和示例数据,便于研究人员使用。

LiDAR相机标定点云处理计算机视觉3D重建Github开源项目

3D-LiDAR和相机外参标定 [论文][arxiv]

<!-- 基于激光反射强度 -->

许可证

引用

如果您觉得我们的代码和方法对您的工作有用,请考虑引用本文:

@Article{WANG2017Lidar_camera_cali,
AUTHOR = {Wang, Weimin and Sakurada, Ken and Kawaguchi, Nobuo},
TITLE = {Reflectance Intensity Assisted Automatic and Accurate Extrinsic Calibration of 3D LiDAR and Panoramic Camera Using a Printed Chessboard},
JOURNAL = {Remote Sensing},
VOLUME = {9},
YEAR = {2017},
NUMBER = {8},
ARTICLE-NUMBER = {851},
ISSN = {2072-4292},
DOI = {10.3390/rs9080851}
}

简介

这是一个基于激光反射强度的3D-LiDAR和相机全自动精确外参标定的Python实现。<br> 论文可在此处获取。<br> 此实现的主要特点是:<br>

  1. 自动分割Velodyne 3D LiDAR采集的点云
  2. 自动检测棋盘格
  3. 自动从棋盘格点云中检测角点
  4. 外参标定参数优化
  5. 使用VTK Python封装实现各种3D点云可视化<br> 这些功能适用于VLP-16、HDL-32e和HDL-64e。然而,它们仅在HDL-32e上进行了测试。如果有人能提供其他类型的数据进行测试,我们将不胜感激。 <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/b6f36523-3e85-401b-85af-82b5f1b92d1c.gif" />

更新

  • 2018-06-05 添加在Ubuntu上安装依赖项的说明。
  • 2018-04-16(0.2版本发布)
    • 实现单目相机标定。
    • 为透视相机标定添加样本数据和结果。
    • 添加一项功能,可以在将点云投影到图像时隐藏被棋盘格遮挡的部分。
    • 其他一些小的更改。

依赖项(在macOS sierra和Ubuntu 14.04/16.04上测试通过)

  • Python >= 2.7.9
  • OpenCV(如果使用pyenv安装的Python,请记住启用Python共享库
    • 对于macOS:<br>
    brew install opencv3 echo /usr/local/opt/opencv3/lib/python2.7/site-packages >> /usr/local/lib/python2.7/site-packages/opencv3.pth
    • 对于Ubuntu:<br>
    git clone https://github.com/opencv/opencv.git cd opencv && mkdir build && cd build && cmake .. && make -j4 && make install
  • OpenGV
    • 对于macOS和Ubuntu:<br>
    git clone https://github.com/mfxox/opengv cd opengv mkdir build && cd build && cmake .. && make && make install
  • 点云库(PCL)
    • 对于macOS:<br>
    brew install pcl
    • 对于Ubuntu:<br>
    sudo apt-get install libpcl-1.7-all
    从源码构建
  • [PCL Python绑定](https://github.com/mfxox/ILCC/blob/master/https://github.com/mfxox/python-pcl
    • 对于macOS和Ubuntu:<br>
    git clone https://github.com/mfxox/python-pcl cd python-pcl python setup.py install
  • MATLAB引擎for Python
    • 对于macOS和Linux:<br>
    cd "matlabroot/extern/engines/python" python setup.py install
    • MATLAB Python用于全景图像的角点检测。OpenCV后端也可用,可以通过config.yaml中的__backend__参数设置,但OpenCV可能无法检测到角点。您也可以使用样本数据中的示例文件(output/img_corners)中检测到的角点来尝试标定。

可选

  • VTK =7.1.1:3D可视化
    • 对于macOS:<br>
    brew install vtk

使用方法

安装

git clone --recurse-submodules https://github.com/mfxox/ILCC cd ILCC python setup.py install

文件说明

config.py:参数设置 <br> img_corners_est.py:使用OpenCV或MATLAB从图像估计棋盘格角点<br> pcd_corners_est.py:从点云估计棋盘格角点<br> LM_opt.py:加载对应的2D-3D角点,使用PnP方法计算初始值,用LM方法优化结果<br> utility.py:用于各种可视化的实用函数

处理数据

  1. 创建一个文件夹,例如命名为__DATA__,并创建图像和点云文件夹__DATA/img__和__DATA/pcd__。

  2. 将全景图像放入__DATA/img__,点云文件放入__DATA/pcd__。文件应该命名为00XX.png或00XX.csv。

  3. cd DATA 并将config.yaml复制到__DATA__,然后根据您的情况修改config.yaml。

  4. 从图像中检测角点。<br>

from ILCC import img_corners_est img_corners_est.detect_img_corners()

图像中角点的坐标保存在 DATA/output/img_corners 文件夹中,文件名为 00XX_img_corners.txt。如果在 config.yaml 中将 'output_img_with_dectected_corners' 设置为 True,则标记了角点的图像也会保存在同一文件夹中,文件名为 00XX_detected_corners.jpg,如下图所示。

<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/7cda7998-114a-4447-813d-bc3da1f370e7.jpg" width = "50%" /> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/1e35adb9-79d8-453b-a6b8-858e7f7f7ad9.jpg" width = "24.35%" /> </div>
  1. 从点云中检测角点。<br>
from ILCC import pcd_corners_est pcd_corners_est.detect_pcd_corners()

点云中角点的坐标保存在 output/pcd_seg 文件夹中,文件名为 00XX_pcd_result.pkl。每个点云的分割结果输出到 /DATA/output/pcd_seg/00XX 文件夹中。

  1. 最终外部参数的非线性优化。<br>
from ILCC import LM_opt LM_opt.cal_ext_paras()

外部标定结果在处理结束时输出,并以文件名 YYYYMMDD_HHMMSS_calir_result.txt 保存。如果将 'back_proj_corners' 设置为 True,使用计算得到的参数反投影3D角点的图像会保存到 DATA/output 文件夹中,如下图所示。

<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/da3d9f52-a22f-41e0-80cf-22e69b4ce6f8.jpg" width = "50%" /> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/e1d80be6-6767-467a-88f2-fe5b876cb104.jpg" width = "24.35%" /><br> </div>
  1. 完成上述过程后,可以导入实用模块来可视化各种结果。<br>
from ILCC import utility utility.vis_back_proj(ind=1, img_style="orig", pcd_style="dis", hide_occlussion_by_marker=False) utility.vis_back_proj(ind=1, img_style="orig", pcd_style="dis", hide_occlussion_by_marker=True) utility.vis_back_proj(ind=1, img_style="edge", pcd_style="intens", hide_occlussion_by_marker=True)

使用计算得到的外部参数反投影点云的图像(见下图)将会显示,按"s"键保存。img_style 可以是 "edge"(边缘提取)或 "orig"(原始图像),pcd_style 可以是 "dis"(按距离着色)或 "intens"(按强度着色)。

<div style="text-align: center"> <p align="center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/fd022de8-47d2-4fc8-9b54-0e83edbb7471.jpg" width = "80%" /><br> <em>将点投影到原始图像上,按距离着色。棋盘格遮挡的部分未隐藏。</em> <br> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/fc215d7e-f3c5-4606-8dd1-ea5a57d33517.jpg" width = "80%" /><br> <em>棋盘格遮挡的部分已隐藏。通过将参数 hide_occlussion_by_marker 设置为 True 来隐藏棋盘格遮挡的部分。</em> <br> 对比上面两张图像中棋盘格的上部。 </em> <br> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/ea8a74ec-2997-4439-9eb9-619217a19f9d.jpg" width = "80%" /><br> <em>将点投影到边缘图像上,按强度着色。棋盘格遮挡的点已隐藏。</em> </p> </div> <div style="text-align: center"> <p align="center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/cbc5b968-8cbf-4e82-a79a-a2bfd9086801.png" width = "20%" /> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/84575d60-bcb9-4d6a-90f7-3e26d6539938.png" width = "20%" /> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/f01677cb-bb0d-4187-8f72-c1546e7f4808.png" width = "20%" /> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/7c8de693-4479-4ffd-99dd-b8b71cec6949.png" width = "20%" /> <br> <em>透视图像的结果。从左到右:[颜色:距离,原始图像],[颜色:距离,原始图像,隐藏遮挡],[颜色:强度,边缘图像],[颜色:强度,边缘图像,隐藏遮挡]。</em> </p> </div>
  1. 对于3D可视化,需要 [VTK](https:// clhub.com/Kitware/VTK) >=7.0。以下是使用示例。

示例

样本数据

全景图像的样本数据和检测到的角点处理结果可以从这里(181M)下载,透视图像的数据可以从这里(29M)下载。<br> 这些数据是使用棋盘格文件采集的,该文件包含6*8个图案,如果按A0尺寸打印,每个格子的长度为7.5厘米。

处理过程

  • 对于全景相机
wget https://www.dropbox.com/s/m0ogerftqav0fyx/ILCC_sample_data_and_result.zip unzip ILCC_sample_data_and_result.zip cd ILCC_sample_data_and_result

config.yaml 复制到 ILCC_sample_data_and_result 文件夹。

  • 对于透视相机
wget https://www.dropbox.com/s/et0o4k2sp485nz1/ILCC_sample_perspective_data.zip unzip ILCC_sample_perspective_data.zip cd ILCC_sample_perspective_data

config.yaml 复制到 ILCC_sample_data_and_result 文件夹。<br/> 通过修改 config.yaml,将 camera_type 设置为 'perpsective',并将内部参数输入到 instrinsic_para 中。

可视化(需要 VTK >=7.0)

  • 从 .csv 文件可视化点云
from ILCC import utility utility.vis_csv_pcd(ind=1)
<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/1e82f48e-b39d-43d7-b6f6-49b9ae84ad28.png" width = "50%" /> </div>
  • 可视化分割结果
from ILCC import utility utility.vis_segments(ind=1)
<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/962226ef-e75e-4833-8804-4b9e4df6fe71.png" width = "50%" /> </div>
  • 可视化检测到的棋盘格点云分割
from ILCC import utility utility.vis_segments_only_chessboard_color(ind=1)
<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/08ba4556-85a4-45f0-8df8-6060c2614600.png" width = "50%" /> </div>
  • 可视化检测到的棋盘格点云分割和估计的棋盘格模型
from ILCC import utility utility.vis_ested_pcd_corners(ind=1)
<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/51cc5a20-bbbb-4756-9f05-62e1d3a34991.png" width = "50%" /> </div>
  • 可视化所有检测到的棋盘格
import utility import numpy as np utility.vis_all_markers(utility.vis_all_markers(np.arange(1, 21).tolist()))
<div style="text-align: center"> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/7551fcba-20e9-41f3-ae98-ccb77a560008.png" width = "60%" /> <img src="https://yellow-cdn.veclightyear.com/0a4dffa0/427fa45b-f24c-408c-8054-88c8d0bc6a08.png" width = "65%" /> </div>

故障排除

  1. 棋盘格没有被正确分割。
  • 确保 csv 文件中的所有点都按时间顺序排列。
  • 检查 config.yaml 中的 LiDAR_typelaser_beams_num 是否与您的设置相同。
  • 如果棋盘格过度分割,尝试增加 config.yaml 中的 jdc_thre_ratioagglomerative_cluster_th_ratio。如果棋盘格分割不足,则减小这些值。
  1. 通过使用 utility.vis_segments 可视化分割结果时,棋盘格似乎被正确分割,但"未找到标记"或找到了错误的分割。
  • 检查 config.yaml 中的 pattern_sizegrid_length 是否设置正确。
  • 检查棋盘格的近似距离是否小于 config.yaml 中的 marker_range_limit
  • 如果棋盘格点云在法向量方向上非常嘈杂,尝试增加 config.yaml 中的 chessboard_detect_planar_PCA_ratio 值。
  • 如果棋盘格距离很远,尝试减小 config.yaml 中的 least_marker_points_num 值。
  1. 棋盘格点云的角点没有被正确检测。
  • 如果您遇到类似 Issue #10 中的可视化结果,请检查 config.yaml 中的 intensity_col_in 值是否与 csv 文件中强度列的索引相同。

如有进一步问题,请在 Issues 中讨论。

测试条件

编号激光雷达型号相机型号棋盘格尺寸格子长度[cm]距离范围[m]数据来源作者
1Velodyne <br> HDL-32eLadybug3 (全景)8*67.51.2 ~ 2.6链接mfxox
2Velodyne <br> HDL-32eLadybug3 的一个单目相机8*67.51.2 ~ 2.6链接mfxox

贡献

如果您能分享使用不同尺寸或图案的棋盘格或其他类型激光雷达传感器收集的数据,我们将非常感激。我们会在测试条件列表中致谢您的贡献。

如果您有任何问题,请在 Issues 中讨论或直接联系

待办事项

  1. 删除棋盘格尺寸和板尺寸一致性约束的限制。使角点可以通过 OpenCV 检测。
  2. 集成到 ROS
  3. <del>为透视相机模型添加优化</del>(20180416)
  4. <del>为 HDL-64 和 VLP-16-PACK 添加参数</del>(20170614)

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

热门AI工具AI办公办公工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

模型训练热门AI工具内容创作智能问答AI开发讯飞星火大模型多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

热门AI工具生产力协作转型TraeAI IDE
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

AI助手热门AI工具AI创作AI辅助写作讯飞绘文内容运营个性化文章多平台分发
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多