相机标定

从零开始理解相机标定原理

导入

使用相机对三维世界拍照,可以生成一张二维的照片。然而:

  • 三维世界中的物体比例是否被真实的反映在了照片中?(镜头畸变)
  • 如果是,二者的大小比例是否可以定量分析?(像素焦距、光学中心位置)
  • 如果可以,能否利用已知的比例信息与透视原理从二维照片中还原出三维世界的深度信息?(深度感知,三维重建)
    相机标定是尝试解决上述问题的关键步骤。

相机标定的直接目标

通过建立针孔相机模型估计9个参数,即fx,fy,cx,cy,k1,k2,k3,p1,p2f_x, f_y, c_x, c_y, k_1, k_2, k_3, p_1, p_2

  • fxf_x , fyf_y :像素焦距
  • cxc_x ,cyc_y :图像坐标系原点到主光轴的偏移量
  • k1k_1 ,k2k_2, k3k_3, p1p_1, p2p_2 :畸变参数,其中k1k_1 ,k2k_2, k3k_3是径向畸变参数,p1p_1, p2p_2是切向畸变参数
    下面从针孔相机模型开始了解。

了解针孔相机模型

通常我们将相机镜头看作一个凸透镜,成像原理如图。

但在计算机视觉和计算机图形学中为了简化建模,我们将镜头视作小孔成像,根据简单的光沿直线传播原理建立针孔相机模型,如图。

抽象为数学模型如下:

首先来了解模型本身

Q、P分别为物点与像点,它们的连线过光心O。红线为成像所在平面,即CMOS面,它与光心O的距离ff称作相机的物理焦距,单位为mm。成像在CMOS面上沿各个方向物理焦距都相同(唯一),但由于图像使用像素来显示,像素本身长与宽可能不同,因此水平方向与垂直方向的像素焦距fxf_x , fyf_y 不同。具体计算方法是fx=fk,fy=flf_x=\frac{f}{k},f_y=\frac{f}{l}kkll为像素的长与宽。

光心:镜头透镜中心,即针孔模型的孔
像素焦距:相机在图像平面水平方向(x轴)和垂直方向(y轴)的焦距,单位是像素

接下来建立两个关键的坐标系

以后所有的估算工作基于这两个坐标系的变换:相机坐标系图像坐标系

  • 相机坐标系:以光心O为原点建立三维坐标系,X与Y坐落在透镜(小孔)平面上,Z轴沿主光轴按右手法则方向延申。单位是mm
  • 图像坐标系:以画板左上角为原点(画板是什么鬼?后面会解释),成像平面(CMOS面)建立二维坐标系,U与V轴按右手法则排列,分别指示成像的长与宽。单位是像素。此处记图像坐标系原点到主光轴的偏移量为 cxc_x , cyc_y (单位是像素)。

为方便使用,将像点对称至与物点同侧,与原模型等价。

标定相机内参

  1. PP点在图像坐标系下坐标(uccdu_{ccd} , vccdv_{ccd})已知;
  2. Q点在相机坐标系下坐标(XX , YY , ZZ )已知;
  3. 根据相似三角形关系得出:

uccdcx=fx(XZ)vccdcy=fy(YZ)\begin{aligned} u_{ccd} - c_x &= f_x \left(\frac{X}{Z}\right) \\ v_{ccd} - c_y &= f_y \left(\frac{Y}{Z}\right) \end{aligned}

也即:

(uccdZvccdZZ)=(fx0cx0fycy001)(XYZ)\begin{pmatrix} u_{ccd} \cdot Z \\ v_{ccd} \cdot Z \\ Z \end{pmatrix} = \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix} \begin{pmatrix} X \\ Y \\ Z \end{pmatrix}

通过多组采点,得到参数矩阵,就估算出了9个参数中的前四个。

标定畸变参数

上述模型是理想情况,实际上相机成像时会产生两种畸变,由透镜形状引起的畸变是径向畸变,而由透镜安装与成像平面不平行引起的畸变是切向畸变

径向畸变分为桶形畸变和枕型畸变,以及由二者复合而成的复合畸变,如下:

切向畸变是透镜安装歪了,成像成梯形拉伸,如下:

我们有固定的公式来矫正畸变。设:

  • (xd,yd)(x_d​,y_d​):实际点(畸变点)
  • (xu,yu)(x_u​,y_u​):理想点(无畸变点)

实际点由两种畸变合成而来:

xd=xrd+xtdyd=yrd+ytd\begin{aligned} x_{d} &= x_{rd} + x_{td} \\ y_{d} &= y_{rd} + y_{td} \end {aligned}

其中径向畸变:

xrd=x(1+k1r2+k2r4+k3r6)yrd=y(1+k1r2+k2r4+k3r6)\begin{aligned}x_{rd}=x(1+k_1r^2+k_2r^4+k_3r^6)\\y_{rd}=y(1+k_1r^2+k_2r^4+k_3r^6)\end{aligned}

切向畸变:

xtd=x+[2p1y+p2(r2+2x2)]ytd=y+[p1(r2+2y2)+2p2x]\begin{aligned}x_{td}=x+[2p_1y+p_2(r^2+2x^2)]\\y_{td}=y+[p_1(r^2+2y^2)+2p_2x]\end{aligned}

利用已知的(xd,yd)(x_d​,y_d​)(xu,yu)(x_u​,y_u​) 估算5个畸变参数。之后,可利用理想点再次估计4个相机内参。

具体的实现方法

相机标定最常用的是的张正友标定法(张氏标定法),操作简单、精度较高,可以满足大部分场合。利用棋盘格标定板进行标定,棋盘格上的每个格子大小都是已知的,也即其相机坐标系下的坐标都是已知的。当相机拍摄标定板的图像时,通过相应的图像检测算法,就可以获得每一个角点在图像坐标系下的坐标,进而获得相机的内参矩阵和畸变参数。需要注意的是,张正友标定法只考虑了径向畸变,没有考虑切向畸变。