1 基础理论

本小节主要介绍相机成像的基本数学原理(Pinhole模型),以及双目成像的原理。这个部分的理论主要参考12

1.1 基本成像模型

相机成像模型如下图所示,世界坐标系\{x_w y_w z_w\}下的一个点\bold{p}在相机坐标系\{x_c y_c z_c\}的Pinhole进行投影,落在焦距为f的图像平面上,在图像坐标系\{x_i y_i\}下的位置\bold{p}_i。具体的坐标系定义可以看下图:


相机成像模型

我们定义下述变量:
\begin{equation} \bold{x}_i = \begin{bmatrix} x_i \\ y_i \end{bmatrix}, \bold{x}_c = \begin{bmatrix} x_c \\ y_c \\ z_c \end{bmatrix}, \bold{x}_w = \begin{bmatrix} x_w \\ y_w \\ z_w \end{bmatrix} \end{equation}
根据相机焦距得到的基本投影关系为:
\begin{equation} \begin{aligned} \frac{x_i}{f} & =\frac{x_c}{z_c}, \\ \frac{y_i}{f} & =\frac{y_c}{z_c} \end{aligned} \end{equation}
可以得到:
\begin{equation} \begin{aligned} x_i & =f\frac{x_c}{z_c}, \\ y_i & =f\frac{y_c}{z_c} \end{aligned} \end{equation}
虽然我们定义的\bold{p}_i是浮点数,且坐标系原点在图像中心,在针孔的正后方,但是实际的相机传感器并不是这样的,且采集图像的原点一般在左下角,如下图所示:


Image Plane to Image Sensor Mapping

为了解决这两个定义的变换问题,定义m_xm_y为像素密度,o_xo_y为图像像素到图像中心的位置。图像的像素位置与图像平面的投影点的关系如下:
\begin{equation} \begin{aligned} u & =m_x x_i=m_x f \frac{x_c}{z_c} + o_x, \\ v & =m_y y_i=m_y f \frac{y_c}{z_c} + o_y \end{aligned} \end{equation}

1.2 相机内参模型

将上述公式进行调整,我们可以得到投影变换方程:
\begin{equation} \begin{aligned} u & =f_x \frac{x_c}{z_c} + o_x, \\ v & =f_y \frac{y_c}{z_c} + o_y \end{aligned} \end{equation}
在这个公式里,(f_x,f_y,o_x,o_y)为相机内参,单个摄像机标定的目标就求这些内参。为了方便后续表达与计算,在这里引入了齐次坐标,定义如下:
\begin{equation} \begin{aligned} \bold{u} & = \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =\begin{bmatrix} \widetilde{w}u \\ \widetilde{w}v \\ \widetilde{w} \end{bmatrix} =\begin{bmatrix} \widetilde{u} \\ \widetilde{v} \\ \widetilde{w} \end{bmatrix}, \\ \bold{x} & = \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} =\begin{bmatrix} \widetilde{w}x \\ \widetilde{w}y \\ \widetilde{w}z \\ \widetilde{w} \end{bmatrix} =\begin{bmatrix} \widetilde{x} \\ \widetilde{y} \\ \widetilde{z} \\ \widetilde{w} \end{bmatrix} \end{aligned} \end{equation}
将齐次坐标代入投影变换方程可得:
\begin{equation} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} =\begin{bmatrix} \widetilde{u} \\ \widetilde{v} \\ \widetilde{w} \end{bmatrix} =\begin{bmatrix} f_x x_c + o_x z_c \\ f_y x_c + o_y z_c \\ z_c \end{bmatrix} =\begin{bmatrix} f_x & 0 & o_x & 0 \\ 0 & f_y & o_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} =M_{int} \bold{x} \end{equation}
我们得到了线性投影模型(Linear Projection Model)。其中相机内参矩阵定义为:
\begin{equation} K=\begin{bmatrix} f_x & 0 & o_x \\ 0 & f_y & o_y \\ 0 & 0 & 0 \end{bmatrix} \end{equation}

1.3 相机外参模型

相机外部参数指的是世界坐标系\{x_w y_w z_w\}到相机坐标系\{x_c y_c z_c\}的变换,包括旋转矩阵R和位移t。旋转矩阵定义为:
\begin{equation} ^cR_w=\begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} =\begin{bmatrix} ^wx_c \\ ^wy_c \\ ^wz_c \end{bmatrix} =\begin{bmatrix} ^cx_w & ^cy_w & ^cz_w \end{bmatrix} \end{equation}
代入坐标变换关系,可得:
\begin{equation} \bold{x}_c = R(\bold{x}_w-\bold{c}_w) = R\bold{x}_w - R\bold{c}_w = R\bold{x}_w + \bold{t} \end{equation}
使用齐次坐标表示,可得:
\begin{equation} \widetilde{\bold{x}} =\begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \end{bmatrix} =\begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} \end{equation}
我们定义M_{ext}=\begin{bmatrix} R & t \\ 0 & 1\end{bmatrix}为相机的外参矩阵(Extrinsic Parameters)。

1.4 相机标定

利用上述模型,我们即可进行相机的内参标定。首先我们需要一个已知的物体模型,使用相机采集这个物体的图像,其次我们需要找到图像中对应点的世界坐标,如下图所示:


相机标定过程

最后我们需要通过优化方法来计算相机的内外参数。
\begin{equation} \begin{aligned} \begin{bmatrix} u^{i} \\ v{i} \\ 1 \end{bmatrix} & = \begin{bmatrix} f_x & 0 & o_x & 0 \\ 0 & f_y & o_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} \\ & = \begin{bmatrix} p_{11} & p_{12} & p_{13} & p_{14} \\ p_{21} & p_{22} & p_{23} & p_{24} \\ p_{31} & p_{32} & p_{33} & p_{34} \end{bmatrix} \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \end{bmatrix} = P \bold{x} \end{aligned} \end{equation}
将上式展开可以得到:
\begin{equation} \begin{aligned} u^i & = \frac{p_{11} x_{w}^{i} + p_{12} y_{w}^{i} + p_{13} z_{w}^{i} + p_{14} }{p_{31} x_{w}^{i} + p_{32} y_{w}^{i} + p_{33} z_{w}^{i} + p_{34} }, \\ v^i & = \frac{p_{21} x_{w}^{i} + p_{22} y_{w}^{i} + p_{23} z_{w}^{i} + p_{24} }{p_{31} x_{w}^{i} + p_{32} y_{w}^{i} + p_{33} z_{w}^{i} + p_{34} } \end{aligned} \end{equation}

将图片中所有点组成的方程进行重新排列,我们得到下面的方程:
\begin{equation} \begin{aligned} \begin{bmatrix} x_w^1 & y_w^1 & z_w^1 & 1 & 0 & 0 & 0 & 0 & -u_1 x_w^1 & -u_1 y_w^1 & -u_1 z_w^1 & -u_1 \\ 0 & 0 & 0 & 0 & x_w^1 & y_w^1 & z_w^1 & 1 & -v_1 x_w^1 & -v_1 y_w^1 & -v_1 z_w^1 & -v_1\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ x_w^n & y_w^n & z_w^n & 1 & 0 & 0 & 0 & 0 & -u_n x_w^n & -u_n y_w^n & -u_n z_w^n & -u_n \\ 0 & 0 & 0 & 0 & x_w^n & y_w^n & z_w^n & 1 & -v_n x_w^n & -v_n y_w^n & -v_n z_w^n & -v_n \end{bmatrix} \begin{bmatrix} p_{11} \\ p_{12} \\ p_{13} \\ p_{14} \\ p_{21} \\ p_{22} \\ p_{23} \\ p_{24} \\ p_{31} \\ p_{32} \\ p_{33} \\ p_{34} \end{bmatrix} =\begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix} \end{aligned} \end{equation}
可以将其表示为:
\begin{equation} \begin{aligned} A \bold{p} = 0 \end{aligned} \end{equation}
为了使解唯一,我们添加\begin{Vmatrix}p\end{Vmatrix}^2=1的约束,问题转变为:
\begin{equation} \begin{aligned} \mathop{\min}_{\bold{p}} \begin{Vmatrix}A\bold{p}\end{Vmatrix}^2, s.t. \begin{Vmatrix}p\end{Vmatrix}^2=1 \end{aligned} \end{equation}
这个问题可以使用拉格朗日法(Lagrange)来解决,定义拉格朗日函数L(\bold{p},\lambda)=\frac{1}{2} \bold{p}^T A^T A \bold{p} - \frac{1}{2} \lambda(\bold{p}^T \bold{p} - 1)可以通过求解这个方程的最小值来解决等式约束问题,我们对\bold{p}求偏导并令导数为零(最小值点的必要条件):
\begin{equation} \begin{aligned} \nabla_{\bold{p}} L(\bold{p}, \lambda) = A^T A \bold{p} - \lambda \bold{p} = 0 \end{aligned} \end{equation}
求解这个方程即可得到\bold{p},进行重新排列后可以得到参数矩阵P。取出P的前三列构成矩阵,可以得到下述特性:
\begin{equation} \begin{aligned} \begin{bmatrix} p_{11} & p_{12} & p_{13} \\ p_{21} & p_{22} & p_{23} \\ p_{31} & p_{32} & p_{33} \end{bmatrix} =\begin{bmatrix} f_x & 0 & o_x \\ 0 & f_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix} \end{aligned} \end{equation}
上述矩阵可以使用QR分解拆分得到左侧的两个矩阵,包括的相机的内参矩阵和旋转矩阵,在对P的最后一列进行处理,就可以得到\bold{t}
\begin{equation} \begin{aligned} \begin{bmatrix} p_{14} \\ p_{24} \\ p_{34} \end{bmatrix} =\begin{bmatrix} f_x & 0 & o_x \\ 0 & f_y & o_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix} \Rightarrow \bold{t} = K^{-1} \begin{bmatrix} p_{14} \\ p_{24} \\ p_{34} \end{bmatrix} \end{aligned} \end{equation}

1.5 立体视觉标定

在进行后续计算时,我们假定相机的内参(f_x,f_y,o_x,o_y)已知,并且我们从左右两个相机采集的图像中找到了对应的点(手工或通过算法),随后我们通过上述数据估计两个相机的外参矩阵,然后使用相机的内参与外参来计算采集图像的深度图。双目成像的示意图如下所示:


双目相机成像

为了进行相机参数估计,在这里引入了Epipolar Geometry,每个Epipolar Plane由O_l,O_r,P构成。根据三角形约束,我们可以得到下述公式,称为Epipolar Constraint
\begin{equation} \begin{aligned} \bold{n}=\bold{t} \times \bold{x}_l \Rightarrow \bold{x}_l (\bold{t} \times \bold{x}_l) = 0 \end{aligned} \end{equation}
转换成矩阵乘法:
\begin{equation} \begin{aligned} \begin{bmatrix} x_l & y_l & z_l \end{bmatrix} \begin{bmatrix} 0 & -t_z & t_y \\ t_z & 0 & -t_x \\ -t_y & t_x & 0 \end{bmatrix} \begin{bmatrix} x_l \\ y_l \\ z_l \end{bmatrix} = 0 \end{aligned} \end{equation}
根据上述矩阵外参,可以得到:
\begin{equation} \begin{aligned} \begin{bmatrix} x_l \\ y_l \\ z_l \end{bmatrix} = R \begin{bmatrix} x_r \\ y_r \\ z_r \end{bmatrix} + \bold{t} \end{aligned} \end{equation}
将Epipolar Constraint和外参的变换公式结合,可以得到:
\begin{equation} \begin{aligned} \begin{bmatrix} u_l & v_l & 1 \end{bmatrix} z_l K_l^{-T} E K_r^{-1} z_r \begin{bmatrix} u_r \\ v_r \\ 1 \end{bmatrix} &= \\ \begin{bmatrix} u_l & v_l & 1 \end{bmatrix} K_l^{-T} E K_r^{-1} \begin{bmatrix} u_r \\ v_r \\ 1 \end{bmatrix} & = \\ \begin{bmatrix} u_l & v_l & 1 \end{bmatrix} F \begin{bmatrix} u_r \\ v_r \\ 1 \end{bmatrix} & = 0 \end{aligned} \end{equation}

其中F\in\Re^{3 \times 3}矩阵为Fundamental Matrix。对每个像素均有:
\begin{equation} \begin{aligned} \begin{bmatrix} u_l^i & v_l^i & 1 \end{bmatrix} F \begin{bmatrix} u_r^i \\ v_r^i \\ 1 \end{bmatrix} & = 0 \end{aligned} \end{equation}
展开所有公式并重新整理,可以得到:
\begin{equation} \begin{aligned} \begin{bmatrix} u_l^1 u_r^1 & u_l^1 v_r^1 & u_l^1 & v_l^1 u_r^1 & v_l^1 v_r^1 & v_l^1 & u_r^1 & v_r^1 & 1 \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ u_l^n u_r^n & u_l^n v_r^n & u_l^n & v_l^n u_r^n & v_l^n v_r^n & v_l^n & u_r^n & v_r^n & 1 \end{bmatrix} \begin{bmatrix} f_{11} \\ f_{12} \\ f_{13} \\ f_{21} \\ f_{22} \\ f_{23} \\ f_{31} \\ f_{32} \\ f_{33} \end{bmatrix} =\begin{bmatrix} 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix} \end{aligned} \end{equation}
为了保证解的唯一性,我们添加约束\begin{Vmatrix}f\end{Vmatrix}^2=1。通过求解下述优化问题,即可得到Fundamental Matrix,再利用E=K_l^T F K_r来计算相机外参,完成标定:
\begin{equation} \begin{aligned} \mathop{\min}_{\bold{f}} \begin{Vmatrix}A\bold{f}\end{Vmatrix}^2, s.t. \begin{Vmatrix}f\end{Vmatrix}^2=1 \end{aligned} \end{equation}

1.6 立体视觉深度计算

为了解决立体视觉深度计算的问题,我们首先需要知道两个相机采集的图片是怎么匹配的,比如左侧相机的一个像素对应的右侧相机的匹配线是什么样的,这个部分我们也利用Epipolar Geometry来计算投影后的Epipolar Line,如下图红线所示:


Epipolar Line
这个部分的推导还是从Epipolar Constraints开始:

\begin{equation} \begin{aligned} \begin{bmatrix} u_l & v_l & 1 \end{bmatrix} \begin{bmatrix} f_{11} & f_{12} & f_{13} \\ f_{21} & f_{22} & f_{23} \\ f_{31} & f_{32} & f_{33} \end{bmatrix} \begin{bmatrix} u_r \\ v_r \\ 1 \end{bmatrix} = 0 \end{aligned} \end{equation}
展开后可以得到:

\begin{equation} \begin{aligned} (f_{11} u_l + f_{21} v_l + f_{31}) u_r + (f_{12} u_l + f_{22} v_l + f_{32}) v_r + (f_{13} u_l + f_{23} v_l + f_{33}) &= 0 \Rightarrow \\ a_l u_r + b_l v_r + c_l &= 0, \\ a_r u_l + b_r v_l + c_r &= 0 \end{aligned} \end{equation}
上述直线就是Epipolar Line,分别在左右相机的方程。在这个Epipolar Line上找到两个图像的匹配点后(可以使用SIFT等算法进行匹配),我们就要使用三角关系来计算该点的深度了:

\begin{equation} \begin{aligned} \begin{bmatrix} u_l \\ v_l \\ 1 \end{bmatrix} & = \begin{bmatrix} f_x^l & 0 & o_x^l & 0\\ 0 & f_y^l & o_y^l & 0\\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} x_l \\ y_l \\ z_l \\ 1 \end{bmatrix} , \\ \begin{bmatrix} u_r \\ v_r \\ 1 \end{bmatrix} & = \begin{bmatrix} f_x^r & 0 & o_x^r & 0\\ 0 & f_y^r & o_y^r & 0\\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} x_r \\ y_r \\ z_r \\ 1 \end{bmatrix} \end{aligned} \end{equation}

代入相机外参:
\begin{equation} \begin{aligned} \widetilde{u}_l &= K_l T_l \widetilde{x}_r = P_l \widetilde{x}_r \\ \widetilde{u}_r &= M_{int} \widetilde{x}_r \end{aligned} \end{equation}
展开后重新排列可得:
\begin{equation} \begin{aligned} \begin{bmatrix} u_r m_{31} - m_{11} & u_r m_{32} - m_{12} & u_r m_{33} - m_{13} \\ v_r m_{31} - m_{21} & v_r m_{32} - m_{22} & v_r m_{33} - m_{23} \\ u_l p_{31} - p_{11} & u_l p_{32} - p_{12} & u_l p_{33} - p_{13} \\ v_l p_{31} - p_{21} & v_l p_{32} - p_{22} & v_l p_{33} - p_{23} \end{bmatrix} \begin{bmatrix} x_r \\ y_r \\ z_r \end{bmatrix} &= \begin{bmatrix} m_{14} - m_{34} \\ m_{24} - m_{34} \\ p_{14} - p_{34} \\ p_{24} - p_{34} \end{bmatrix} \\ A \begin{bmatrix} x_r \\ y_r \\ z_r \end{bmatrix} &= \bold{b} \end{aligned} \end{equation}

求解方程可得:

\begin{equation} \begin{aligned} \bold{x}_r = (A^T A)^{-1} A^T b \end{aligned} \end{equation}


  1. Camera Calibration | Uncalibrated Stereo ↩︎

  2. Berthold Kalus Paul Horn. Robot Vision. 1986 ↩︎