跳到主要内容

6.1 有限相机模型

来源:Richard Hartley 与 Andrew Zisserman 的 Multiple View Geometry in Computer Vision,第 6 章 Camera Models,6.1 小节 Finite cameras。

这篇是学习笔记,不是原文翻译。目标是把小节里的概念整理成之后做三维重建时能快速查阅的形式。

本节解决的问题

有限相机模型描述的是一个具有有限相机中心的中心投影相机。它把三维空间点映射到二维图像点。

核心问题可以概括为:

三维世界点 X  ->  相机坐标系  ->  归一化成像平面  ->  像素坐标

在齐次坐标下,这个过程最终可以写成一个 3×43 \times 4 的相机矩阵:

x=PX\mathbf{x} = P\mathbf{X}

其中:

  • X\mathbf{X} 是三维世界点的齐次坐标,形如 (X,Y,Z,1)T(X, Y, Z, 1)^T
  • x\mathbf{x} 是二维图像点的齐次坐标,形如 (x,y,1)T(x, y, 1)^T,只在比例意义下确定。
  • PP 是相机投影矩阵。

针孔相机的基本投影

最基础的针孔相机假设相机中心在坐标原点,主轴沿 ZZ 方向,焦距为 ff

三维点 (X,Y,Z)T(X, Y, Z)^T 投影到图像平面:

(X,Y,Z)T(fXZ,fYZ)T(X, Y, Z)^T \mapsto \left(\frac{fX}{Z}, \frac{fY}{Z}\right)^T

直观理解:

  • 点越远,ZZ 越大,成像越靠近主点。
  • 点的横纵坐标会被深度 ZZ 缩放。
  • 这就是透视投影产生“近大远小”的原因。

主点偏移

上面的公式默认图像坐标原点刚好在主点,也就是相机主轴与图像平面的交点。

实际图像中,像素坐标原点通常在左上角,所以需要加入主点偏移:

(X,Y,Z)T(fXZ+px, fYZ+py)T(X, Y, Z)^T \mapsto \left(\frac{fX}{Z} + p_x,\ \frac{fY}{Z} + p_y\right)^T

其中:

  • (px,py)(p_x, p_y) 是主点在图像坐标系中的位置。
  • 它反映“光学中心投影到图像平面的位置”。

内参矩阵 K

把焦距和主点偏移写成矩阵形式,可以得到相机内参矩阵 KK

K=[f0px0fpy001]K = \begin{bmatrix} f & 0 & p_x \\ 0 & f & p_y \\ 0 & 0 & 1 \end{bmatrix}

更接近真实 CCD/CMOS 相机时,x 和 y 两个方向的像素尺度可能不同,因此写成:

K=[αx0x00αyy0001]K = \begin{bmatrix} \alpha_x & 0 & x_0 \\ 0 & \alpha_y & y_0 \\ 0 & 0 & 1 \end{bmatrix}

含义:

  • αx\alpha_x:以 x 方向像素为单位的焦距。
  • αy\alpha_y:以 y 方向像素为单位的焦距。
  • (x0,y0)(x_0, y_0):像素坐标下的主点。

如果考虑像素轴不垂直,还会出现 skew 参数 ss

K=[αxsx00αyy0001]K = \begin{bmatrix} \alpha_x & s & x_0 \\ 0 & \alpha_y & y_0 \\ 0 & 0 & 1 \end{bmatrix}
提示

很多实际相机可以近似认为 s=0s = 0,也就是像素坐标的 x 轴和 y 轴互相垂直。

外参:世界坐标到相机坐标

实际三维点通常先在世界坐标系中表示。相机有自己的坐标系,所以需要一个刚体变换把世界坐标变到相机坐标。

这个变换由旋转 RR 和相机中心 CC 决定:

Xcam=R(XworldC)\mathbf{X}_{cam} = R(\mathbf{X}_{world} - \mathbf{C})

齐次坐标下可以写成:

Xcam=[RRC]Xworld\mathbf{X}_{cam} = \begin{bmatrix} R & -R\mathbf{C} \end{bmatrix} \mathbf{X}_{world}

这里:

  • RR3×33 \times 3 旋转矩阵,表示相机坐标系相对世界坐标系的姿态。
  • C\mathbf{C} 是相机中心在世界坐标系中的位置。
  • RC-R\mathbf{C} 是平移项。
信息

很多资料把外参写成 [Rt][R \mid \mathbf{t}]。在这本书的表达中,t=RC\mathbf{t} = -R\mathbf{C}

有限相机矩阵

把内参和外参合起来,得到有限相机的投影矩阵:

P=K[RRC]P = K \begin{bmatrix} R & -R\mathbf{C} \end{bmatrix}

也常写成:

P=K[Rt]P = K \begin{bmatrix} R & \mathbf{t} \end{bmatrix}

其中 t=RC\mathbf{t} = -R\mathbf{C}

这条公式非常重要,因为三维重建中的很多计算都围绕它展开:

  • 已知 PP 和三维点 X\mathbf{X},可以投影得到图像点 x\mathbf{x}
  • 已知多张图像中的对应点,可以反过来估计相机矩阵或三维点。
  • 标定相机,本质上就是估计内参 KK 和外参 R,tR, \mathbf{t}

参数怎么理解

符号类型含义
KK内参焦距、主点、像素尺度、skew
RR外参相机姿态,也就是旋转
C\mathbf{C}外参相机中心在世界坐标中的位置
t\mathbf{t}外参平移项,满足 t=RC\mathbf{t} = -R\mathbf{C}
PP投影矩阵从三维世界点到二维图像点的整体映射

自由度

一个一般的 3×43 \times 4 投影矩阵有 12 个元素,但齐次矩阵整体乘一个非零尺度不改变投影结果,因此一般 projective camera 有 11 个自由度。

有限相机如果进一步分解成真实相机模型:

P=K[Rt]P = K \begin{bmatrix} R & \mathbf{t} \end{bmatrix}

可以理解为:

  • 内参:通常 5 个自由度,若 s=0s = 0 则更少。
  • 旋转 RR:3 个自由度。
  • 平移或相机中心:3 个自由度。

和三维重建的关系

三维重建要从图像恢复空间结构,而图像是由相机投影产生的。理解有限相机模型后,后面的主题会更容易串起来:

  1. 相机标定:估计 KK
  2. 位姿估计:估计 RRt\mathbf{t}
  3. 三角化:用多个视角的投影射线恢复三维点。
  4. Bundle Adjustment:同时优化相机参数和三维点。
  5. 多视图几何:围绕不同相机之间的投影关系展开。

一个计算流程

实际使用 P=K[Rt]P = K[R \mid \mathbf{t}] 时,可以按下面流程理解:

1. 世界点 X_world
2. 通过 R 和 t 变到相机坐标 X_cam
3. 透视除法:除以深度 Z
4. 通过 K 转成像素坐标
5. 得到图像点 x

对应的公式形式:

Xcam=RXworld+t\mathbf{X}_{cam} = R\mathbf{X}_{world} + \mathbf{t} xnorm=(XcamZcam,YcamZcam,1)T\mathbf{x}_{norm} = \left( \frac{X_{cam}}{Z_{cam}}, \frac{Y_{cam}}{Z_{cam}}, 1 \right)^T xpixel=Kxnorm\mathbf{x}_{pixel} = K\mathbf{x}_{norm}
注意

实现时要特别注意坐标系约定。不同库可能使用不同的相机坐标方向、图像 y 轴方向和外参定义。

本节记忆点

  • 有限相机的中心在有限位置,不在无穷远处。
  • 针孔相机的核心是透视除法:x=fX/Zx = fX/Zy=fY/Zy = fY/Z
  • 主点偏移把理想成像平面坐标转成实际图像坐标。
  • 内参矩阵 KK 管相机内部成像参数。
  • 外参 R,tR, \mathbf{t} 管世界坐标和相机坐标之间的关系。
  • 最重要的公式是:
P=K[RRC]=K[Rt]P = K \begin{bmatrix} R & -R\mathbf{C} \end{bmatrix} = K \begin{bmatrix} R & \mathbf{t} \end{bmatrix}

后续问题

读完 6.1 后,可以继续追问:

  • 如果只知道 PP,如何分解出 KKRRC\mathbf{C}
  • 如何从二维-三维对应点估计 PP
  • 内参矩阵中 skew 参数什么时候不能忽略?
  • 世界点在相机前方还是后方,如何判断?

这些问题会在后续小节和第 7 章继续出现。