OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
交互式相机校准应用程序

上一个教程: 纹理对象的实时姿态估计
下一个教程: USAC: OpenCV中随机抽样一致性的改进

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

根据经典的标定技术,用户必须首先收集所有数据,然后运行 cv::calibrateCamera 函数来获得相机参数。如果平均重投影误差很大,或者估计的参数看起来是错误的,那么选择或收集数据并启动 cv::calibrateCamera 的过程将会重复。

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

主要应用程序特性

该示例应用程序将

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

支持的图案

  • 黑白棋盘
  • 非对称圆点图案
  • 双非对称圆点图案
  • chAruco(带有 Aruco 标记的棋盘)
  • 对称圆点图案

参数说明

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

主要参数

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

-[parameter]=[default value]: description

  • -v=[filename]: 从文件名获取视频,默认输入 - id=0 的相机
  • -ci=[0]: 从指定 id 的相机获取视频
  • -flip=[false]: 垂直翻转输入帧
  • -t=[circles]: 标定图案(circles, chessboard, dualCircles, chAruco, symcircles)
  • -sz=[16.3]: 标定板上两个最近的圆或正方形中心之间的距离
  • -dst=[295]: dualCircles 图案的白色和黑色部分之间的距离
  • -w=[width]: 图案的宽度(以角点或圆圈为单位)
  • -h=[height]: 图案的高度(以角点或圆圈为单位)
  • -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_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:用于标定的相机的分辨率

注意: 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

标定过程

要开始标定,只需运行应用程序。将图案放置在相机前,并将图案固定在某个姿势。之后,等待捕获(将显示类似“Frame #i captured”的消息)。当前焦距和重投影误差将显示在主屏幕上。将图案移动到下一个位置并重复该过程。尽量均匀地覆盖图像平面,不要以与图像平面成锐角的角度显示图案。

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

热键

  • 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>