Python 校准相机

Python calibrate camera

我有下图I1。我没有捕捉到它。我从 Google

下载

我将已知的单应性H应用到I1得到下面的图像I2。

我想假设相机已经拍摄了上面这张 I2 的照片。我不知道这个相机的相机矩阵,我想找到它。为了找到这个相机矩阵 mtx,我正在使用 OpenCV 相机校准方法:ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None,flags=cv2.CALIB_FIX_ASPECT_RATIO|cv2.CALIB_FIX_K1|cv2.CALIB_FIX_K2|cv2.CALIB_FIX_K3|cv2.CALIB_FIX_K4|cv2.CALIB_FIX_K5)

这是使用正方形完成的,它是真实世界和图像坐标。我在图像 I1 中选择一个正方形,并使用单应性 H 得到 I2 中正方形的对应角点。因为我知道 I2 中的这些对应点形成一个正方形,所以我应该能够从这些点得到相机矩阵。然而,当我在图像的不同位置拍摄同一个正方形时,我得到了不同的相机矩阵。为什么是这样?我做错了什么,我该如何解决?如何计算正确的相机矩阵?

示例如下。对于这两个选定的方块,我从 calibrateCamera 函数中得到不同的 mtx 值。

注意:上图中的红点不是I1中正方形的角点。我只是粗略地标记了它们以表达我的观点,即当我取两个大小相同但位置不同的正方形时,我会得到不同的相机矩阵值。

这是一个很好的问题,涉及校准和计算几何的几个重要问题。我将提供一个深入的答案,希望能让这些事情变得清楚。

执行相机校准时,如果您使用不同的对应集重复校准,有 三个 原因可以让您拥有不同的内在矩阵。

  1. 通信有噪音。
  2. 相机标定问题未定。这意味着没有足够的对应信息来唯一地解析所有相机参数。
  3. 相机校准使用了不精确或过度限制的相机模型。

原因 1 应该是相当明显的。如果对应关系被测量噪声破坏,那么如果您使用不同的 correspondences.This 集,您通常会获得不同的校准,因为在校准期间,您有一个优化过程,其中相机参数被优化以最适合对应关系。当存在噪声时,最佳拟合可能会因测得的噪声而异。

原因 2 如果您尝试使用不充分的信息进行校准,就会发生这种情况。例如,如果每个图像只有三个对应关系,则校准问题未确定。你可以通过计算参数来想到这一点。三个对应关系为校准方程提供了 6 个约束条件(每个对应关系通过它的 x 和 y 位置两个)。现在,当我们校准时,我们必须联合估计校准对象的姿态(每个图像有 6 个自由度),加上内在的未知数(焦距、主点、畸变等)。因此,未知数多于约束,因此可以进行无限多次校准!因此,如果您选择了不同的三个对应集,则 returns 校准(如果返回一个)永远不会正确并且通常永远不会相同。

原因 3 更微妙。为了解释这一点,请记住可以通过指定具有不同数量的未知内在参数的相机来完成校准。在您的校准信息非常有限的情况下,减少未知数的数量通常是好的。例如,如果使用单个图像进行校准,则平面校准对象将为每个图像提供最多 8 个校准约束(因为单应性具有 8 个自由度)。需要 6 个约束才能获得飞机的姿态,因此每张图像还剩下 2 个约束。如果您只有一张图像,则当有超过 2 个未知数(例如焦距和镜头畸变)时,您将无法进行校准。因此,如果我们想使用单个图像进行校准,我们必须减少未知数。

你的情况如何 在您的情况下,您已将未知数减少到单个焦距 (f=fx=fy) 和相机的主点。那是 3 个未知数,但回想一下,使用单个图像进行校准意味着您最多只能有 2 个固有未知数。因此,您遇到了约束不足的问题(请参阅上面的原因 2)。

现在,您可能决定通过将主点固定到图像中心来克服这个问题,这是一种常见的做法,因为它通常是真实主点的一个很好的近似值。现在您遇到了 1 个未知内在函数 (f) 的校准问题。重要的问题是,如果我们尝试使用单个图像和 4 个无噪声对应来校准 f,我们能否期望使用不同的对应集获得相同的值?你可能认为是,但答案是否定的。

原因是因为校准过程将解决一个过度约束的问题(8 个约束和 7 个未知数)。它通常会使用函数最小化过程来解决这个问题(正如 OpenCV 的 calibrateCamera 方法所做的那样)。在 OpenCV 中,它是通过最小化重投影误差来完成的。解决方案将根据您提供的信件而有所不同。这很难想象,所以考虑一个不同的问题,您试图将一条直线拟合到一条稍微弯曲的线上的点。直线是数据的过度简化模型。如果我们尝试通过从中采样两个点来将直线拟合到曲线数据,则最佳拟合解决方案将根据采样的点而变化。

在您的特定情况下,您可以通过使用具有恰好 2 个未知数的固有矩阵、通过移除标志以固定纵横比以及通过将主点固定到图像中心来消除问题 2 和 3。