使用适用于 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 的相机校准工具箱进行校准的主要内容,如果未能解决你的问题,请参考以下文章