相机校准期间的不同平面

Posted

技术标签:

【中文标题】相机校准期间的不同平面【英文标题】:Different planes during Camera Calibration 【发布时间】:2013-10-04 14:37:40 【问题描述】:

我正在使用标准 OpenCV 函数来校准相机的内在参数。为了获得好的结果,我知道我们必须使用不同角度的棋盘图像(考虑 3D 中的不同平面)。这在所有文档中都有说明 和论文,但我真的不明白,为什么考虑不同的平面对我们来说如此重要,是否存在我们必须考虑的最佳平面数量以获得最佳校准结果?

如果您能提供一些解释这一点的论文或文档的参考资料,我将很高兴。 (我认为张的论文谈到了它,但是它的数学密集且难以消化。)

谢谢

【问题讨论】:

在 MATLAB 中试用相机校准器应用程序:mathworks.com/help/vision/ug/single-camera-calibrator-app.html 【参考方案1】:

在数学上,只有当您拥有 3 个或更多平面目标的不同图像时,才能定义内部参数的唯一解(按比例缩放)。见张的paper的第6页:“如果观察到模型平面的n张图像,通过堆叠n个等式(8)我们有Vb = 0;(9)其中V是2n×6矩阵。如果n≥ 3,我们通常会有一个唯一的解决方案 b 被定义为一个比例因子......”

没有“最佳”数量的飞机,就数据而言,您拥有的飞机越多,您就越开心。但是随着解决方案开始收敛,由于添加额外图像而导致的校准精度的边际增益变得可以忽略不计。当然,这假设图像显示的平面在姿势和位置上都很好地分离。

有关实用技巧,另请参阅this other answer of mine。

【讨论】:

【参考方案2】:

如果您正在寻找一点直觉,这里有一个例子说明为什么只有一架飞机是不够的。想象一下您的校准棋盘正以 45° 角从您身上倾斜:

您可以看到,当您在 +y 方向上将棋盘向上移动 1 米时,您也会在 +z 方向上远离相机 1 米。这意味着无法区分在 y 方向和 z 方向上移动的效果。对于我们所有的训练点,y 和 z 移动方向有效地相互关联。所以,如果我们只看这个平面上的点,就无法区分 y 运动与 z 运动的影响。

例如,从这 1 个平面上,我们无法区分这些场景:

    相机存在透视失真,因此当物体在世界 +y 方向移动时,图像中的物体看起来更小。 相机焦距使得图像中的物体在世界 +z 方向移动时显得更小。 #1 和 #2 中效果的任何混合。

从数学上讲,这种模糊性意味着当 OpenCV 试图拟合相机矩阵以匹配数据时,有许多同样可能的解决方案。 (请注意,45° 角并不重要。您选择的任何平面都会遇到同样的问题:训练示例的 (x,y,z) 维度是耦合在一起的,因此您无法将它们的效果分开。)

最后一点:如果您对相机矩阵做出足够的假设(例如,没有透视失真、x 和 y 缩放相同等),那么您最终可能会遇到未知数较少的情况(在极端情况下,也许您重新计算焦距),在这种情况下,您可以只使用 1 个平面进行校准。

【讨论】:

以上是关于相机校准期间的不同平面的主要内容,如果未能解决你的问题,请参考以下文章

单平面的摄像机校准

棋盘大小如何影响准确的相机校准?

使用 OpenCV cvStereoCalibrate 校准一对不同分辨率的相机时出现大的重投影误差

使用嵌入式相机计算道路平面法线

来自 Unity 的相机内在矩阵

我们可以在不运行校准代码的情况下找到相机矩阵吗?