阅读(3259) (11)

互动摄像机校准应用

2017-10-10 10:15:21 更新

根据经典校准技术,用户必须首先收集所有数据,并在运行cv :: calibrateCamera功能时获取摄像机参数。如果平均重新投影误差很大或者如果估计参数似乎是错误的,选择或收集数据的过程以及cv :: calibrateCamera的重新开始。

交互式校准过程假设在每个新的数据部分用户可以看到结果和错误估计之后,他也可以删除最后的数据部分,最后,当校准的数据集足够大时,自动数据选择的开始过程。

主要应用特点

示例应用程序将:

  • 确定每个元素的失真矩阵和置信区间
  • 确定每个元素的相机矩阵和置信区间
  • 从相机或视频文件输入
  • 从XML文件读取配置
  • 将结果保存到XML文件中
  • 计算重新投影误差
  • 剔除锐角图形,防止不适合的雅可比块出现

  • 自动切换校准标志(如果需要,修正高宽比和失真矩阵的元素)
  • 使用多个标准进行校准时自动检测
  • 自动捕获静态图案(用户不需要按任意键捕捉框架,只需不要移动图案一秒钟)

支持的模式:

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

参数说明

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

主要参数:

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

- [参数] = [默认值]:说明

  • -v = [filename]:从文件名获取视频,默认输入 - id = 0的相机
  • -ci = [0]:从指定ID的相机获取视频
  • -flip = [false]:输入框的垂直翻转
  • -t = [圈子]:校准模式(圆,棋盘,双圆,chAruco)
  • -sz = [16.3]:校准板上两个最近圆圈或正方形中心之间的距离
  • -dst = [295] daulCircles模式的白色和黑色部分之间的距离
  • -w = [width]:图案的宽度(角或圆)
  • -h = [height]:图案的高度(角或圆)
  • -of = [camParams.xml]:输出文件名
  • -ft = [true]:校准标志的自动调整
  • -vis = [grid]:捕获的板可视化(网格,窗口)
  • -d = [0.8]:捕获之间的延迟(以秒为单位)
  • -pf = [defaultConfig.xml]:高级应用程序参数文件

高级参数:

默认情况下,高级参数值存储在defaultConfig.xml中

<?xml  version = “1.0”?>
< opencv_storage >
< charuco_dict > 0 </ charuco_dict >
< charuco_square_lenght > 200 </ charuco_square_lenght >
< 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 > 1 e-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_lenght:chAruco板上的square的大小(以像素为单位)
  • 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_lenght和charuco_marker_size用于chAruco模式生成(有关详细信息,请参阅Aruco模块描述:Aruco教程

默认chAruco模式:

opencv摄像机校准应用

双圈图案

为了使这个模式,你需要标准的OpenCV圆形图案和二进制反转。当一个图案中的所有水平线的线条在另一个图案中是相似线条的连续时,按顺序将两个图案放置在一个平面上。测量图形之间的距离如下图所示,将其作为dst命令行参数传递。还测量最近圆的中心之间的距离,并将该值作为sz命令行参数传递。

opencv摄像机校准应用

这种模式对生产和测量的质量非常敏感。

数据过滤

当校准数据集大小时,max_frames_num将开始工作数据过滤。它尝试从数据集中删除“坏”帧。过滤器将删除最大值loss_function 的帧

opencv摄像机校准应用

RMS是针对帧i计算的平均重新投影误差,reduceGridQuality是无帧i的场景覆盖质量评估,等于frame_filter_conv_param。

校准过程

开始校准只需运行应用程序。将图案放置在相机前方,并以某种姿势固定图案。之后等待捕获(将显示消息,如“Frame #i capture”)。主屏幕将显示当前焦距和重投影误差。将模式移动到下一个位置并重复过程。尝试均匀地覆盖图像平面,并且不会在图像平面的锐角上显示图案。

opencv摄像机校准应用

如果校准似乎成功(置信区间和平均重新投影误差小,帧覆盖质量和模式视图数量足够大)应用程序将显示如下屏幕上的消息。

opencv摄像机校准应用

热键:

  • 退出应用程序
  • 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.2519588293098975 e +03 0. 6.6684948780852471 e +02 0。
    1.2519588293098975 e +03 3.6298123112613683 e +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.2887048808572649 e +01 2.8536856683866230 e +00
    2.8341737483430314 e +00 </ data > </ cameraMatrix_std_dev >
< dist_coeffs  type_id = “opencv-matrix” >
  < rows > 1 </ rows >
  < cols > 5 </ cols >
  < dt > d </ dt >
  < data >
    1.3569117181595716 e-01 -8.2513063822554633 e-01 0. 0。
    1.6412101575010554 e +00 </ data > </ dist_coeffs >
< dist_coeffs_std_dev  type_id = “opencv-matrix” >
  < rows > 5 </ rows >
  < cols > 1 </ cols >
  < dt > d </ dt >
  < data >
    1.5570675523402111 e-02 8.7229075437543435 e-02 0. 0。
    1.8382427901856876 e-01 </ data > </ dist_coeffs_std_dev >
< avg_reprojection_error > 4.2691743074130178 e-01 </ avg_reprojection_error >
</ opencv_storage >