OpenCV 4.11.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]:双圆图案中白色和黑色部分之间的距离
  • -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_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

标定过程

开始标定只需运行应用程序。将标定图案放置在摄像头前方并固定图案的姿态。之后等待图像采集(将显示类似“已采集第 #i 帧”的消息)。当前焦距和重投影误差将显示在主屏幕上。将图案移动到下一个位置并重复此过程。尽量均匀地覆盖图像平面,并且不要在与图像平面成锐角的角度显示图案。

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

快捷键

  • Esc – 退出应用程序
  • s – 将当前数据保存到 XML 文件
  • r – 删除最后一帧
  • d – 删除所有帧
  • u – 启用/禁用畸变校正
  • v – 切换可视化模式

结果

最终,您将获得相机参数及其置信区间。

输出 XML 文件示例

<?xml version="1.0"?>
<opencv_storage>
<calibrationDate>"2016年4月7日星期四下午04:23:03 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>