Pinhole camera model

针孔相机(pinhole camera)是SLAM中大多数相机所采用的标准模型。来自三维点的光线穿过一个小孔(光心,optical centre)并投影到图像平面上。该模型描述的是图像投影(image projection):三维世界中的一个点如何映射到二维像素。

坐标系

涉及四个坐标系:

  1. 世界坐标系(World frame) Xw=[Xw,Yw,Zw]T\mathbf{X}_w = [X_w, Y_w, Z_w]^T:固定的参考坐标系。
  2. 相机坐标系(Camera frame) Xc=[Xc,Yc,Zc]T\mathbf{X}_c = [X_c, Y_c, Z_c]^TZcZ_c 是光轴方向(向前)。
  3. 图像平面(Image plane) x=[x,y]T\mathbf{x}' = [x', y']^T:图像平面上的度量坐标。
  4. 像素坐标系(Pixel frame) u=[u,v]T\mathbf{u} = [u, v]^T:离散的像素坐标。

通常的约定是 XcX_c 指向右方,YcY_c 指向下方,ZcZ_c 指向前方——这与像素坐标 uu(向右)、vv(向下)相匹配,原点位于图像的左上角。

投影流程

第一步:世界坐标到相机坐标。 刚体变换(外参,extrinsic parameters)将世界坐标点转换到相机坐标系:

Xc=RXw+t\mathbf{X}_c = R\mathbf{X}_w + \mathbf{t}

第二步:相机坐标到图像平面(透视除法,perspective division)。

x=XcZc,y=YcZcx' = \frac{X_c}{Z_c}, \qquad y' = \frac{Y_c}{Z_c}

这种对深度的除法正是透视效应的来源——也正是使视觉几何变得有趣的那种非线性性的来源。坐标 (x,y)(x', y') 被称为归一化坐标(normalized coordinates):它们是一个像素在剔除内参之后所剩下的东西,大多数几何推导(本质矩阵、三角化)在这个坐标系下最为简洁。

第三步:图像平面到像素坐标(内参,intrinsic parameters)。

u=fxx+cx,v=fyy+cyu = f_x \cdot x' + c_x, \qquad v = f_y \cdot y' + c_y

其中 fx,fyf_x, f_y 是以像素为单位的焦距,(cx,cy)(c_x, c_y) 是主点(principal point)。像素焦距把以毫米为单位的物理焦距 ff 与像素尺寸联系起来:fx=f/(像素宽度)f_x = f / (\text{像素宽度}),这也是为什么当像素不是正方形时 fxfyf_x \neq f_y

矩阵形式

将所有步骤组合在齐次坐标下:

Zc[uv1]=[fx0cx0fycy001]K[Rt][XwYwZw1]Z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \underbrace{\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}}_{\mathbf{K}} \begin{bmatrix} R & \mathbf{t} \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}

矩阵 K\mathbf{K}相机内参矩阵(camera intrinsic matrix),而 P=K[Rt]P = \mathbf{K}[R|\mathbf{t}]3×43 \times 4相机投影矩阵(camera projection matrix)。在一般情形下,K\mathbf{K} 还包含一个倾斜参数(skew,对现代相机通常为零)。

该流程的一个直接的 NumPy 翻译:

import numpy as np

def project(K, R, t, X_w):
    X_c = R @ X_w + t          # world -> camera
    x_n = X_c[:2] / X_c[2]     # perspective division (normalized coords)
    u   = K[0, 0] * x_n[0] + K[0, 2]
    v   = K[1, 1] * x_n[1] + K[1, 2]
    return np.array([u, v])

反投影:逆过程是一条射线

投影会丢失一个维度:一个像素并不能确定一个三维点,只能确定一条射线(ray)。给定像素 u\mathbf{u},其在相机坐标系中可能对应的三维点所构成的射线为

Xc(λ)=λK1[uv1],λ>0\mathbf{X}_c(\lambda) = \lambda\,\mathbf{K}^{-1}\begin{bmatrix}u\\v\\1\end{bmatrix}, \qquad \lambda > 0

恢复缺失的深度 λ\lambda,正是三角化(多视图)、立体视觉(第二个已标定的相机)或深度传感器所提供的功能。视场角(field of view)可以由同样的几何关系得出:对于图像宽度 WWFoVx=2arctan ⁣(W2fx)\mathrm{FoV}_x = 2\arctan\!\big(\tfrac{W}{2f_x}\big)

常见陷阱

对SLAM的意义

该模型定义的投影函数 π()\pi(\cdot) 是每一个视觉SLAM系统的核心:光束法平差(bundle adjustment)中最小化的重投影误差 e=zπ(TX)\mathbf{e} = \mathbf{z} - \pi(T\mathbf{X}),说穿了就是”用针孔模型投影地图点,再与测量得到的像素比较”。三角化、PnP 和对极几何都是从同一个方程推导而来,因此从零开始推导这一整套流程,是这一阶段最值得做的练习。

相关条目