这是一个很好的问题,它涉及校准和计算几何的几个重要问题。我将提供一个深入的答案,希望能让这些事情变得清晰。
在执行相机校准时,如果您使用不同的对应集重复校准,那么您可以拥有不同的内在矩阵的三个原因。
- 通信是嘈杂的。
- 相机校准问题尚未确定。这意味着没有足够的对应信息来唯一地解析所有相机参数。
- 相机校准使用不精确或过度限制的相机模型。
原因1应该是相当明显的。如果对应被测量噪声破坏,那么如果您使用不同的对应集,通常会获得不同的校准。这是因为在校准期间,您是一个优化过程,其中相机参数被优化以最适合对应。当有噪声时,最佳拟合可能会因测量的噪声而异。
原因 2如果您尝试使用不充分的信息进行校准,则会发生这种情况。例如,如果每个图像只有三个对应关系,则校准问题未确定。您可以通过计算参数来考虑这一点。三个对应关系为校准方程提供了 6 个约束(每个对应关系通过其 x 和 y 位置两个)。现在,当我们校准时,我们必须联合估计校准对象的姿态(每张图像有 6 个自由度),加上内在函数的未知数(焦距、主点、失真等)。因此,未知数多于约束,因此可以有无穷多个校准!因此,如果您选择了不同的三个对应集,则返回校准(如果完全返回)将永远不会正确并且通常不会相同。
原因3更微妙。为了解释这一点,请记住,可以通过指定具有不同数量的未知内在参数的相机来完成校准。在校准信息非常有限的情况下,减少未知数的数量通常是件好事。例如,如果使用单个图像进行校准,平面校准对象将在校准时为每个图像提供最多 8 个约束(因为单应性有 8 个自由度)。获得平面的位姿需要 6 个约束,因此每个图像剩下 2 个约束。如果您只有一个图像,当有超过 2 个未知数(例如焦距和镜头畸变)时,您将无法进行校准。因此,如果我们想使用单个图像进行校准,我们必须减少未知数。
您的情况发生了什么在您的情况
下,您已将未知数减少到单个焦距(f = fx = fy)和相机的主要点。那是 3 个未知数,但回想一下,使用单个图像进行校准意味着您最多只能有 2 个内在未知数。因此,您遇到了一个约束不足的问题(参见上面的原因 2)。
现在,您可能决定通过将主点固定到图像中心来克服这个问题,这是一种常见的做法,因为它通常是真实主点的一个很好的近似值。现在你有一个带有 1 个未知内在函数 (f) 的校准问题。重要的问题是,如果我们尝试使用单个图像和 4 个无噪声对应来校准 f,我们能否期望使用不同的对应集得到相同的值?你可能认为是,但答案是否定的。
原因是校准过程将解决一个过度约束的问题(8 个约束和 7 个未知数)。它通常会calibrateCamera
使用函数最小化过程来解决这个问题(就像 OpenCV 的方法一样)。在 OpenCV 中,它是通过最小化重投影误差来完成的。对此的解决方案将根据您提供的信件而有所不同。这很难想象,所以考虑一个不同的问题,你试图将一条直线拟合到一条稍微弯曲的线上的点。直线是数据的过度简化模型。如果我们尝试将线拟合到曲线数据,通过从中采样两个点,最佳拟合解决方案将根据采样的点而改变。
在您的特定情况下,您可以通过使用具有恰好 2 个未知数的内在矩阵、删除标志以固定纵横比以及将主点固定到图像中心来消除问题 2 和 3。