上一个教程 : 纹理对象的实时姿态估计
原作者 | 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_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:用于校准的摄像机分辨率
注: 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>