使用适用于 Matlab 与 OpenCV 的相机校准工具箱进行校准

Posted

技术标签:

【中文标题】使用适用于 Matlab 与 OpenCV 的相机校准工具箱进行校准【英文标题】:Calibration using Camera Calibration Toolbox for Matlab vs OpenCV 【发布时间】:2021-10-11 12:31:10 【问题描述】:

我目前正在校准相机,我尝试同时使用 Caltech Camera Calibration Toolbox for Matlab 和 OpenCV。我对这两种方法都使用了相同的图像。即使两种方法之间的误差似乎或多或少相同,但值并不完全匹配,尤其是失真系数

Matlab 结果

Calibration results after optimization (with uncertainties):

Focal Length:          fc = [ 1475.06776   1474.34956 ] +/- [ 1.30130   1.28283 ]
Principal point:       cc = [ 967.66660   535.09387 ] +/- [ 1.44019   1.23663 ]
Skew:             alpha_c = [ 0.00000 ] +/- [ 0.00000  ]   => angle of pixel axes = 90.00000 +/- 0.00000 degrees
Distortion:            kc = [ 0.06844   -0.15582   0.00049   0.00021  0.00000 ] +/- [ 0.00235   0.00641   0.00028   0.00035  0.00000 ]
Pixel error:          err = [ 0.64754   0.45951 ]

Note: The numerical errors are approximately three times the standard deviations (for reference).

和 OpenCV 结果

RMS:  0.40118611304523083
Camera matrix:  [[1.46405121e+03 0.00000000e+00 9.64151487e+02]
 [0.00000000e+00 1.46362963e+03 5.35514933e+02]
 [0.00000000e+00 0.00000000e+00 1.00000000e+00]]
Distortion coefficients:  [[ 2.27565390e-01 -1.22470407e+00  3.58771830e-04 -4.77602117e-04
   1.96274452e+00]]

我知道这两种方法之间存在差异(例如角点提取方法),所以我不应该期望完全相同的结果,但差异对我来说仍然很重要。我尝试拍摄更多以不同角度倾斜的棋盘图像,但数值和误差并没有太大差异。

我对失真系数的差异感到非常惊讶,因为它们有不同的数量级。如果我使用两次校准的值对棋盘图像进行不失真处理,即使 OpenCV 显示更多的桶形校正,它们看起来都是合理的。

使用 Matlab 校准未失真

使用 OpenCV 校准未失真

我的猜测是,由于相机没有太大的失真,因此两种方法会收敛到不同的解决方案。我的问题是,有没有办法确定这两种校准中的哪一种给出“最佳”结果?即使它们明显不同,它们是否都可以接受?

【问题讨论】:

OpenCV 似乎更糟,棋盘角/边框上的线条不太直。直线直线度是衡量不失真质量的良好指标。你知道matlab使用的算法吗?如果它使用较少的失真系数,您也可以在 opencv 中限制它们。你能查看和比较检测到的棋盘角吗? 您的数据没有到达角落,那里的失真最严重,并且数值优化在那里没有支持,这就是为什么它为您提供在角落剧烈波动的解决方案。 tldr:获取涵盖整个图片的数据。 恕我直言,matlab 中的最后一个系数看起来正好是 0。所以也许 Matlab 用一些固定为 0 的系数来确定校准,然后选择“最好的”一个(在使用更多系数与. 只得到稍微好一点的错误)。你可以尝试使用opencv校准,最后一个dist系数固定为0吗? @Micka 非常感谢。我按照您所说的进行了尝试,通过将 OpenCV 中的最后一个失真系数固定为 0,这两种方法之间的结果现在非常相似!结果表明,Matlab 校准工具箱默认将该系数设置为 0。 Matlab 在不需要系数的意义上可能是正确的,因为它的校正看起来更好 失真系数越多,重投影误差越小,但如果过度拟合,则减少的可能性越大(因此理论上您需要的数据样本越多)。所以我想你可以说“只从 n 个系数开始,然后是 n+1、n+2 等,如果再投影误差的减少不再足够好:停止” 【参考方案1】:

感谢Micka 的 cmets,我解决了这个问题,所以我会回答我自己的问题,以防它可以帮助其他人。

差异是由于 Caltech 校准工具箱默认将第 5 个失真系数 k3 设置为零造成的。如果你想评估它,你必须激活正确的设置。通过在 OpenCV 校准中将 k3 强制为 0,结果非常相似。

【讨论】:

以上是关于使用适用于 Matlab 与 OpenCV 的相机校准工具箱进行校准的主要内容,如果未能解决你的问题,请参考以下文章

已知相机参数时的OpenCV图像拼接

OpenCV 2.3 相机校准

MatLab和OpenCV共同实现单目相机标定实验--附标定图片

确定图像中车辆的距离(Matlab,OpenCV)

如何显示视频捕捉滤镜对话框(相机设置,如亮度,曝光)?

您如何获得适用于 Android 的简单相机程序?