资讯动态

SensorsCalibration 之 LiDAR 与相机联合标定:手动微调与线特征 / Segment Anything 自动标定全指南

发布时间:2026/10/15 21:02:54 来源:尧图企业网站定制
自动驾驶计算机视觉【免费下载链接】SensorsCalibrationOpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving项目地址https://gitcode.com/gh_mirrors/se/SensorsCalibration点击查看免费下载导读本文围绕 OpenCalibSensorsCalibration多传感器标定工具箱中的lidar2camera模块展开系统讲解 LiDAR 与相机外参标定的两条技术路线基于 Pangolin 交互面板的手动标定以及基于线特征对齐CRLF 方法和 Segment Anything 分割掩码的自动标定。读完本文你将掌握两种工具的依赖环境、编译方式、输入数据格式、交互操作、标定结果保存格式并从源码层面理解点云投影渲染、特征提取与优化代价函数的工作原理。一、模块定位lidar2camera在整个工具箱中的角色lidar2camera/目录下同时提供三套方案覆盖从人工精调到全自动的不同标定场景子目录方案适用场景manual_calib/基于 Pangolin 的手动标定面板需要人工判定点云与图像是否对齐可同时微调内外参auto_calib/基于线特征的自动标定CRLF道路场景依赖车道线、灯杆等直线特征的语义分割 maskauto_calib_v2.0/基于 Segment Anything 的 CalibAnything通用场景只需一张图、一帧点云和一个初始外参三者共享同一套 LiDAR→Camera 投影数学基础但自动化程度和特征来源不同。以下按 README 的脉络逐一展开。二、依赖环境与编译原 README 明确列出了 PrerequisitesCMakeOpenCV 2.4手动标定模块manual_calib的 CMakeLists 中还依赖 Pangolin 0.6、PCL 1.9.1、Boost、jsoncpp见 manual_calib/CMakeLists.txtEigen 3PCL 1.9Pangolin编译方式为在各子目录内分别执行编译产物输出到各目录下的bin/与lib/由 CMake 配置指定mkdir -p build cd build cmake .. make以手动标定模块为例其 CMakeLists.txt 会生成bin/run_lidar2camera可执行文件并将CMAKE_RUNTIME_OUTPUT_DIRECTORY指向bin/、CMAKE_ARCHIVE_OUTPUT_DIRECTORY指向lib/这正是 README 中可执行文件位于 bin 文件夹下的由来。注意README 给出的 OpenCV 版本为 2.4属于早期依赖声明自动标定模块的 conda 环境lidar2camera/auto_calib/tool/lidar2camera.yaml则锁定了 Python 3.6、TensorFlow 1.14 GPU 版、OpenCV 4.0 等版本实际使用时请以仓库内对应模块的依赖声明为准。三、手动标定工具manual_calib3.1 四个输入文件手动标定程序通过命令行接收 4 个参数Usage: ./run_lidar2camera image_path pcd_path intrinsic_json extrinsic_json参数含义image_path相机传感器采集的图像文件pcd_pathLiDAR 传感器采集的 PCD 点云文件intrinsic_json相机内参 JSON 文件extrinsic_json传感器间外参初始值 JSON 文件JSON 的解析逻辑可在源码中直接确认LoadIntrinsicintrinsic_param.hpp从root[id][param][cam_K][data]读取 3×3 内参矩阵、从root[id][param][cam_dist][data]按cols字段读取畸变系数LoadExtrinsicextrinsic_param.hpp从root[id][param][sensor_calib][data]读取 4×4 外参矩阵。仓库自带示例数据 center_camera-intrinsic.json 与 top_center_lidar-to-center_camera-extrinsic.json 即采用该结构其中内参 JSON 包含img_dist_w/img_dist_h、cam_K、cam_dist三个字段外参 JSON 还额外包含time_lag字段。3.2 运行示例仓库内置了一套测试数据data/0.png、data/0.pcd及内外参 JSON见 manual_calib/data可直接运行cd ~./manual_calib/ ./bin/run_lidar2camera data/0.png data/0.pcd data/center_camera-intrinsic.json data/top_center_lidar-to-center_camera-extrinsic.json程序入口run_lidar2camera.cpp会先校验argc 5随后读取图像、加载 PCD 点云、解析内外参 JSON并通过Projector类将点云投影到图像上最后创建 Pangolin 窗口进入交互循环。3.3 标定面板与交互操作标定窗口由左侧控制面板PangolinCreatePanel生成源码见 run_lidar2camera.cpp和右侧点云投影图像两部分组成。用户通过点击面板按钮或键盘按键调整外参观察点云与图像是否对齐对齐后点击 Save 保存结果。外参调整对应的键盘按键如下面板按钮与键盘一一对应外参键盘输入外参键盘输入x degreeq-x degreeay degreew-y degreesz degreee-z degreedx transr-x transfy transt-y transgz transy-z transh内参焦距调整按键内参键盘输入内参键盘输入 fyi- fyk fxu- fxj从源码看按键通过ManualCalibration函数run_lidar2camera.cpp映射到 12 个预生成的增量变换矩阵modification_list_每次按下按键即执行calibration_matrix_ calibration_matrix_ * modification_list_[i]而u/j/i/k四键则直接对内参矩阵的fx/fy元素做乘除缩放。3.4 面板辅助功能与步长参数README 中逐一说明了面板上的辅助功能Intensity ColorLiDAR 强度intensity反映激光束的回波强度与物体反射率相关。开启后投影点从按距离着色切换为按强度着色便于检查地面车道线等低反射率目标的对齐情况。源码中Projector::ProjectToRawMat通过fakeColor()将归一化后的距离/强度映射为彩虹色projector_lidar.hpp。Overlap Filter消除深度 0.4 m 以内的重叠 LiDAR 点。源码中OVERLAP_DEPTH_TH 0.4配合 4 像素的搜索窗口OVERLAP_FILTER_WINDOWprojector_lidar.hpp在渲染时仅保留每个局部窗口内深度最靠前的点减少遮挡造成的视觉噪声。deg step / t step / fxfy scale三个按钮分别调节每次点击或按键对应的调整步长。源码中面板控件默认值即degreeStep 0.3度、tStep 6cm程序内转换为 0.06 m、fxfyScale 1.005run_lidar2camera.cpp拖动后通过CalibrationScaleChange()重新生成 12 个增量矩阵。point size调节投影图像中 LiDAR 点的大小默认 3范围 1–5。Reset将外参与内参恢复为加载时的初始值源码中calibration_matrix_ orign_calibration_matrix_。Save Image保存标定结果。值得一提的实现细节是投影渲染前点云会经过 ROI 过滤默认范围为x ∈ [-4, 3.5]、y ∈ [5, 10]、z ∈ [-2.1, 3]见 projector_lidar.hpp 的ROI数组投影时先利用cv::initUndistortRectifyMapcv::remap对图像做去畸变再执行K * (R * P T)将三维点投影到像素平面projector_lidar.hpp。默认按距离着色的投影模式会将点按距离从远到近排序后绘制保证近处点覆盖远处点。3.5 保存结果格式点击保存后结果标定图像、外参与内参矩阵默认输出到运行目录~./manual_calib/。源码中saveResult()run_lidar2camera.cpp会写出calibration_frame_id.txt与calibimg_frame_id.jpg两个文件。README 给出的输出样例格式如下Extrinsic: R: 0.0121008 -0.999863 -0.0112902 0.0133341 0.0114512 -0.999846 0.999838 0.0119484 0.0134707 t: 0.0134153 -0.352602 -0.575013 Intrinsic: 2120.29 0 949.828 0 2071.72 576.237 0 0 1 ************* json format ************* Extrinsic: [0.0121008,-0.999863,-0.0112902,0.0134153],[0.0133341,0.0114512,-0.999846,-0.352602],[0.999838,0.0119484,0.0134707,-0.575013],[0,0,0,1] Intrinsic: [2120.29,0,949.828],[0,2071.72,576.237],[0,0,1] Distortion: [-0.108145,0.138668,-0.00379757,-0.00484127]该格式同时给出矩阵形式与可直接回填到 JSON 的数组形式便于后续直接作为初始值喂给自动标定流程。四、自动标定工具 v1.0基于线特征对齐CRLF4.1 方法原理这套自动标定工具面向道路场景核心思想是从图像和 LiDAR 点云中分别提取直线型静态物体车道线、路灯、电线杆等的线特征通过对齐两类特征完成外参标定。方法源自论文CRLF: Automatic Calibration and Refinement based on Line Feature for LiDAR and Camera in Road ScenesTao Ma、Zhizheng Liu、Guohang Yan、Yikang Li2021。整体流程在入口程序 run_lidar2camera.cpp 中清晰可见加载内外参 JSONCameraFeature::undistortion对图像做去畸变camera_feature.cppLidarFeature::extract_feature从点云中提取车道线与电杆特征点Optimizer::Calibrate以初始外参为起点随机搜索最优外参并输出feature_projection.png结果图。4.2 图像特征mask的生成注意要获得图中所示的图像线特征 mask需要先按照 lidar2camera/auto_calib/tool/README.md 的说明提取图像特征。该工具使用预训练的语义分割模型DeepLabV3Cityscapes 数据集权重提取车道线与柱子关键步骤如下# 1. 创建 conda 环境依赖清单见 lidar2camera.yaml conda env create -f lidar2camera.yaml # 2. 下载预训练语义分割模型权重deeplabv3_cityscapes_train_2018_02_06.tar.gz # 3. 融合原图与分割 mask python merge_mask.py calib.png mask.pngtool/python/目录下还提供了run_model.py、extract_driving_lanes.py、extract_cotour.py、Dense_CRF.py、crop.py、rectangle_mask.py等辅助脚本用于模型推理、车道线提取、轮廓提取、密集 CRF 后处理等环节。仓库中的示例 mask 效果如下4.3 五个输入文件与运行示例与手动标定不同自动标定 v1.0 的输入为五个文件其中第一个参数由原始图像换成了分割后的 maskUsage: ./run_lidar2camera mask_path pcd_path intrinsic_json extrinsic_json参数含义mask_path由预训练分割模型提取的特征图像pcd_pathLiDAR 传感器采集的 PCD 点云文件intrinsic_json相机内参 JSON 文件extrinsic_json传感器间外参初始值 JSON 文件README 以Five Input files为题实际命令行参数为四项第五项即分割模型本身此处保持原文表述。运行仓库自带测试样本cd ~./auto_calib/ ./bin/run_lidar2camera data/mask.jpg data/calib.pcd data/center_camera-intrinsic.json data/top_center_lidar-to-center_camera-extrinsic.json标定完成后会输出投影结果图绿色圆点表示经过优化后的外参将 LiDAR 线特征点投影到图像上的位置可与 mask 中的车道线/电杆特征对照检查对齐质量4.4 源码级解析LiDAR 特征提取LidarFeature::extract_featurelidar_feature.cpp的处理流程分为三步预过滤利用当前外参与内参仅保留能投影到图像范围内、且落在特征提取 ROIx ∈ [0, 100]、y ∈ [-20, 20]见 lidar_feature.hpp内的点地面分割用 PCLSACSegmentation RANSAC 拟合平面模型距离阈值 0.2 m、最大迭代 3000 次将地面点与其他点分离lidar_feature.cpp目标提取地面点中强度大于 80intensity_threshold且横向范围y ∈ [-10, 10]的点被判定为车道线非地面点按 0.7 m × 0.7 m 网格统计高度网格内最大高度超过 4 m 的列被判定为电杆lidar_feature.cpp。提取出的cloud_lane cloud_pole合并为参与配准的特征点云。4.5 源码级解析优化器与代价函数Optimizer::Calibrateoptimizer.cpp以 6 维扰动向量roll、pitch、yaw、tx、ty、tz为搜索变量代价函数MaskRegistrationLossoptimizer.cpp计算逻辑为对当前外参施加扰动deltaT将特征点云投影到图像统计投影位置处 mask 像素灰度值大于 55的点的数量返回匹配点数量 / 特征点总数作为得分。优化采用粗到细的随机搜索策略先以较大扰动幅度0.05 度、1 m 级别搜索随后逐步缩小到 0.005 度、0.5 m再到 0.001 度、0.05 m 的精细搜索每轮 10000 或 1000 次采样并在连续两轮无改进时提前收敛optimizer.cpp。优化结束后通过SaveProjectResult输出feature_projection.png。五、自动标定工具 v2.0CalibAnythingSegment Anything 方案完整说明见 lidar2camera/auto_calib_v2.0/README.md。该方案将特征来源从道路线语义分割升级为通用分割大模型 Segment Anything仅需一张图像、一帧点云、一个外参初始值即可完成标定方法对应论文Calib-Anything: Zero-training LiDAR-Camera Extrinsic Calibration Method Using Segment Anything。5.1 环境与编译推荐使用仓库提供的 Docker 镜像docker pull xiaokyan/opencalib:v1随后编译本仓库即包含auto_calib_v2.0全部源码mkdir -p build cd build cmake .. make5.2 测试示例与初始误差注入程序只接收一个参数数据目录./run_lidar2camera ./data/st/1 ./run_lidar2camera ./data/kitti/1仓库提供了 st自有场景与 kittiKITTI 数据集两组示例数据见 auto_calib_v2.0/data。每组数据都带有外参参考值可通过修改data/initial_error.txt给参考外参注入初始误差以测试算法的精度。文件格式为roll pitch yaw(degree) x y z(m)仓库默认值为3 3 3 0 0 0即绕三个轴各 3° 的旋转误差。程序在构造函数中读取该文件并用Util::GetDeltaT将误差叠加到初始外参上calibration.cpp。如果不希望添加误差将该文件内容全部改为 0 即可。5.3 自定义数据格式使用自己的数据时同样只需传入数据目录./run_lidar2camera data_folder目录内需包含以下文件文件说明图像文件.png/.jpg/.jpeg格式LiDAR 文件.pcd需要包含反射率reflectivity/intensity字段标定文件.txt包含相机内参 K、畸变系数 D 与粗略外参 T格式如下masks/Segment Anything 生成的掩码目录标定文件格式示例来自 auto_calib_v2.0/README.mdK: 2152.8 0 971.3 0 2155.5 605.9 0 0 1 D: -0.1192 0.162 0.00073985 0.0014 T: 0.0188623 -0.999822 -9.36529e-05 -0.0323222 0.0288601 0.000638227 -0.999583 -0.396685 0.999405 0.0188516 0.028867 -0.0869361其中K为 3×3 内参D为畸变系数T为 3×4 的旋转 平移矩阵按行拼接的 12 个数值。程序入口run_lidar2camera.cpp会自动扫描目录按扩展名识别图像、点云与标定文件。5.4 生成 Masks掩码由 Segment Anything 生成环境要求python3.8, pytorch1.7, torchvision0.8。先安装 Segment Anything 并下载模型 checkpoint如vit_l然后运行官方批量推理脚本amg.pypip install opencv-python pycocotools matplotlib onnxruntime onnx python scripts/amg.py --checkpoint path/to/checkpoint --model-type model_type --input image_or_folder --output path/to/output ## example推荐参数 python scripts/amg.py --checkpoint sam_vit_l_0b3195.pth --model-type vit_l --input 1.png --output ./output/ --stability-score-thresh 0.9 --box-nms-thresh 0.4 --stability-score-offset 0.9生成掩码属于标定前的离线准备步骤须在运行标定程序之前完成。5.5 输出文件运行结束后Calibrator会输出以下结果文件初始外参投影图init_proj.png、init_proj_seg.png注入误差后的投影图error_proj.png、error_proj_seg.png优化精修后的投影图refined_proj.png、refined_proj_seg.png精修后的外参extrinsic.txt其中_seg版本为叠加分割掩码的渲染图便于直观对比对齐前后差异。extrinsic.txt同时保存 4×4 矩阵与 roll/pitch/yaw/x/y/z 分量run_lidar2camera.cpp。从源码结构看v2.0 的核心类Calibratorcalibration.hpp将点云按法向量聚类分割Segment_pc以投影点是否落在掩码内作为打分依据依次执行暴力搜索BruteForceSearch与随机搜索RandomSearch两个阶段完成外参优化权重由w_n / w_i / w_s控制分别对应法向量、强度、分割信息。六、论文引用两套自动标定方案分别基于以下研究使用时可引用misc{2103.04558, Author {Tao Ma and Zhizheng Liu and Guohang Yan and Yikang Li}, Title {CRLF: Automatic Calibration and Refinement based on Line Feature for LiDAR and Camera in Road Scenes}, Year {2021}, Eprint {arXiv:2103.04558}, } misc{luo2023calibanything, title{Calib-Anything: Zero-training LiDAR-Camera Extrinsic Calibration Method Using Segment Anything}, author{Zhaotong Luo and Guohang Yan and Yikang Li}, year{2023}, eprint{2306.02656}, archivePrefix{arXiv}, primaryClass{cs.CV} }七、总结与选型建议三种工具覆盖了 LiDAR 与相机标定的完整使用链路手动标定manual_calib交互直观、可同时修内外参适合作为兜底方案或自动化结果的校验手段线特征自动标定 v1.0auto_calib面向结构化道路场景成本低、可重复性好但依赖车道线/灯杆特征与语义分割 maskCalibAnything v2.0auto_calib_v2.0借助 Segment Anything 摆脱了对特定道路结构的依赖通用性最强。实际工程中建议先用自动标定得到初始解再用手动面板做精调收尾并通过保存的 JSON 格式结果完成两个流程之间的参数交接。赞分享自动驾驶计算机视觉【免费下载链接】SensorsCalibrationOpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving项目地址https://gitcode.com/gh_mirrors/se/SensorsCalibration点击查看免费下载相关推荐SensorsCalibrationOpenCalib多传感器标定工具箱面向自动驾驶的 IMU / LiDAR / Camera / Radar 联合标定实战指南SensorsCalibrationOpenCalib多传感器标定工具箱面向自动驾驶的 IMU / LiDAR / Camera / Radar 联合标定自动驾驶计算机视觉推荐开源项目velo2cam_calibration - 实现LiDAR与相机自动标定推荐开源项目velo2cam_calibration 实现LiDAR与相机自动标定 项目介绍 velo2cam_calibration 是一个基于ROSRoSensorsCalibration环绕相机标定鱼眼相机与普通相机标定差异详解SensorsCalibration环绕相机标定鱼眼相机与普通相机标定差异详解 在自动驾驶和智能交通系统中环绕相机标定是确保车辆环境感知准确性的关键技术。S自动驾驶计算机视觉上一篇9大网盘直链解析工具实测LinkSwift让真实下载地址秒到手链接还不用过第三方服务器下一篇python-docx 快速上手用 Python 创建与修改 Word 文档的完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑