OpenCV  4.10.0
开源计算机视觉库
正在加载...
正在搜索...
无匹配项
交互式相机标定应用程序

上一教程: 纹理物体实时姿态估计
下一教程: USAC:改进 OpenCV 中的随机样本一致性

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

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

交互式标定过程假设,在每个新数据部分之后,用户可以看到结果和误差估计,还可以删除最后的数据部分,最后,当用于标定的数据集足够大时,启动自动数据选择过程。

主要应用程序功能

示例应用程序将

  • 确定畸变矩阵和每个元素的置信区间
  • 确定相机矩阵和每个元素的置信区间
  • 从相机或视频文件获取输入
  • 从 XML 文件读取配置
  • 将结果保存到 XML 文件
  • 计算重投影误差
  • 拒绝模式在锐角上的视图,以防止出现病态雅可比块
  • 自动切换标定标志(如果需要,修复纵横比和畸变矩阵的元素)
  • 使用多个标准自动检测标定是否完成
  • 静态模式的自动捕获(用户无需按任何键来捕获帧,只需将模式静止一秒钟)

支持的模式

  • 黑白棋盘格
  • 非对称圆模式
  • 双非对称圆模式
  • chAruco(带 Aruco 标记的棋盘格)
  • 对称圆模式

参数描述

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

主要参数

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

-[参数]=[默认值]:描述

  • -v=[文件名]:从文件名获取视频,默认输入 - id=0 的相机
  • -ci=[0]:从指定 id 的相机获取视频
  • -flip=[false]:输入帧的垂直翻转
  • -t=[circles]:用于标定的模式(circles、chessboard、dualCircles、chAruco、symcircles)
  • -sz=[16.3]:标定板上两个最近圆心或方格中心的距离
  • -dst=[295]:dualCircles 模式中黑白部分之间的距离
  • -w=[宽度]:模式的宽度(以角点或圆形表示)
  • -h=[高度]:模式的高度(以角点或圆形表示)
  • -of=[camParams.xml]:输出文件名
  • -ft=[true]:标定标志的自动调整
  • -vis=[grid]:捕获的棋盘可视化(grid、window)
  • -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:chAruco 棋盘上 Aruco 标记的大小(以像素为单位)
  • calibration_step:运行 cv::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:用于标定的相机的分辨率

注意:charuco_dictcharuco_square_lengthcharuco_marker_size 用于 chAruco 模式生成(有关详细信息,请参见 Aruco 模块描述:Aruco 教程

默认 chAruco 模式

双圆模式

要制作此模式,您需要标准的 OpenCV 圆模式和二进制反转模式。将两个模式放置在一个平面上,以便一个模式中所有水平圆线的延续是另一个模式中类似线的延续。测量模式之间的距离,如以下图片所示,并将其作为 dst 命令行参数传递。此外,测量最近圆心之间的距离,并将此值作为 sz 命令行参数传递。

此模式对生产质量和测量非常敏感。

数据过滤

当标定数据集的大小大于 max_frames_num 时,数据过滤器开始工作。它试图从数据集中删除“不良”帧。过滤器删除了 \(loss\_function\) 达到最大值的帧。

\[loss\_function(i)=\alpha RMS(i)+(1-\alpha)reducedGridQuality(i)\]

RMS 是为帧 i 计算的平均重投影误差,reducedGridQuality 是在没有帧 i 的情况下进行的场景覆盖质量评估。\(\alpha\) 等于 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>