上一个教程: 纹理对象的实时姿态估计
下一个教程: 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_step:cv::calibrateCamera 的启动间隔(以帧为单位)
- max_frames_num:如果用于标定的帧数大于此值,则帧过滤器开始工作。过滤后,标定数据集的大小等于 max_frames_num
- min_frames_num:如果帧数大于此值,则启用自动标志调整、去畸变视图和质量评估
- solver_eps:cv::calibrateCamera 中 Levenberg-Marquardt 求解器的精度
- solver_max_iters:求解器的迭代次数限制
- fast_solver:如果此值为非零并且找到 Lapack,则在求解器中使用 QR 分解代替 SVD。 QR 比 SVD 快,但可能精度较低
- frame_filter_conv_param:在线性卷积的双标准帧过滤器中使用的参数
- camera_resolution:用于标定的相机的分辨率
注意: charuco_dict、charuco_square_length 和 charuco_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>