Python校准相机

发布于 2021-01-29 16:16:48

我有以下图像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中的这些对应点形成一个正方形,因此我应该能够从这些点获取相机矩阵。但是,当我在图像的不同位置拍摄相同的正方形时,会得到不同的相机矩阵。为什么是这样?我在做什么错,我该如何解决?如何计算正确的相机矩阵?

一个例子如下所示。对于这两个选定的平方,我mtxcalibrateCamera函数中获得了不同的值。

在此处输入图片说明
在此处输入图片说明

注意:上图中的红色点不是I1中完美正方形的角点。我刚刚对它们进行了粗略标记,以表达我的观点,即当我拍摄两个相同大小但在不同位置的正方形时,相机矩阵的值将有所不同。

关注者
0
被浏览
146
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    执行相机校准时,如果使用不同的对应关系重复校准,则可能会有 三个 固有矩阵的 三个 原因。

    1. 信件很吵。
    2. 相机校准问题尚未确定。这意味着没有足够的对应信息来唯一地解析所有相机参数。
    3. 相机校准使用不精确或过于严格的相机模型。

    原因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。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看