基于Python进行相机校准
重磅干货,第一时间送达
总览
为了校准相机,我们对3D对象(例如图案立方体)成像,并使用3D对象与其2d图像之间的3D-2D点对应关系来查找相机参数。
我们需要找到两组参数:内在参数和外在参数。固有参数是摄像机内部的那些参数,例如焦距,主要点等,而固有参数是规定摄像机相对于摄像机的位置t(平移矢量)和方向R(旋转矩阵)的参数。外部坐标系(通常称为世界坐标系)。在第一部分中,我们将仅计算内部参数(假设外部参数是已知的),而在第二部分中,我们将共同计算内部参数和外部参数。
内部参数计算
我们使用的校准对象是魔方。
我们对立方体进行成像,如下图所示。然后,我们获得许多3D-2D点对应关系。在这一部分中,我们已经计算了点对应关系,您要做的就是从它们中计算出固有参数。3D-2D对应关系在数据文件“ pt_corres.mat”中给出。该文件包含“ pts_2D”,2D点和“ cam_pts_3D”以及所有对应的3D点。现在,我们必须找到K矩阵
K矩阵
使3D与2D点相关的矩阵K是具有以下形状的上三角矩阵。
其中αx,αy表示以x和y像素尺寸表示的焦距,px和py是主要点,s是偏斜参数。
2D点(x,y)与相应3D点(X,Y,Z)之间的关系由下式给出
1. x =αx(X / Z)+ s(Y / Z)+ px
2. y =αy(Y / Z)+ py
内部和外部参数计算
在上一部分中,我们假设已知外部参数,然后计算了内部参数,即假设我们知道了相机坐标系中的3D点对应关系。但是这种情况很少发生。几乎总是我们仅在世界坐标系中知道3D点的对应关系,因此我们需要估算内在和外在参数。但是在此之前,我们需要获取3D-2D点对应关系。如图1所示,相对于世界坐标系描述了3D点。该图显示了世界坐标系的x,y和z轴以及一些示例3D点,它们是正方形的角。有28点。
1. 世界坐标系中的3D点在rubik_3D_pts.mat中提供,图像上相应的2D点在rubik_2D_pts.mat中提供
2. 接下来,我们要计算相机投影矩阵P = K [R t],其中K是内部/本征校准矩阵,R是旋转矩阵,用于指定相机坐标系与世界坐标系的方向,而t是转换向量,可以确定摄影机中心在世界坐标系中的位置。
3. 为了计算P,我们使用“直接线性变换(DLT)”。DLT是要理解的重要算法,下面将对其进行详细说明。
离散线性变换(DLT)
离散线性变换(DLT)是一种简单的线性算法,用于从相应的3空间和图像实体估计摄像机投影矩阵P。相机矩阵的这种计算称为切除。最简单的这种对应关系是在未知相机映射下的3D点X及其图像x之间。给定足够多的这种对应关系,可以确定相机矩阵。
算法
通过解方程组Ap = 0来计算投影矩阵P,其中p是包含矩阵P项的向量。
计算P所需的最小点对应数量
3×4矩阵P具有12个元素,但比例是任意的,因此具有11个自由度。由于每个点的对应关系都有2个方程,因此至少需要5.5个对应关系才能求解P。0.5表示从第六个点开始仅使用一个方程,即我们选择x坐标或y-第六个图像点的坐标。
在此最小数量的对应关系下,该解决方案是精确的,并且可以通过求解Ap = 0来获得,其中A在这种情况下为11x12矩阵。
如果数据不精确,则给出n≥6个点对应关系,那么将没有精确的解决方案,我们通过最小化代数或几何误差来解决。
从投影矩阵P获得参数K,R和t
通过RQ分解将P分解为K,R,t。它涉及计算分解A = RQ,其中Q为unit /正交,R为上三角。
验证计算参数的准确性
为此,我们将计算重新投影误差,该误差是对2D点与通过使用计算出的相机参数投影3D点而获得的2D点之间距离的度量。
该图以橙色显示了原始2D点,并以绿色显示了重新投影的点。可以看出,重新投影的点与实际点非常匹配。
参考文献
[1] R. Hartley and A. Zissermann, Multiview geometry, 2nd edition, Cambridge University Press.
[2] Z. Zhang. A flexible new technique for camera calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330–1334, 2000.
有关详细代码,请访问https://github.com/sreenithy/Camera-Calibration。
交流群