Python校准相机

时间:2018-01-13 13:18:08

标签: python opencv camera camera-calibration camera-matrix

我有以下图片I1。我没有抓住它。我是从Google下载的

enter image description here

我将已知的单应性H应用于I1以获得以下图像I2。

enter image description here

我想假设一台相机拍摄了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中的这些对应点形成正方形,所以我应该能够从这些点获得相机矩阵。但是,当我在图像中的不同位置采用相同的方块时,我得到一个不同的相机矩阵。为什么是这样?我做错了什么以及如何解决?如何计算正确的相机矩阵?

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

enter image description here enter image description here

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

1 个答案:

答案 0 :(得分:2)

这是一个很好的问题,涉及校准和计算几何的几个重要问题。我将提供一个深入的答案,我希望这些答案能够明确。

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

  1. 通信很吵。
  2. 相机校准问题不明确。这意味着没有足够的对应信息来唯一地解析所有摄像机参数。
  3. 相机校准使用不精确或过度限制的相机型号。
  4. 原因1 应该相当明显。如果对应物被测量噪声破坏,那么如果使用不同的对应组,通常会获得不同的校准。这是因为在校准过程中,这是一个优化过程,其中相机参数被优化以最佳地适合对应关系。当存在噪声时,最佳拟合可以根据测量的噪声而变化。

    如果您尝试使用不充分的信息进行校准,则会发生

    原因2 。例如,如果每张图像只有三个对应关系,则校准问题已确定。您可以通过计算参数来考虑这一点。三个对应关系对校准方程提供了6个约束(对于通过它的每个对应关系,两个约束的x和y位置)。现在,当我们校准时,我们必须联合估计校准物体的姿态(每个图像有6个自由度),加上内在物的未知数(焦距,主点,畸变等)。因此,有许多未知数而不是约束条,因此可以进行无限多次校准!因此,如果您选择了三组对应的不同组合,则返回校准(如果完全返回)将永远不会是正确的,并且通常永远不会相同。

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

    您案件中发生的事情 在你的情况下,你已经将未知数减少到一个焦距(f = fx = fy)和相机的主要点。这是3个未知数,但回想一下,使用单个图像进行校准意味着您最多只能有2个内在未知数。因此,您的问题不足(请参阅上面的原因2)。

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

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

    在您的特定情况下,您可以通过使用具有2个未知数的内在矩阵来消除问题2和3,方法是删除标记以固定宽高比,并将主要点固定到图像中心。