"Python校准摄像头"

2024-10-03 15:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下图I1。我没有抓住它。我从谷歌下载的

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

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

enter image description hereenter image description here

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


Tags: 图像none矩阵fixcv2照片摄像机正方形
1条回答
网友
1楼 · 发布于 2024-10-03 15:29:37

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

在执行相机校准时,如果使用不同的对应集重复校准,则有三个原因可以解释为什么可以有不同的固有矩阵。在

  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个未知)。它通常会使用函数最小化过程来解决这个问题(就像OpenCV的calibrateCamera方法一样)。在OpenCV中,这是通过最小化重投影误差来实现的。解决方案这将取决于您提供的通信。这很难想象,所以考虑另一个问题,在这个问题中,你试图把一条直线拟合到一条稍微弯曲的直线上。直线是数据的过度简化模型。如果我们试图将直线拟合到曲线数据中,通过从曲线数据中采样两个点,最佳拟合解将随采样点的不同而变化。在

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

相关问题 更多 >