编程语言
首页 > 编程语言> > Python校准相机

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 here
enter image description here

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

解决方法:

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

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

>通信很吵.
>相机校准问题不明确.这意味着没有足够的对应信息来唯一地解析所有摄像机参数.
>相机校准使用不精确或过度限制的相机型号.

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

标签:python,opencv,camera-calibration,camera,camera-matrix
来源: https://codeday.me/bug/20191007/1865607.html