SensorsCalibration 环绕相机标定指南:四套 AVM 工具(无标定板/标定板/手动/鱼眼)的原理与实战
发布时间:2026/10/16 7:04:17 锦皓数字建站
的原理与实战`)
自动驾驶计算机视觉【免费下载链接】SensorsCalibrationOpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving项目地址https://gitcode.com/gh_mirrors/se/SensorsCalibration点击查看免费下载导读本文围绕开源多传感器标定工具箱 SensorsCalibration 中的 surround-camera 模块系统讲解自动驾驶环视Surround View / AVM相机外参标定的四套工具面向普通环视相机的 target-less 自动标定auto_calib、面向环视鱼眼相机的 target-less 自动标定auto_calib_fisheye、基于标定板的产线级自动标定auto_calib_target以及支持 pinhole / Ocam / fisheye 三种模型的交互式手动标定manual_calib。读完本文你将掌握每套工具的适用场景、编译运行方式、命令行参数、相机模型选择依据以及从 BEV 投影、纹理提取到随机搜索优化coarse-to-fine的完整算法链路并能在真实部署中根据传感器类型普通相机或鱼眼与场景道路 or 产线正确选择工具。一、模块总览一套 AVM 工具箱四种标定路线surround-camera/README.md 将本模块定位为 a calibration toolbox for surround view cameras or surround view fisheye cameras即同时覆盖普通环视相机与环视鱼眼相机。四套工具的选型关系可用下表概括来源于该 README 的工具矩阵calibration paramcalibration typecalibration methodmannual calibrationauto calibrationusage documentationsurround_cameras (fisheye)extrinsictarget-less✔manual_calibsurround_cameras (fisheye)extrinsictarget-less✔auto_calib_fisheyesurround_camerasextrinsictarget-less✔auto_calibsurround_camerasextrinsictarget✔auto_calib_target几点关键结论四套工具全部解决**外参extrinsic**标定问题即各环视相机相对车体或 BEV 地面坐标系的旋转和平移。前三套标定路线均为target-less无标定板依靠场景自然纹理完成自动优化只有 auto_calib_target 属于target标定板路线且 README 明确指出它可用于环视相机生产线的标定This tool can be used for production line calibration of surround view cameras。手动标定manual_calib同时支持普通环视相机与鱼眼环视相机是唯一同时覆盖两种传感器的手动方案。从仓库目录结构看四个子模块的实现高度同构auto_calib 与 auto_calib_fisheye 均包含include/{optimizer.h, texture_extractor.h, transform_util.h}与src/{calibration.cpp, optimizer.cpp, texture_extractor.cpp}二者的核心区别在于主程序入口main中选择的camera_model与data_setmanual_calib 依赖 include/extrinsic_param.hpp 与 include/intrinsic_param.hpp 从 JSON 加载内参/外参auto_calib_target 则包含独立的 src/calibration.cppsolvePnP 求解外参与 src/stitching.cpp环视拼接验证。二、编译与运行统一构建流程与可执行文件约定四套工具都采用标准 CMake 构建流程各子模块 README 中给出的编译步骤完全一致mkdir -p build cd build cmake .. make构建产物统一输出到模块根目录下的bin/目录由各 CMakeLists.txt 的set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)决定见 auto_calib/CMakeLists.txt。各工具的可执行文件与运行方式如下工具可执行文件运行方式在模块根目录执行auto_calibrun_AVM_Calibrationcd ~./auto_calib/后./bin/run_AVM_Calibrationauto_calib_fisheyerun_AVM_Calibrationcd ~./auto_calib_fisheye/后./bin/run_AVM_Calibrationauto_calib_targetrun_AVM_Calibration/run_stitching./bin/run_AVM_Calibration或./bin/run_stitchingmanual_calibrun_avm见下节命令行参数其中 auto_calib 与 auto_calib_fisheye 的 CMakeLists 均为project(online_Calibration)、add_executable(run_AVM_Calibration src/calibration.cpp)fisheye 版 与 普通版 完全一致因此可执行文件名相同需要放在各自目录下运行。2.1 依赖与构建前提从 CMakeLists 可归纳出构建依赖auto_calib / auto_calib_fisheyeC17-stdc17 -pthread用于多线程随机搜索、Eigen3/usr/include/eigen3、OpenCVfind_package(OpenCV REQUIRED)代码中用到fisheye::distortPoints、remap、findContours等接口。auto_calib_targetC11、Eigen3、OpenCVCMake 默认在/usr/local/opencv-2.4.13/share/OpenCV/下查找 OpenCV 2.4.13NO_DEFAULT_PATH若使用其他版本需自行调整该路径。manual_calibC11、PangolinGUI 显示、Boostfilesystem、system、OpenCV、jsoncpplibjsoncpp.a链接关系见 manual_calib/CMakeLists.txt。2.2 运行示例与输出无标定板自动标定auto_calib / auto_calib_fisheye为无参数交互程序入口 main 直接读取./imgs/下的Front/Left/Back/Right四张图像普通版为 png、鱼眼版为 jpg标定过程中会依次打印左/右/后相机各阶段1st 粗搜、2nd 精调、3rd 微调的 luminosity loss、最优搜索参数roll/pitch/yaw/tx/ty/tz与优化后的外参矩阵最终在模块根目录输出拼接结果图after_all_calib.png并将各阶段对比图写入after_*_calib*.png详见 auto_calib/src/calibration.cpp。auto_calib_target 的run_stitching直接读取imgs/front_125.png等四张图像投影到地面后用addWeighted叠加生成并保存surround_view.pngstitching.cpp。三、无标定板自动标定auto_calib 与 auto_calib_fisheye这两套工具共享同一套算法框架optimizer texture_extractor仅通过 main 中的三个配置项区分// camera_model: 0-fisheye; 1-Ocam; 2-pinhole int camera_model 2; // auto_calib 用 pinhole int camera_model 0; // auto_calib_fisheye 用 fisheye string data_set common; // auto_calib string data_set fisheye; // auto_calib_fisheyecamera_model控制投影时使用的畸变模型见Optimizer::project_on_ground中fisheye::distortPoints/distortPointsOcam/distortPoints三分支data_set则决定内参、畸变、外参初值、BEV 高度与裁剪尺寸等初始化参数见 optimizer.cpp 的initializeK/initializeD/initializePose/initializeKG/initializeHeight/initializetailsize。3.1 算法主链路BEV 投影 → 公共视野纹理提取 → 光度一致性优化整个标定流程以fixed front固定前相机为例可分为四步生成初始 BEV 鸟瞰图利用四台相机初始外参T_CGground→camera、内参K_C、畸变D_C与地面相机内参K_G对地面网格像素逐个反投影、畸变、remap采样得到四张 BEV 图project_on_ground代码见 optimizer.cpp。裁剪公共视野区域Optimizer::tail按sizef/sizel/sizeb/sizer保留前/左/后/右相机各自靠近车身一侧的条带区域其余区域补黑optimizer.cpp使相邻相机之间形成可比较的公共视野。纹理提取extractor对相邻 BEV 对fl/fr/bl/br做二值化Binarization两图同位置均非黑则置 255、膨胀腐蚀与findContours提取最大轮廓再按梯度幅值筛选纹理点并随机下采样 500 个点同时计算曝光补偿系数ncoef两图公共视野平均灰度的比值与各相机灰度gamma校正见 texture_extractor.cpp。光度一致性随机搜索优化以待标定相机外参微扰deltaT将 BEV 纹理点重投影到相邻相机图像上计算灰度差平方和作为 loss用多线程随机采样最小化。标定顺序上前相机固定先标 right再标 left最后标 behindmain 中的调用顺序每次标定完会用最优外参重新生成该相机 BEV 并更新公共视野纹理。3.2 粗到精coarse-to-fine三阶段搜索策略CameraOptimization见 auto_calib/src/calibration.cpp对每个相机依次执行三阶段搜索各阶段参数如下阶段线程数迭代次数roll/pitch/yaw 搜索范围tx/ty/tz 搜索范围1st 粗搜coarse7100000/线程[-3°, 3°] 按 x/y/z 轴拆分区间[-0.01, 0.01] m2nd 精调fine615000/线程[-1°, 1°] 为主[-0.005, 0.005] m 为主3rd 微调fine38000/线程[-0.01°, 0.01°][-0.002, 0.002] m第一阶段的 7 个线程将三维姿态空间每个轴 [-3,3] 度拆分成若干子区间并行搜索例如Calibrate_right(iter_nums, -3, 3, -3, 3, -3, 3, ...)随后用fine_random_search_params在更小邻域继续细化。搜索过程中使用独立 mutex 保护各相机的最优解更新mutexleft/mutexright/mutexbehind并且只有 loss 严格下降才接受新外参random_search_params与fine_random_search_params中的loss_new cur_*_loss判断见 optimizer.cpp。对畸变模型的适配细节优化过程中back_camera_and_compute_loss重投影纹理点时同样按camera_model选择fisheye::distortPoints、distortPointsOcam或简化 pinhole 投影optimizer.cpp。3.3 两种数据集的关键初始化参数对比data_set为 commonauto_calib与 fisheyeauto_calib_fisheye时初始化参数差异如下均取自initialize*系列函数参数commonpinholefisheye相机内参 K示例 Frontfxfy390.425287, cxcy750fx≈422.13, cx≈612.83, cy≈545.06四相机各异畸变 D示例 Front[0,0,0,0][-0.07031853, 0.00387505, -0.00333139, 0.00056406]地面 BEV 内参 K_Gfxfy390.425287, cxcy750fx1/0.15, fy-1/0.15, cxbcols/2, cybrows/2相机高度 h5.1 m四相机1.0 m四相机tail 裁剪尺寸sizefsizelsizer450, sizeb350sizef340, sizelsizer390, sizeb380BEV 尺寸1500×15001000×1000需要说明的是common 数据集的初始外参T_CG中还叠加了人为施加的姿态扰动left/right/behind 的扰动欧拉角与平移见 optimizer.cpp用于模拟真实安装误差并验证优化算法的收敛能力fisheye 数据集则直接使用 ROCES 标定结果作为初值。3.4 曝光一致性处理由于四台相机曝光参数未必一致公共视野两侧灰度可能存在系统性偏差。纹理提取阶段通过exposure_flag开关控制开启时ncoef mean(gray1) / mean(gray2)公共视野平均灰度比优化 loss 计算中将参照侧灰度除以该系数后再做差从而把曝光差异从几何误差中解耦。auto_calib 中 fl/fr 对exposure_flag0、bl/br 对exposure_flag0而 auto_calib_fisheye 全部置 1且对 bl/br 还启用了公共视野边缘过滤edge_flag1按与相机中心的距离剔除贴近 BEV 边缘的弱纹理点。这些开关均为 main 中的可调参数auto_calib_fisheye/src/calibration.cpp。3.5 结果可视化对比auto_calib 与 auto_calib_fisheye 在优化前会先用初始外参生成before_all_calib.png优化结束后用SaveOptResult基于最终外参生成after_all_calib.png。两个版本仓库内均附带示例结果图普通环视相机版本标定前 before_all_calib.png 与标定后 after_all_calib.png鱼眼环视版本标定前 before_all_calib.png 与标定后 after_all_calib.png。注意标定板在无标定板自动标定中仅起到提供纹理信息的作用README 原文 the calibration board here only provides some texture information并不参与几何约束求解。四、基于标定板的产线级自动标定auto_calib_targetauto_calib_target 面向生产场景思路与无标定板路线完全不同它利用已知车体系 3D 点与图像 2D 点的一一对应通过solvePnP直接求解各相机外参。4.1 求解流程已知 3D 点 2D 点 → solvePnPsrc/calibration.cpp 的 main 中InitializeK为四台相机设置相同的针孔内参fxfy390.425287, cxcy750InitializeD将畸变置零5 维向量全 0。Initialize3dPoints定义标定板特征点在车体坐标系下的 3D 坐标例如前相机前方x3.5 m平面上的 12 个点(3.5, ±0.12, ±0.36)等左/后/右相机分别对应y2.0 / x-3.0 / y-2.0平面上的对称点组见 calibration.cpp。Initialize2dPoints给出同一组特征点在四张图像中的像素坐标2D 匹配点calibration.cpp。对每台相机依次调用solvePnP(pts_3d, pts_2d, K, D, rvecs, translation)求解旋转向量与平移再经Rodrigues转为旋转矩阵hconcat拼成 4×4 外参矩阵T_F/T_L/T_B/T_R并打印calibration.cpp。因此要移植到自己的产线核心工作量在于替换上述 3D 点由标定板相对车体的精确安装位置决定与 2D 点标定板角点/特征在图像中的检测结果当前仓库为手工预设样本。4.2 拼接验证工具 run_stitchingsrc/stitching.cpp 提供独立的环视拼接验证程序读取imgs/front_125.png等四张图用初始化函数中的内参/外参投影到 1500×1500 的 BEVdXdY0.005即 5 mm/像素将各相机 BEV 裁剪掉互相遮挡的区域后以 0.5 权重addWeighted叠加生成surround_view.pngstitching.cpp。该工具可快速检验 auto_calib_target 求出的外参是否能让环视画面无缝拼接。仓库内附带四张带标定板图像的 BEV 投影验证结果前 img_GF.png、左 img_GL.png、后 img_GB.png、右 img_GR.png以及最终 surround_view.png。五、交互式手动标定manual_calibmanual_calib 提供基于 Pangolin 的实时可视化手动微调工具支持 pinhole、Ocam全方位相机、fisheye 三种相机模型仓库内附 pinhole_samples 与 ocam_samples 两套示例数据。5.1 命令行参数与运行示例程序要求 5 个参数run_avm.cpp./bin/run_avm image_path intrinsic_path extrinsic_path camera_model其中camera_model取值0表示 OpenCV fisheye 模型1表示 OcamOmnidirectional模型2表示 pinhole 模型。README 给出的三种运行方式# 直接运行使用默认参数 cd ~./manual_calib/ ./bin/run_avm # pinhole 示例数据 ./bin/run_avm pinhole_samples/imgs pinhole_samples/intrinsic pinhole_samples/extrinsic 2 # Ocam 示例数据 ./bin/run_avm ocam_samples/imgs ocam_samples/intrinsic ocam_samples/extrinsic 1注意两套示例数据对应的相机安装高度不同代码中默认bev2ground5.1pinhole 样本当camera_model1时切换为 Ocam 样本的四个高度值Front/Left/Back/Right 分别约 6.078/6.252/6.310/6.281 m见 run_avm.cpp更换数据时务必核对安装高度。5.2 数据格式JSON 内参与外参程序通过 include/intrinsic_param.hpp 的LoadIntrinsic与 include/extrinsic_param.hpp 的LoadExtrinsic读取 JSON。内参文件要求形如 pinhole_samples/intrinsic/Front.json顶层键为sensor-intrinsic其param.cam_K.data为 3×3 矩阵、param.cam_dist.data为畸变系数行向量。外参文件形如 pinhole_samples/extrinsic/Front.json顶层键为sensor-to-target-extrinsicparam.sensor_calib.data为 4×4 变换矩阵此处为 ground/BEV 系到相机系的T_CG。四台相机固定命名为Front/Left/Back/Right.json。5.3 交互操作与参数微调程序启动后以 Pangolin 窗口显示 BEV 投影结果并提供控制面板与键盘两种微调方式键盘微调字符表{q,a,w,s,e,d,r,f,t,g,y,h}分别对应 roll/pitch/yaw/tx/ty/tz 六个自由度的正向与负向调整ManualCalibration见 run_avm.cpp每按一键即对当前相机外参乘以对应的微调增量矩阵。面板微调Pangolin 面板提供步长调节deg step默认 0.3°t step(cm)默认 6 cm对应代码中cali_scale_degree_0.3、cali_scale_trans_0.06、相机选择frame0-3、单相机微调按钮± x/y/z degree、± x/y/z trans、Reset恢复初始外参与 Save Image 按钮。拼接模式stiching开关开启后窗口显示四相机联合环视图保存时会将四台相机结果一次性写入calibration_0.txt~calibration_3.txtJSON 格式 4×4 矩阵见saveResult。每次调整后程序都用当前外参重新执行project_on_ground并刷新画面实现所见即所得的微调体验。完整操作流程可参照仓库 lidar2camera/README.md 中描述的手动标定交互规范。六、核心原理小结与选型建议从源码可以归纳出两套并行的技术路线无标定板自动标定auto_calib / auto_calib_fisheye依赖场景纹理而非标定板适合道路场景快速部署算法本质是基于公共视野光度一致性的外参优化BEV 投影建立地面像素 ↔ 相机像素映射纹理提取圈定可比较区域随机搜索在 6 维外参空间最小化灰度差平方和粗±3° 分区间并行搜索→ 精±1°→ 微调±0.01°三阶段搜索有效扩大收敛域通过camera_model与data_set两个开关即可切换 pinhole/fisheye 与对应初始化参数。标定板路线auto_calib_target 手动微调manual_calibauto_calib_target 用 solvePnP 从 3D-2D 对应直接求解外参流程确定、可重复适合产线manual_calib 适合在自动结果基础上做人工精修或在自动标定不可用的场景兜底两者共用 pinhole/Ocam/fisheye 三种投影模型的选择逻辑保证模型一致性。选择建议普通环视相机优先用 auto_calib鱼眼环视相机用 auto_calib_fisheye注意其内部已内置 fisheye 畸变初值与 1000×1000 BEV 配置产线场景用 auto_calib_target 并自行替换 3D/2D 标定点需要在自动结果上精修或无法自动标定时用 manual_calib 按传感器模型选择对应示例数据作为模板。引用本文内容基于 surround-camera/README.md 及其四个子模块文档整理算法细节与参数均取自对应源码。该模块对应的学术工作为论文Automatic Surround Camera Calibration Method in Road Scene for Self-driving CararXiv:2305.16840若在研究中使用了本项目可按仓库 README 中给出的 BibTeX 条目引用misc{2305.16840, Author {Jixiang Li and Jiahao Pi and Guohang Yan and Yikang Li}, Title {Automatic Surround Camera Calibration Method in Road Scene for Self-driving Car}, Year {2023}, Eprint {arXiv:2305.16840}, }赞分享自动驾驶计算机视觉【免费下载链接】SensorsCalibrationOpenCalib: A Multi-sensor Calibration Toolbox for Autonomous Driving项目地址https://gitcode.com/gh_mirrors/se/SensorsCalibration点击查看免费下载相关推荐免费解锁 Wand 专业版Wand-Enhancer 本地补丁与手机远程面板完整指南免费解锁 Wand 专业版Wand Enhancer 本地补丁与手机远程面板完整指南 免费时长用完的那次弹窗 单机打到存档点打开 Wand 准备调数值弹窗自动驾驶计算机视觉SensorsCalibration环绕相机标定鱼眼相机与普通相机标定差异详解SensorsCalibration环绕相机标定鱼眼相机与普通相机标定差异详解 在自动驾驶和智能交通系统中环绕相机标定是确保车辆环境感知准确性的关键技术。S自动驾驶计算机视觉SensorsCalibration 环绕相机标定板方案 auto_calib_target产线 AVM 外参标定与俯视拼接实战指南SensorsCalibration 环绕相机标定板方案 auto_calib_target产线 AVM 外参标定与俯视拼接实战指南 环绕视图Around自动驾驶计算机视觉上一篇APK-Installer免模拟器免费 3 分钟跑起第一个 APK下一篇3步跑起2D几何光学仿真Ray Optics 从本地部署到自定义模块开发的实操手册创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。