相机模型
这里先只讨论相机坐标系下的点:
\[ (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\) 后,才能得到唯一的三维点。