本文将介绍,如何将世界坐标系中的一个三维点映射为图像中的一个像素坐标。

只有了解了这个映射过程,才能明白相机标定究竟在干什么。

齐次坐标

在开始之前,我们得先简单回顾一下齐次坐标。简单来说,齐次坐标就是用 n+1n+1 维坐标系来描述 nn 维空间,并且具有如下特殊的等价关系:

[x1x2xn+1][λx1λx2λxn+1]\begin{bmatrix} x_1 \\ x_2 \\ \vdots \\ x_{n+1} \end{bmatrix} \sim \begin{bmatrix} \lambda x_1 \\ \lambda x_2 \\ \vdots \\ \lambda x_{n+1} \end{bmatrix}

其中 λR\lambda \in \mathbb{R}λ0\lambda \neq 0

注意这里的 \sim 表示齐次等价:两个坐标相差任意非零尺度时,可以认为它们表示的是同一个点。例如,(x,y,1)T(x,y,1)^T(Zx,Zy,Z)T(Zx,Zy,Z)^TZ0Z\neq0 时是等价的齐次坐标。

有很多 nn 维的问题转换为 n+1n+1 维以后,反而会变得更加简单。

坐标变换

在整个坐标变换的过程中,我们涉及的坐标系分别是:世界坐标系、相机坐标系和像素坐标系。

我们记

Xw=[XwYwZw]T\begin{equation} \bm{X_{\text{w}}} = \begin{bmatrix} X_{\text{w}} & Y_{\text{w}} & Z_{\text{w}} \end{bmatrix} ^T \end{equation} X~w=[XwYwZw1]T\begin{equation} \bm{\tilde{X}_{\text{w}}} = \begin{bmatrix} X_{\text{w}} & Y_{\text{w}} & Z_{\text{w}} & 1 \end{bmatrix}^T \end{equation}

为同一点在世界坐标系下的坐标,

Xc=[XcYcZc]T\begin{equation} \bm{X_{\text{c}}} = \begin{bmatrix} X_{\text{c}} & Y_{\text{c}} & Z_{\text{c}} \end{bmatrix} ^T \end{equation} X~c=[XcYcZc1]T\begin{equation} \bm{\tilde{X}_{\text{c}}} = \begin{bmatrix} X_{\text{c}} & Y_{\text{c}} & Z_{\text{c}} & 1 \end{bmatrix}^T \end{equation}

为点在相机坐标系下的坐标,

Xi=[xy]T\begin{equation} \bm{X_{\text{i}}} = \begin{bmatrix} x & y \end{bmatrix} ^T \end{equation} X~i=[xy1]T\begin{equation} \bm{\tilde{X}_{\text{i}}} = \begin{bmatrix} x & y & 1 \end{bmatrix} ^T \end{equation}

为该点在图像平面上的投影,在像素坐标系下的坐标。

其中带波浪号(tilde)的记号(如 X~w\bm{\tilde{X}_{\text{w}}})表示齐次坐标,不带波浪号的表示相应的非齐次坐标。

一些教材会在图像平面内再引入一个以物理单位(如毫米)度量的图像坐标系,它与像素坐标系之间还相差一次仿射变换。为了方便,本文并不会引入它,而是直接在像素坐标系下推导,这个过程产生的系数会被吸收进后文内参 fx,fyf_x, f_y 的定义中。

要将点从世界坐标系映射到像素坐标系,我们需要如下两次映射:

  • 世界坐标映射为相机坐标,即 XwXc\bm{X_{\text{w}}} \mapsto \bm{X_{\text{c}}}
  • 相机坐标映射为像素坐标,即 XcXi\bm{X_{\text{c}}} \mapsto \bm{X_{\text{i}}}

接下来我们将分别讨论这两次变换分别在做什么。

世界到相机的变换

世界坐标到相机变换的过程,实际上是在描述相机相对于世界坐标系的姿态。这个变换可由一个 3×33\times3 的旋转矩阵 RR 与一个平移向量 t\bm{t} 表示:

Xc=RXw+t\begin{equation} \bm{X_{\text{c}}} = R \bm{X_{\text{w}}} + \bm{t} \end{equation}

这里的 RRt\bm{t} 将世界坐标变换到相机坐标。

这样写未免过于繁琐,我们可以利用齐次坐标让它变得更加简洁:

X~c=[Rt0T1]X~w\begin{equation} \bm{\tilde{X}_{\text{c}}} = \begin{bmatrix} R & \bm{t} \\ \bm{0}^T & 1 \end{bmatrix} \bm{\tilde{X}_{\text{w}}} \end{equation}

相机到像素的变换

该变换则是将相机坐标系下的一个三维点映射到像素坐标系下的一个二维点。利用齐次坐标,这个过程可以用 3×43\times4 投影矩阵 PP 表示:

X~iPX~c\begin{equation} \bm{\tilde{X}_{\text{i}}} \sim P \bm{\tilde{X}_{\text{c}}} \end{equation}

其中

P=[K0]=[fxscx00fycy00010]\begin{equation} P=\left[ K \mid \bm{0} \right] = \begin{bmatrix} f_x & s & c_x & 0 \\ 0 & f_y & c_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \end{equation}

这之中的 KK 是上三角 3×33\times3 矩阵,被称为内参矩阵

K=[fxscx0fycy001]\begin{equation} K = \begin{bmatrix}f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \end{equation}

内参矩阵 KK 记录了相机的内部参数。其中 fx,fyf_x,f_y 是以像素为单位的两个轴向尺度,ss 是坐标轴倾斜(skew)参数(大部分相机通常可近似取 s=0s=0),(cx,cy)(c_x,c_y) 是主点。

为了探究 KK 为什么长这个样子,我们可以从针孔相机模型出发。

根据针孔相机模型,相机坐标到像素坐标的映射为

x=fxXcZc+sYcZc+cx\begin{equation} x = f_x \frac{X_{\text{c}}}{Z_{\text{c}}} + s\frac{Y_{\text{c}}}{Z_{\text{c}}} + c_x \end{equation} y=fyYcZc+cy\begin{equation} y = f_y \frac{Y_{\text{c}}}{Z_{\text{c}}} + c_y \end{equation}

由于上面两个式子都有除以 ZcZ_{\text{c}} 的操作,该映射在欧氏坐标下不是线性的;但在齐次坐标下,它却可以被线性表示:

[xy1][ZcxZcyZc]=[fxXc+sYc+cxZcfyYc+cyZcZc]=[fxscx0fycy001][XcYcZc]\begin{equation} \begin{bmatrix}x \\ y \\ 1 \end{bmatrix} \sim \begin{bmatrix}Z_{\text{c}}x \\ Z_{\text{c}}y \\ Z_{\text{c}} \end{bmatrix} = \begin{bmatrix}f_x X_{\text{c}} + sY_{\text{c}} + c_x Z_{\text{c}} \\ f_y Y_{\text{c}} + c_y Z_{\text{c}} \\ Z_{\text{c}} \end{bmatrix} = \begin{bmatrix}f_x & s & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix}X_{\text{c}} \\ Y_{\text{c}} \\ Z_{\text{c}} \end{bmatrix} \end{equation}

这个公式对应的,正是

X~iKXc\begin{equation} \bm{\tilde{X}_{\text{i}}}\sim K\bm{X_{\text{c}}} \end{equation}

(这个式子可以视为 X~iPX~c\bm{\tilde{X}_{\text{i}}}\sim P\bm{\tilde{X}_{\text{c}}} 的变体。)

Xc\bm{X_{\text{c}}} 则可以通过 X~w\bm{\tilde{X}_{\text{w}}} 得到:

Xc=[Rt]X~w\begin{equation} \bm{X_{\text{c}}} = \begin{bmatrix} R | \bm{t} \end{bmatrix} \bm{\tilde{X}_{\text{w}}} \end{equation}

将上述两式结合起来,还可以得到另一个变种的式子:

X~iK[Rt]X~w\begin{equation} \bm{\tilde{X}_{\text{i}}} \sim K \begin{bmatrix} R | \bm{t} \end{bmatrix} \bm{\tilde{X}_{\text{w}}} \end{equation}

该式在下一篇的张正友标定法中将会用到。

相机标定

相机标定是指根据一组已知的世界点与其图像投影之间的对应关系,估计内参 KK、每个视角的外参 R,tR,\bm{t},以及实际镜头所需的畸变参数。下一篇将介绍最流行的相机标定方法之一:张正友标定法。