相机模型

这里先只讨论相机坐标系下的点:

\[ (X_c,Y_c,Z_c) \]

其中相机光心是原点,\(Z_c\) 表示点到相机的深度。

传感器平面上,主点的物理位置是 \((u_0,v_0)\)。
某个像素在传感器上的物理位置是 \((u_s,v_s)\),单位为 mm。

为了看得直观,可以把成像平面画在相机前方。这样根据相似三角形:

\[ \frac{X_c}{Z_c}=\frac{u_s-u_0}{f} \]

\[ \frac{Y_c}{Z_c}=\frac{v_s-v_0}{f} \]

这里 \(f\) 是焦距,单位也是 mm。

也就是说,真正参与透视关系的不是 \(u_s,v_s\) 本身,而是它们相对于主点的偏移:

\[ \Delta u=u_s-u_0,\qquad \Delta v=v_s-v_0 \]

因为主点对应光轴。一个点偏离光轴多少,才决定它会落在图像的什么位置。


设一个像素在 \(x,y\) 两个方向的物理尺寸分别为:

\[ s_x\ \text{mm/pixel},\qquad s_y\ \text{mm/pixel} \]

像素坐标中的主点为 \((c_x,c_y)\)。因此,像素 \((x,y)\) 相对主点的偏移,换算到物理长度后为:

\[ u_s-u_0=s_x(x-c_x) \]

\[ v_s-v_0=s_y(y-c_y) \]

代回相似三角形:

\[ \frac{X_c}{Z_c}=\frac{s_x(x-c_x)}{f} \]

\[ \frac{Y_c}{Z_c}=\frac{s_y(y-c_y)}{f} \]

定义以 pixel 为单位的焦距:

\[ f_x=\frac{f}{s_x},\qquad f_y=\frac{f}{s_y} \]

于是:

\[ \boxed{ \frac{X_c}{Z_c}=\frac{x-c_x}{f_x} } \]

\[ \boxed{ \frac{Y_c}{Z_c}=\frac{y-c_y}{f_y} } \]

这两个式子说明:像素坐标先减去主点,再除以焦距,就得到了相机坐标中点的方向。


把上面两个式子写成向量:

\[ \begin{bmatrix} X_c/Z_c\\ Y_c/Z_c\\ 1 \end{bmatrix} = \begin{bmatrix} \dfrac{x-c_x}{f_x}\\[4pt] \dfrac{y-c_y}{f_y}\\[4pt] 1 \end{bmatrix} \]

现在希望找一个矩阵,使它乘上像素齐次坐标

\[ \begin{bmatrix}x\\y\\1\end{bmatrix} \]

后,正好得到上面的归一化相机坐标。由右边的形式可直接写出:

\[ K^{-1}= \begin{bmatrix} \dfrac1{f_x}&0&-\dfrac{c_x}{f_x}\\[6pt] 0&\dfrac1{f_y}&-\dfrac{c_y}{f_y}\\[6pt] 0&0&1 \end{bmatrix} \]

所以,\(K^{-1}\) 负责把像素坐标变成归一化相机坐标。

既然它叫 \(K^{-1}\),那么它的逆矩阵就是内参矩阵 \(K\):

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

也就是说,\(K\) 的作用正好相反:把归一化相机坐标变成像素坐标。

把像素的齐次坐标乘进去:

\[ K^{-1} \begin{bmatrix} x\\y\\1 \end{bmatrix} = \begin{bmatrix} \dfrac{x-c_x}{f_x}\\[6pt] \dfrac{y-c_y}{f_y}\\[6pt] 1 \end{bmatrix} = \begin{bmatrix} X_c/Z_c\\ Y_c/Z_c\\ 1 \end{bmatrix} \]

所以:

\[ \boxed{ \begin{bmatrix} X_c\\ Y_c\\ Z_c \end{bmatrix} = Z_cK^{-1} \begin{bmatrix} x\\y\\1 \end{bmatrix} } \]

注意:只知道一个像素 \((x,y)\) 时,\(Z_c\) 仍然未知。因此 \(K^{-1}[x,y,1]^T\) 得到的是一条从相机光心出发的方向;给定深度 \(Z_c\) 后,才能得到唯一的三维点。