参考:https://zhuanlan.zhihu.com/p/94244568
https://www.cnblogs.com/zyly/p/9366080.html#_label0
相机标定的目的
简言之,有两个目的
第一,要还原摄像头成像的物体在真实世界的位置就需要知道世界中的物体到计算机图像平面是如何变换的,相机标定的目的之一就是为了搞清楚这种变换关系,求解内外参数矩阵。
第二,摄像机的透视投影有个很大的问题——畸变。摄像头标定的另一个目的就是求解畸变系数,然后用于图像矫正。
相机内外参
坐标系的定义
世界坐标系\(\left ( X_{W},Y_{W} ,Z_{W}\right )\):目标物体位置的参考系。除了无穷远,世界坐标可以根据运算方便与否自由放置,单位为长度单位如mm。在双目视觉中世界坐标系主要有三个用途:
- 标定时确定标定物的位置;
- 作为双目视觉的系统参考系,给出两个摄像机相对世界坐标系的关系,从而求出相机之间的相对关系;
- 作为重建得到三维坐标的容器,存放重建后的物体的三维坐标。世界坐标系是将看见中物体纳入运算的第一站。
摄像机坐标系\(\left ( X_{C},Y_{C} ,Z_{C}\right )\):摄像机站在自己角度上衡量的物体的坐标系。摄像机坐标系的原点在摄像机的光心上,\(z\)轴与摄像机光轴平行。它是与拍摄物体发生联系的桥头堡,世界坐标系下的物体需先经历刚体变化转到摄像机坐标系,然后在和图像坐标系发生关系。它是图像坐标与世界坐标之间发生关系的纽带,沟通了世界上最远的距离。单位为长度单位如mm。
图像坐标系\(\left ( x,y \right )\):以CCD 图像平面的中心为坐标原点,为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置。
像素坐标系\(\left ( u,v\right )\) :以 CCD 图像平面的左上角顶点为原点,为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。像素坐标系就是以像素为单位的图像坐标系。
备注:有很多人把图像坐标系和像素坐标系合在一起,称作三大坐标系,也有人分开,称为四大坐标系。
坐标系之间的关系
- 图像坐标系到像素坐标系
有了图像坐标系为什么还要建一个像素坐标系?
这要搞懂像素坐标系的\(\left ( u,v\right )\)和图像坐标系的\(\left ( x,y \right )\)分别是什么。
我们以图像左上角为原点建立以像素为单位的直接坐标系u-v。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。
由于\(\left ( u,v\right )\)只代表像素的列数与行数,而像素在图像中的位置并没有用物理单位表示出来,所以,我们还要建立以物理单位(如毫米)表示的图像坐标系\(x-y\)。 - 世界坐标系到摄像机坐标系
刚体变换(regidbody motion):三维空间中, 当物体不发生形变时,对一个几何物体作旋转, 平移的运动,称之为刚体变换。
因为世界坐标系和摄像机坐标都是右手坐标系,所以其不会发生形变。我们想把世界坐标系下的坐标转换到摄像机坐标下的坐标,如下图所示,可以通过刚体变换的方式。空间中一个坐标系,总可以通过刚体变换转换到另外一个个坐标系的。
二者之间刚体变换的数学表达:\( \begin{bmatrix} X_{C}\\ Y_{C}\\ Z_{C} \end{bmatrix}= \begin{bmatrix} r_{00} &r_{01} &r_{02} \\ r_{10} &r_{11} & r_{12}\\ r_{20}& r_{21} &r_{22} \end{bmatrix} \begin{bmatrix} X_{W}\\ Y_{W}\\ Z_{W} \end{bmatrix}+\begin{bmatrix} T_{x}\\ T_{y}\\ T_{z} \end{bmatrix}\)
对应的齐次表达式为:
\( \begin{bmatrix} X_{C}\\ Y_{C}\\ Z_{C}\\ 1 \end{bmatrix}= \begin{bmatrix} R &t \\ 0_{3}^{T} & 1 \end{bmatrix} \begin{bmatrix} X_{W}\\ Y_{W}\\ Z_{W}\\ 1 \end{bmatrix}=\begin{bmatrix} r_{1} &r_{2} &r_{3} & t \end{bmatrix} \begin{bmatrix} X_{W}\\ Y_{W}\\ 0\\ 1 \end{bmatrix}= \begin{bmatrix} r_{1} &r_{2} & t \end{bmatrix} \begin{bmatrix} X_{W}\\ Y_{W}\\ 1 \end{bmatrix}\)
其中,R是3×3的正交单位矩阵(即旋转矩阵),t为平移向量,R、t与摄像机无关,所以称这两个参数为摄像机的外参数(extrinsic parameter),可以理解为两个坐标原点之间的距离,因其受x,y,z三个方向上的分量共同控制,所以其具有三个自由度。
我们假定在世界坐标系中物点所在平面过世界坐标系原点且与Zw轴垂(也即棋盘平面与Xw-Yw平面重合,目的在于方便后续计算),则Zw=0。
3.摄像机坐标系到图像坐标系
透视投影(perspective projection): 用中心投影法将形体投射到投影面上,从而获得的一种较为接近视觉效果的单面投影图。有一点像皮影戏。它符合人们心理习惯,即离视点近的物体大,离视点远的物体小,不平行于成像平面的平行线会相交于消隐点(vanish point)
这里我们还是拿针孔成像来说明(除了成像亮度低外,成像效果和透视投影是一样的,但是光路更简单)
下图是针孔-摄像机的基本模型。平面π称为摄像机的像平面,点Oc称为摄像机中心(或光心),f成为摄像机的焦距,Oc为端点且垂直于像平面的射线成为光轴或主轴,主轴与像平面的交点p是摄像机的主点。
图像的矫正
我们在摄像机坐标系到图像坐标系变换时谈到透视投影。摄像机拍照时通过透镜把实物投影到像平面上,但是透镜由于制造精度以及组装工艺的偏差会引入畸变,导致原始图像的失真。因此我们需要考虑成像畸变的问题。
透镜的畸变主要分为径向畸变和切向畸变,还有薄透镜畸变等等,但都没有径向和切向畸变影响显著,所以我们在这里只考虑径向和切向畸变。
径向畸变
顾名思义,径向畸变就是沿着透镜半径方向分布的畸变,产生原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲,这种畸变在普通廉价的镜头中表现更加明显,径向畸变主要包括桶形畸变和枕形畸变两种。以下分别是枕形和桶形畸变示意图:
像平面中心的畸变为0,沿着镜头半径方向向边缘移动,畸变越来越严重。畸变的数学模型可以用主点(principle point)周围的泰勒级数展开式的前几项进行描述,通常使用前两项,即k1和k2,对于畸变很大的镜头,如鱼眼镜头,可以增加使用第三项k3来进行描述,成像仪上某点根据其在径向方向上的分布位置,调节公式为:
式里(x0,y0)是畸变点在像平面的原始位置,(x,y)是畸变较正后新的位置,下图是距离光心不同距离上的点经过透镜径向畸变后点位的偏移示意图,可以看到,距离光心越远,径向位移越大,表示畸变也越大,在光心附近,几乎没有偏移。
切向畸变
切向畸变是由于透镜本身与相机传感器平面(像平面)或图像平面不平行而产生的,这种情况多是由于透镜被粘贴到镜头模组上的安装偏差导致。畸变模型可以用两个额外的参数p1和p2来描述:
下图显示某个透镜的切向畸变示意图,大体上畸变位移相对于左下——右上角的连线是对称的,说明该镜头在垂直于该方向上有一个旋转角度。
径向畸变和切向畸变模型中一共有5个畸变参数,在Opencv中他们被排列成一个5×1的矩阵,依次包含\(k1\)、\(k2\)、\(p1\)、\(p2\)、\(k3\),经常被定义为Mat矩阵的形式,如Mat distCoeffs=Mat(1,5,CV_32FC1,Scalar::all(0));这5个参数就是相机标定中需要确定的相机的5个畸变系数。求得这5个参数后,就可以校正由于镜头畸变引起的图像的变形失真。