相机标定与3D重建——交互式相机标定应用程序 OpenCV v4.8.0

上一个教程纹理对象的实时姿态估计

原作者Vladislav Sovrasov
兼容性OpenCV >= 3.1

根据经典标定技术,用户必须先收集所有数据,然后运行 cv::calibrateCamera 函数获取摄像机参数。如果平均重投影误差很大,或者估计的参数似乎有误,则需要重复选择或收集数据并启动 cv::calibrateCamera 的过程。

交互式标定过程的前提是,在每一个新的数据部分之后,用户都可以看到结果和误差估计,还可以删除上一个数据部分,最后,当校准数据集足够大时,开始自动数据选择过程。

主要应用功能

样本应用程序将

  • 确定畸变矩阵和每个元素的置信区间
  • 确定摄像机矩阵和每个元素的置信区间
  • 从摄像机或视频文件中获取输入
  • 从 XML 文件读取配置
  • 将结果保存到 XML 文件中
  • 计算重新投影误差
  • 剔除锐角上的图案视图,防止出现条件不佳的雅各比方块
  • 自动切换标定标志(根据需要固定长宽比和失真矩阵元素)
  • 使用多个标准自动检测标定何时完成
  • 自动捕捉静态图案(用户无需按任何键来捕捉帧,只需一秒钟不移动图案即可)

支持的图案:

  • 黑白棋盘
  • 不对称圆形图案
  • 双不对称圆图案
  • chAruco(带 Aruco 标记的棋盘)
  • 对称圆图案

参数说明

应用程序有两组参数:主参数(通过命令行传递)和预置参数(通过 XML 文件传递)。

主要参数:

所有参数都通过命令行传递给应用程序。

-[参数]=[默认值]:说明

  • -v=[文件名]:从文件名获取视频,默认输入 - id=0 的摄像机
  • -ci=[0]:从指定 id 的摄像机获取视频
  • -flip=[false]:输入帧的垂直翻转
  • -t=[circles]: 校准模式(圆形、棋盘式、dualCircles、chAruco、symcircles)
  • -sz=[16.3]:校准板上圆形或方形最近两个中心点之间的距离
  • -dst=[295]:dualCircles 图案白色部分和黑色部分之间的距离
  • -w=[width]:图案宽度(以角或圆为单位)
  • -h=[height]:图案高度(以角或圆为单位)
  • -of=[camParams.xml]:输出文件名
  • -ft=[true]:自动调整标定标志
  • -vis=[grid]:捕获的电路板可视化(网格、窗口)
  • -d=[0.8]: 捕获之间的延迟(秒
  • -pf=[defaultConfig.xml]:高级应用程序参数文件
  • -force_reopen=[false](强制重新打开): 出现错误时强制重新打开摄像机。这对连接不稳定的 IP 摄像机很有帮助。
  • -save_frames=[false](保存帧): 保存有助于最终标定的帧
  • -zoom=[1]: 应用于预览图像的缩放系数

高级参数:

默认情况下,高级参数值存储在 defaultConfig.xml 中

<?xml version="1.0"?>
<opencv_storage>
<charuco_dict>0</charuco_dict>
<charuco_square_length>200</charuco_square_length>
<charuco_marker_size>100</charuco_marker_size>
<calibration_step>1</calibration_step>
<max_frames_num>30</max_frames_num>
<min_frames_num>10</min_frames_num>
<solver_eps>1e-7</solver_eps>
<solver_max_iters>30</solver_max_iters>
<fast_solver>0</fast_solver>
<frame_filter_conv_param>0.1</frame_filter_conv_param>
<camera_resolution>1280 720</camera_resolution>
</opencv_storage>
  • charuco_dict:特殊字典的名称,用于生成 chAruco 模式
  • charuco_square_length:chAruco 板上正方形的大小(像素)
  • charuco_marker_size:电路板上阿鲁科标记的大小(像素)
  • calibration_stepcv::calibrateCamera(校准摄像机)的启动间隔(以帧为单位
  • max_frames_num:如果用于校准的帧数大于此值,则帧过滤器开始工作。过滤后,校准数据集的大小等于 max_frames_num
  • min_frames_num:如果帧数大于此值,则开启自动标记调整、不失真视图和质量评估功能。
  • solver_epscv::calibrateCamera 中 Levenberg-Marquardt 求解器的精度
  • solver_max_iters:求解器的迭代次数限制
  • fast_solver:如果此值不为零,且发现 Lapack,则在求解器中使用 QR 分解代替 SVD。QR 分解比 SVD 更快,但可能不够精确
  • frame_filter_conv_param:用于双轴图像滤波器线性卷积的参数
  • camera_resolution:用于校准的摄像机分辨率

注: charuc_dict、charuc_square_length 和 charuco_marker_size 用于 chAruco 图案生成(详情请参见 Aruco 模块说明:Aruco 教程

默认的 chAruco 图案:

在这里插入图片描述

双圆图案

要制作这种图案,您需要标准 OpenCV 圆形图案和二进制反转图案。当一个图案中所有圆的水平线都是另一个图案中类似线的延续时,将两个图案按顺序放在一个平面上。测量图案之间的距离,如下图所示,将其作为 dst 命令行参数传递。同时测量最近圆心之间的距离,并将此值作为 sz 命令行参数传递。

在这里插入图片描述

该图案对制作和测量质量非常敏感。

数据过滤

当校准数据集的大小大于 max_frames_num 时,数据过滤器开始工作。它会尝试删除数据集中的 "坏 "帧。过滤器删除 loss_function 取最大值的帧。

l o s s _ f u n c t i o n ( i ) = α R M S ( i ) + ( 1 − α ) r e d u c e d G r i d Q u a l i t y ( i ) loss\_function(i)=\alpha RMS(i)+(1-\alpha)reducedGridQuality(i) loss_function(i)=αRMS(i)+(1α)reducedGridQuality(i)
RMS 是针对第 i 帧计算的平均重投影误差,reducedGridQuality 是不包含第 i 帧的场景覆盖质量评估。α 相当于 frame_filter_conv_param

标定过程

只需运行应用程序即可开始标定。将图案置于摄像机前方,并以某种姿势固定图案。然后等待捕捉(将显示类似 "捕捉到帧 #i "的信息)。当前焦距和重投影误差将显示在主屏幕上。将图案移动到下一个位置并重复该步骤。尽量均匀地覆盖图像平面,不要在图像平面的锐角处显示图案。

在这里插入图片描述

如果标定似乎成功(置信区间和平均重投影误差较小、帧覆盖质量和图案视图数量足够大),应用程序将显示如下屏幕所示的信息。

在这里插入图片描述

热键

  • Esc - 退出应用程序
  • s - 将当前数据保存到 XML 文件
  • r - 删除最后一帧
  • d - 删除所有帧
  • u - 启用/禁用不失真功能
  • v - 切换可视化模式

结果

结果将显示摄像机参数及其置信区间。

输出 XML 文件示例

<?xml version="1.0"?>
<opencv_storage>
<calibrationDate>"Thu 07 Apr 2016 04:23:03 PM MSK"</calibrationDate>
<framesCount>21</framesCount>
<cameraResolution>
 1280 720</cameraResolution>
<cameraMatrix type_id="opencv-matrix">
 <rows>3</rows>
 <cols>3</cols>
 <dt>d</dt>
 <data>
 1.2519588293098975e+03 0. 6.6684948780852471e+02 0.
 1.2519588293098975e+03 3.6298123112613683e+02 0. 0. 1.</data></cameraMatrix>
<cameraMatrix_std_dev type_id="opencv-matrix">
 <rows>4</rows>
 <cols>1</cols>
 <dt>d</dt>
 <data>
 0. 1.2887048808572649e+01 2.8536856683866230e+00
 2.8341737483430314e+00</data></cameraMatrix_std_dev>
<dist_coeffs type_id="opencv-matrix">
 <rows>1</rows>
 <cols>5</cols>
 <dt>d</dt>
 <data>
 1.3569117181595716e-01 -8.2513063822554633e-01 0. 0.
 1.6412101575010554e+00</data></dist_coeffs>
<dist_coeffs_std_dev type_id="opencv-matrix">
 <rows>5</rows>
 <cols>1</cols>
 <dt>d</dt>
 <data>
 1.5570675523402111e-02 8.7229075437543435e-02 0. 0.
 1.8382427901856876e-01</data></dist_coeffs_std_dev>
<avg_reprojection_error>4.2691743074130178e-01</avg_reprojection_error>
</opencv_storage>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值