摄像机几何与极几何

摄像机几何

针孔模型

考虑最初的成像模型,我们会利用小孔成像来记录现实世界。经过小孔成像模型,来自场景的光线可以经过小孔打到胶片上,而不会受到其他位置光线的干扰。而针孔摄像机就是一种类似小孔成像的模型,它的物理模型可以参考下图:

其中,针孔到像平面的距离被称为针孔摄像机的焦距\(f\)。注意到小孔成像成的是倒立的实像,而为了坐标处理的方便,我们通常会考虑对应的虚拟像平面,这样就不用处理繁琐的坐标符号问题,而是可以专注于其他更加重要的逻辑。因此如果没有特殊说明,我们考虑的都是这个虚拟像平面。

在整个摄像机几何中,一个非常重要的问题就是如何将真实世界中的某个点映射到成像平面中,例如下图,我们考虑的问题就是在摄像机坐标系中如何完成从\(P\)点到\(P'\)点的映射。注意这里两个点都是在相机坐标系下进行描述,其中k轴表示深度,在更常用的xyz坐标系中对应z轴。

假定\(P\)点的坐标为\((x, y, z)\)\(P'\)的坐标为\((x', y')\)。这里在像平面上的点,我们更加关注它的xy坐标。通过简单的相似三角形,我们很容易得到下面的对应关系: \[ P = \begin{bmatrix} x \\ y \\ z \\ \end{bmatrix} \rightarrow P' = \begin{bmatrix} x' \\ y' \\ \end{bmatrix} \quad x' = f\frac{x}{z} ,\quad y' = f\frac{y}{z} \] 这也就是在针孔摄像机的工作原理下,相机坐标系中场景的点与成像点之间坐标的映射关系。

透镜

接下来我们介绍透镜。在介绍透镜之前,我们需要介绍光圈。光圈尺寸实际对应的就是成像小孔的大小,光圈越大,对应小孔越大,成的像就会越模糊;光圈越小,对应小孔越小,成像虽然越清晰,但是亮度也越来越暗。为了解决这个问题,我们可以引入透镜,因为透镜可以做到光线的汇聚,它将多条光线汇聚到胶片的同一个点上,可以增加亮度。

透镜的物理性质就是对光线进行汇聚,其中所有平行于光轴的光线都会会聚到焦点上。焦点到透镜中心的距离称为透镜的焦距。这里需要注意区分透镜的焦距和针孔相机的焦距,这两者指的并不是同一个概念,需要结合上下文具体分析,在摄像机几何的语境下,我们说到焦距,更多地指的是相机的焦距。根据透镜的折射规律,一个点经过折射后汇聚的点,可以通过连接该点和光心得到,因此在实际分析时,我们仍然可以使用上面针孔摄像机得到的映射模型。

虽然引入透镜解决了光圈的问题,并且仍然可以使用针孔摄像机的映射模型,但是引入透镜也会带来一些实际的问题。

第一个问题是失焦。由于透镜具有自己的焦距,只有在焦距对应深度左右范围内成的像是清晰的,其他位置成的像则会变得模糊。对应这种现象,我们有一个景深的概念。在许多摄影作品中,我们都可以看到景深的效果。

第二个问题是径向畸变。径向畸变指的是经过成像之后,图像像素点以畸变中心为中心点,沿着径向产生的位置偏差,从而导致图像中所成的像发生形变。径向畸变根据畸变方向又可以分为枕形畸变和桶形畸变。下图就是一个径向畸变的照片表现。另外一个径向畸变的例子是门上的猫眼,通过猫眼看外面的景象,会有类似鱼眼的效果。径向畸变产生的原因是光线在远离透镜中心的地方比靠近中心的地方更加弯曲。

摄像机几何

图片坐标系引入

通过对针孔模型的分析,我们得到了在相机坐标系中,场景坐标到像平面坐标的映射关系。接下来进一步,我们将引入图片坐标系。对于一张图片来说,我们通常会使用图片坐标系,该坐标系如下图所示,以像素为单位。图片坐标系以图片的左下角为原点建立xy轴。

可以注意到,相机坐标系的原点即光心,在图片坐标系中的投影是带有一定的偏差的,因此在转换时,需要进行偏差的处理,即这里的\((c_x, c_y)\),以像素为单位。另一方面,相机坐标系的单位是长度(基本单位为m),而在图片坐标系中,单位是像素,因此我们还需要引入一个比例转换,将长度转化为像素。这个转换比例沿着xy轴可能有所不同,在下面的式子中分别以\(k,l\)来表示。

综合整个流程,我们将相机坐标系下场景中的某个点\(P_c(x,y,z)\)映射到图片坐标系下,有如下的映射关系: \[ (x, y, z) \rightarrow (fk\frac{x}{z} + c_x,fl\frac{y}{z} + c_y) = (\alpha\frac{x}{z} + c_x, \beta\frac{y}{z} + c_y) \] 其中,\(f\)表示相机的焦距,\(k,l\)表示沿着x,y轴的长度与像素的比例,\(k,l\)的单位是\(\text{pixel/m}\),表示一个长度单位可以转化为多少个像素。具体来说,如果知道相机传感器的物理尺寸(宽度和高度)以及它的分辨率(像素数量),就可以算出单位长度内像素的数量。

为了方便起见,我们可以将参数进行整合,即: \[ \alpha = fk,\quad \beta = fl \] 在一些场景中,我们还可能见到这样的简化: \[ f_x = fk, \quad f_y = fl \] 那么此时仍然需要注意这里的\(f_x,f_y\)指的是相机焦距在像素坐标系中的表示,以像素为单位。

上面我们得到了新的映射模型,它帮助我们将场景点在相机坐标系下的坐标映射到图像坐标系下的坐标表示。但是上面的式子不利于我们后续的处理,这里我们将其转化为齐次坐标的表达形式(包括相机坐标系下的三维表示和图像坐标系下的二维表示都转化为齐次坐标),那么映射关系就可以表示为下面的式子 \[ P_i = \begin{bmatrix} \alpha x + c_xz \\ \beta y + c_yz \\ z \end{bmatrix} = \begin{bmatrix} \alpha & 0 & c_x & 0\\ 0 & \beta & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix} = \begin{bmatrix} \alpha & 0 & c_x & 0\\ 0 & \beta & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} P_c \] 这里还需要提到一个摄像机偏斜的问题。在理想情况下,图像坐标系以左下点为原点,xy轴分别垂直。但是由于制造工艺的问题,实际对应的时候可能会出现偏斜,即图像坐标系中xy轴并不垂直,而是具有一个夹角\(\theta \neq 90\)度。

此时,上面的齐次坐标形式的映射关系就需要进行改写,改写之后变成下面的样子: \[ P_i = \begin{bmatrix} \alpha & -\alpha \cot \theta & c_x & 0\\ 0 & \beta / \sin \theta & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix} =\begin{bmatrix} \alpha & -\alpha \cot \theta & c_x & 0\\ 0 & \beta / \sin \theta & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} P_c \] 进一步,我们可以将公式写成下面的分块形式: \[ P_i = \begin{bmatrix} \alpha & -\alpha \cot \theta & c_x & 0\\ 0 & \beta / \sin \theta & c_y & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix} = MP_c = K[I, 0]P_c, \quad K = \begin{bmatrix} \alpha & -\alpha \cot \theta & c_x\\ 0 & \beta / \sin \theta & c_y \\ 0 & 0 & 1 \\ \end{bmatrix} \] 其中矩阵\(K\)就是我们常说的相机内参。内参决定了摄像机坐标系下空间点到图像点的映射。可以看到相机内参\(K\)一共具有5个自由度。

世界坐标系引入

上面我们引入图片坐标系后,已经得到了相应的映射模型,它能够将相机坐标系下的场景坐标映射到图片坐标系中。注意到这里场景坐标仍然是使用相机坐标系,因此接下来最后一步,我们需要引入世界坐标系。最终,我们需要得到一个从世界坐标系到图片坐标系的映射关系。

由于相机坐标系和世界坐标系同样属于3维坐标系,它们之间的转换只需要旋转和平移即可。我们可以将世界坐标系经过旋转\(R\)和平移\(t\)得到相机坐标系,其中旋转矩阵\(R\)是一个\(3 \times 3\)的矩阵,平移向量\(t\)是一个\(1\times 3\)的向量,它们表示相机坐标系相对世界坐标系的旋转和平移。因此引入世界坐标系后,映射公式可以如下表示: \[ P_i =K \begin{bmatrix} I & 0 \\ \end{bmatrix}\begin{bmatrix} R & t \\ 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} =K \begin{bmatrix} I & 0 \\ \end{bmatrix}\begin{bmatrix} R & t \\ 0 & 1 \\ \end{bmatrix} P_w = K [R|t] P_w \] 这里的\([R|t]\)是一个\(3\times 4\)​的矩阵,通常被称为相机外参

有时候,说到相机外参可能指的是\(4 \times 4\)的形式,那时候只需要在\([R|t]\)下补充一行\([0,0,0,1]\)即可。

相机外参在不同情况下可能指代不同的形式,需要结合环境讨论。但是它们都代表这里提到的含义,根据维度判断,并不会出现歧义。

那么最终我们就可以得到一个投影矩阵,它可以在齐次表示的情况下,将世界坐标系中的场景坐标映射到图片坐标系中的像素坐标: \[ M = K[R|t] \] 由于\(K\)具有5个自由度,\(R\)具有3个自由度,\(t\)​​具有三个自由度,因此整体的投影矩阵具有11个自由度。

最终我们得到如下的映射公式(以及带维度表示): \[ \begin{aligned} P_i &= K[R|t] P_w\\ P_i^{3\times 1} &= K^{3\times 3} [R^{3\times 3}|t^{3\times 1}]^{3\times 4}P_w^{4\times 1} \end{aligned} \]

投影以及投影矩阵

上面我们可以得到一个投影矩阵\(M\),接下来我们对其一些性质进行讨论。首先作如下变换: \[ M = K\begin{bmatrix} R & t \\ \end{bmatrix}= \begin{bmatrix} KR & Kt \\ \end{bmatrix}=\begin{bmatrix} A & b \\ \end{bmatrix},\quad A = \begin{bmatrix} a_1^T \\ a_2^T \\ a_3^T \\ \end{bmatrix} \]

  • \(M\)是透视投影矩阵的一个充分必要条件是\(\det(A) \neq 0\)
  • \(M\)是零倾斜透视投影矩阵的一个充分必要条件是\(\det(A) \neq 0\)且满足:

\[ (a_1\cdot a_3)\cdot(a_2\cdot a_3) = 0 \]

  • \(M\)是零倾斜且宽高比为1的透视投影矩阵的一个充分必要条件是\(\det(A) \neq 0\)​且满足:

\[ \left\{\begin{matrix} (a_1 \times a_3) \cdot (a_2 \times a_3) = 0\\ (a_1 \times a_3) \cdot (a_1 \times a_3) = (a_2 \times a_3) \cdot (a_2 \times a_3) \end{matrix}\right. \]

这里我们还补充一些透视投影变换的性质,包括点投影为点、线投影为线、近大远小、角度不再保持、平行线相交等。

在实际过程中,我们获取相机参数则可以通过相机标定的方式来完成。相机标定主要是通过对相机标定装置进行拍摄,人为找到3D空间与照片之间的对应点,通过多组对应点来构造多组方程,再通过求解方程组来得到相机参数。

概念补充

平面和空间的变换

下面我们主要介绍在平面和空间中的一些常见变换,包括等距变换、相似变换、仿射变换、透视变换等。我们知道在坐标系的表达下,变换Transform可以通过矩阵的形式来表示,因此各种变换的重点也就在于矩阵的不同。并且下面的介绍统一都是使用齐次坐标的形式来表示的。

2D平面上的变换

  • 等距变换

首先考虑等距变换。等距变换是一种最简单的变换,在变换前后可以保持距离不变。等距变换可以通过旋转矩阵\(R_{2\times 2}\)与平移向量\(t_{2\times 1}\)来表示。假设某个点在原来的坐标系上坐标为\(\mathbf{x}\),经过变换之后的坐标变成了\(\mathbf{x}'\),那么它们之间的关系如下: \[ \mathbf{x}' = \begin{bmatrix} R & t \\ 0 & 1 \\ \end{bmatrix} \mathbf{x} = H_e\mathbf{x} \] 等距变换共有3个自由度:旋转角度+沿两个轴的平移长度。

  • 相似变换

相似变换可以保持图形相似,在变换前后能够保持两直线的夹角、长度的比值、面积的比值不变。相似变换是等距变换和均匀缩放变换的合成,均匀缩放变换可以由下面的矩阵来表示: \[ \mathbf{x}' = \begin{bmatrix} s & 0 & 0 \\ 0 & s & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \mathbf{x} \] 因此整个相似变换坐标前后关系为: \[ \mathbf{x}' = \begin{bmatrix} sR & t \\ 0 & 1 \\ \end{bmatrix} \mathbf{x} = H_s\mathbf{x} \] 缩放变换共有4个自由度:旋转角度+沿两个轴的平移长度+缩放比例。

  • 仿射变换

仿射变换前后保持平行性不变、面积的比值不变、平行线段长度的比值不变。一个矩形经过仿射变换之后会变成平行四边形。仿射变换如下: \[ \mathbf{x}' = \begin{bmatrix} a & b & x_0 \\ c & d & y_0 \\ 0 & 0 & 1 \\ \end{bmatrix} \mathbf{x},\quad \mathbf{x}' = \begin{bmatrix} A & t \\ 0 & 1 \\ \end{bmatrix} \mathbf{x} = H_a \mathbf{x} \] 仿射变换一共有6个自由度。

  • 透视变换

透视变换前后保持四共线点的交比不变。透视变换如下: \[ \mathbf{x}' = \begin{bmatrix} a & b & x_0 \\ c & d & y_0 \\ v_1 & v_2 & 1 \\ \end{bmatrix} \mathbf{x},\quad \mathbf{x}' = \begin{bmatrix} A & t \\ v^T & 1 \\ \end{bmatrix} \mathbf{x} = H_a \mathbf{x} \] 透视变换一共有8个自由度。

3D空间中的变换

  • 相似变换

3D空间中的相似变换保持点变换到点、线变换到线;保持点点共线(面)性、线的共面性;保持直线与直线、直线与平面、平面与平面的平行性不变;保持角度不变等。变换公式如下,其中\(R_{3\times 3}\)表示旋转矩阵,\(t_{3\times1}\)表示平移向量。 \[ \mathbf{x}' = \begin{bmatrix} sR & t \\ 0 & 1 \\ \end{bmatrix} \mathbf{x} \] 3D空间中的相似变换一共有7个自由度:绕3个轴的旋转+沿3个轴的平移+缩放比例。

  • 仿射变换

3D空间中的仿射变换保持无穷远平面不变(无穷远点变换到无穷远点),保持直线与直线、直线与平面、平面与平面的平行性不变。变换公式如下: \[ \mathbf{x}' = \begin{bmatrix} A_{3\times 3} & t_{3\times 1} \\ 0_{1\times 3} & 1_{1\times 1} \\ \end{bmatrix} \mathbf{x} \] 3D空间中的仿射变换一共有12个自由度:\(A\)中包含9个,\(t\)中包含3个。

  • 透视变换

3D空间中的透视变换保持点变换到点、线变换到线,并且保持点的共线(面)性、线的共面性。变换公式如下: \[ \mathbf{x}' = \begin{bmatrix} A_{3\times 3} & t_{3\times 1} \\ v_{1\times 3} & 1_{1\times 1} \\ \end{bmatrix} \mathbf{x} \] 3D空间中的透视变换一共有15个自由度:\(A\)中包含9个,\(t\)中包含3个,\(v\)中包含3个。

平面和空间的无穷远

在前面空间中的变换时,我们提到无穷远的概念。接下来就介绍在平面和空间中的无穷远。

首先进行无穷远的定义。无穷远包括无穷远点、无穷远线、无穷远面。在引入无穷远之后,我们说平行线在无穷远点处相交、两个平行平面的交线是无穷远线。它们本身保持类似普通点线面的定义,即无穷远点在无穷远线上,无穷远线在无穷远面上。

考虑平面中的无穷远,直线的解析方程为\(ax+by+c=0\),在齐次坐标中有如下表示,其中\(a,b\)决定了直线的方向,而\(\mathbf{l}\)就可以代表这条直线。 \[ \mathbf{l} = \begin{bmatrix} a \\ b \\ c \end{bmatrix}, \mathbf{x} = \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} \quad \text{那么}\mathbf{x} \in \mathbf{l} \text{就对应} \mathbf{l}^T\mathbf{x} = 0 \] 而无穷远点是平行线的交点,而两条直线的交点可以通过直线向量进行叉乘得到,因此有: \[ \mathbf{l} = \begin{bmatrix} a \\ b \\ c \end{bmatrix}, \mathbf{l}' = \begin{bmatrix} a \\ b \\ c' \end{bmatrix}, \quad \text{交点}\mathbf{x}_{\infty} = \mathbf{l} \times \mathbf{l}' = \begin{bmatrix} b \\ -a \\ 0 \end{bmatrix} \] 其中,两个向量叉乘可以转化为矩阵和向量之间的乘法: \[ p\times q = \begin{bmatrix} 0 & -p_z & p_y \\ p_z & 0 & -p_x \\ -p_y & p_x & 0 \\ \end{bmatrix} \begin{bmatrix} q_x \\ q_y \\ q_z \end{bmatrix} = [p_{\times}]q \] 通过上面的计算,我们可以定义在平面中的无穷远点就是齐次坐标下最后一维为0的点。并且对于一组平行线与其对应的无穷远点,无穷远点的前两维度实际上就代表了这组平行线的方向,这点可以在后续3维空间中的推广中使用到。于是2D空间中的无穷远点就有如下表示: \[ \mathbf{x}_{\infty} = \begin{bmatrix} x_1 \\ x_2 \\ 0 \end{bmatrix} \] 所有的无穷远点都位于无穷远线上,因此2D空间中的无穷远线就有如下表示: \[ \mathbf{l}_{\infty} = \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} \] 下面开始向3维空间中进行推广。

在3维空间中,假设直线的方向向量是\(d = [a, b, c]^T\),那么这组平行线对应的无穷远点就是\(\mathbf{x}_{\infty} = [a, b, c, 0]^T\),与在2D空间中具有相同的性质。即: \[ \mathbf{x}_{\infty} = \begin{bmatrix} x_1 \\ x_2 \\ x_3 \\ 0 \end{bmatrix} \] 在3维空间中有很多无穷远线,每一组平行的平面就会在一条无穷远线上相交,所有的无穷远线构成无穷远面。那么3维空间中的无穷远面具有如下表示: \[ \Pi_{\infty} = \begin{bmatrix} 0 \\ 0 \\ 0 \\ 1 \end{bmatrix} \]

影消点与影消线

影消点和影消线是图片坐标系中的概念,因此单位是像素。它们本身是图片坐标系中确定的点和确定的线,只不过是由空间中的无穷远点和无穷远线投影而来。

影消点指的是三维空间中的无穷远点在图像平面上的投影点。考虑\(v\)为影消点坐标,\(X_{\infty}\)为相机坐标系下的无穷远点,它对应一组平行线,方向为\(d=[a, b, c]^T\),相机的内参矩阵为\(K\),那么则有: \[ X_{\infty} = \begin{bmatrix} a \\ b \\ c \\ 0 \end{bmatrix},\quad v = K \begin{bmatrix} I & 0 \end{bmatrix}\begin{bmatrix} a \\ b \\ c \\ 0 \end{bmatrix} = K\begin{bmatrix} a \\ b \\ c \end{bmatrix} = Kd \] 因此可以推出: \[ d = \frac{K^-1v}{||K^-1v||} \] 这表示如果我们知道(图片坐标系下)影消点的坐标,就可以得到三维空间(相机坐标系下)中的对应一组平行线的方向。

影消线则是三维空间中的无穷远线在图像平面上的投影线。考虑3维空间中的一个平面\(\Pi = [a, b, c, d]^T\),它的法向量为\(\mathbf{n}_{3\times 1} = [a, b, c]^T\),它与无穷远平面会相交于无穷远直线\(\mathbf{l}_{\infty}\)上,这个无穷远直线投影到成像平面上,在图像坐标系中得到影消线\(\mathbf{l}_{h}\)。考虑相机坐标系中的一个点\(P\),它满足如下关系: \[ \begin{aligned} \text{该点在3维空间的平面上:}\quad &\Pi^TP = 0 \\ \text{该点投影之后在影消线上:}\quad & \mathbf{l}_h^TK[I|0]P = 0 \end{aligned} \] 观察这两个式子,在第二个式子中,如果我们采用分块矩阵,只观察\(I\)对应的那一块,那么实际上可以得出如下结论: \[ \mathbf{n} = K^T\mathbf{l}_h \] 这表示如果我们知道(图像坐标系下)影消线的表示,就可以得到三维空间(相机坐标系下)对应的平面的法向量。

极几何

考虑我们对场景中的一个3D场景进行拍摄,从两个不同的角度进行拍摄,如下图所示。其中\(O_1,O_2\)分别表示两次拍摄的相机光心;\(K,K'\)分别表示两次拍摄的相机内参;\(p,p'\)分别表示在各自图像坐标系中的像素点坐标,并且代表的是场景中的同一点\(P\)\(R,T\)分别表示从\(O_1\)坐标系变换到\(O_2\)坐标系需要经过的旋转和平移。如果在理想的情况下,我们可以在同一个3维坐标系中,同时求出直线\(l\)\(l'\),并且这两条直线的交点就是场景中对应真实点的坐标\(P\),只需要通过直线叉乘即可。

在理想的情况下,我们可以通过\(l,l'\)叉乘得到场景中\(P\)的坐标,但是在实际操作中,由于噪声的存在,我们算出来的两条直线通常不会相交,那么此时我们就需要使用其他的方法来求解。首先重新描述问题:

  • 已知:\(p,p',K,K',R,T\)
  • 求解:\(P\)的三维坐标(在\(O_1\)坐标系中)

有两种方式来求解该问题,分别是线性解法和非线形解法。

线性解法通过已知来构建如下关系: \[ \begin{aligned} p &= K[I|0]P \\ p'&= K'[R|T]P \end{aligned} \] 该关系可以展开为一个超定齐次线性方程组,可以通过相关方法求其最小二乘解。

非线形解法则通过最小化重投影误差来得到\(P\),可以使用相关优化方法来求得最优解。

上面的描述告诉我们,如果我们能够知道两个视角中的同名点(对应3维空间中的同一真实点),那么是可以通过相关方法计算出真实点的坐标的。那么问题就是如何在两张图片中找到对应的同名点。极几何就可以在这种情况下建立一定的约束,它描述了同一场景或者物体的两个视点图像之间的几何关系。

基础概念

考虑如下的成像过程,我们介绍极几何中的一些基础概念:

  • 极平面:同时过目标点\(P\),两个光心\(O_1,O_2\)的平面
  • 基线Baseline:光心\(O_1,O_2\)的连线
  • 极线Epipolar:极平面与成像平面之间的交线(直线)
  • 极点:基线与成像平面的交点

由定义我们可以知道,所有的极平面都会相交于基线,所有的极线都会经过极点。

考虑在左成像平面上的\(l\),该直线对应的真实场景点一定位于极平面上,同理右成像平面上\(l'\)对应的真实场景点也一定位于极平面上。这也就是说,如果我们要找\(l\)上点的同名点,我们只需要在对应极线\(l'\)上进行寻找,有这种约束条件存在,同名点不会出现在其他位置上。反之亦成立,因为\(l,l'\)​是同一组极线。应用这个性质,就可以降低搜索空间,如果我们要找一张图中某个点\(p\)的同名点\(p'\),只需要在它对应的极线上进行搜索即可。

当然极几何有一个特例,就是平行视图:

平行视图具有如下性质:

  • 两个图像平面平行
  • 基线平行于图像平面,极点\(e,e'\)位于无穷远处
  • 极线平行于图像坐标系的u轴

介绍完极几何的基础概念之后,我们对极几何进行数学上的描述。

三个矩阵

本质矩阵

本质矩阵是对规范化摄像机拍摄的两个视角图像之间极几何关系进行的代数描述。

所谓规范化摄像机,指的是它执行规范化投影变换: \[ P' = \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} = M\begin{bmatrix} x \\ y \\ z \\ 1 \end{bmatrix} \] 在规范化投影变化下,摄像机坐标系下三维点的欧式(非齐次)坐标 = 图像点的齐次坐标。

那么整体场景就可以描述为下图的形式。

我们已知两个相机内参\(K,K'\)都是单位矩阵(规范化投影),\(p\)在图像\(I\)的图像坐标系中的坐标为\((u,v)\),\(p'\)在图像\(I'\)的图像坐标系中的坐标为\((u',v')\)。那么接下来我们一步步进行本质矩阵的推导。

第一步,由于我们使用的规范化投影,在规范化投影下,摄像机坐标系下三维点的欧式(非齐次)坐标 = 图像点的齐次坐标。因此我们有空间点\(p\)\(O_1\)坐标系下的非齐次坐标为\((u,v,1)\),空间点\(p'\)\(O_2\)坐标系下的非齐次坐标为\((u',v',1)\)

第二步,我们需要将描述统一在\(O_1\)坐标系下(此时相当于\(O_1\)摄像机坐标系同时也是世界坐标系),因此需要将\(O_2\)和空间点\(p'\)转化为在\(O_1\)​坐标系下的描述。根据已知,\(O_1\)通过旋转\(R\)和平移\(T\)变成\(O_2\),那么\(O_2\)\(O_1\)坐标系下的坐标假设为\(O'\),那么满足\(O_2 = RO' + T\),可以解得\(O' = R^{-1}(-T) = -R^TT\)(这里注意由于旋转矩阵都是正交矩阵,所以有\(R^T = R^{-1}\))。而\(p'\)\(O_1\)坐标系中的坐标假设为\(p'_*\),那么同样满足\(p' = Rp'_* + T\),可以解得\(p'_* = R^Tp' - R^TT\)。那么现在我们就将所有的描述都统一在了\(O_1\)​坐标系下。

此时在\(O_1\)坐标系下考虑\(O_2\)向量和\(p'\)向量,这两个向量的叉乘可以得到一个垂直于极平面的向量,从而该向量与\(p\)的点积为0。具体数学分析如下: \[ \begin{aligned} O_2 \times p' = (-R^TT) \times (R^Tp' - R^TT) &= -R^T T \times R^Tp' \\ 该向量(不失一般性,可以消除负号)&与p向量垂直,即点乘为0,则有 \\ (R^TT \times R^Tp')^T \cdot p = 0&\\ (R^T(T\times p'))^T\cdot p = 0 &\quad[先旋转后叉乘等价于先叉乘后旋转]\\ (T\times p')^TR \cdot p = 0 &\\ ([T_{\times}]p')^TR\cdot p = 0 &\quad[其中[T_{\times}]表示平移向量T在叉乘的矩阵乘法表示中对应的反对称矩阵] \\ p'^T[T_\times]^TRp = 0 &\quad[[T_{\times}]为反对称矩阵,因此有[T_{\times}]^T = -[T_{\times}]] \\ p'^T[T_\times]Rp = 0 \end{aligned} \] 我们令\(E_{3\times 3} = [T_\times] R\),那么就有\(p'^TEp =0\),其中这个\(E\)就被称为本质矩阵。该矩阵可以通过两个相机坐标系之间的相对旋转和平移得到,在上面的说明中,我们使用的是\(O_1\rightarrow O_2\)的形式。

下面我们可以对本质矩阵\(E\)进行分析,注意\(p',p\)表示点在各自图像坐标系中的像素坐标位置。

  • \(p\)对应的极线在\(I_2\)图像坐标系中,且有\(l' = Ep\)
  • \(p'\)对应的极线在\(I_1\)图像坐标系中,且有\(l = E^Tp'\)
  • \(Ee = 0,e'^TE = 0\)
  • \(E\)是奇异的,它的秩为2
  • \(E\)有5个自由度(3个旋转+3个平移,\(\det(E)=0\)去掉了一个自由度)

基础矩阵

基础矩阵是对普通摄像机拍摄的两个视角图像之间极几何关系进行的代数描述。由于上面介绍了规范化相机,因此在基础矩阵部分进行的工作,只需要将普通摄像机转化为规范化摄像机即可。现在考虑两个相机的内参\(K,K'\)并不是规范化的内参矩阵,我们有图像坐标系中的坐标\(p\)与相机坐标系下的点\(P\)之间的映射关系如下: \[ \begin{aligned} p &= K[I|0] P\\ K^{-1}p & = K^{-1}K[I|0]P\\ K^{-1}p & = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}P \end{aligned} \]\(p_c = K^{-1}p\),则有: \[ p_c = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ \end{bmatrix}P \] 这意味着,对于一个普通的摄像机内参矩阵\(K\),在普通投影变化下,它将\(P\)投影到\(p\);在规范化投影变化下,它将\(P\)投影到\(K^{-1}p\)。有了这个结论,我们就可以借用上面本质矩阵继续进行推导: \[ \begin{aligned} p_c'^TEp_c &= p_c'^T[T_\times]Rp_c \\ &= (K'^{-1}p')^T[T_\times]RK^{-1}p\\ &=p'^TK'^{-1}[T_\times]RK^{-1}p = 0 \end{aligned} \]\(F = K'^{-1}[T_\times]RK^{-1}\),则有\(p'^TFp = 0\)。同样可以进行类似的分析:

  • \(p\)对应的极线在\(I_2\)图像坐标系中,且有\(l' = Fp\)
  • \(p'\)对应的极线在\(I_1\)图像坐标系中,且有\(l = F^Tp'\)
  • \(Fe = 0,e'^TF = 0\)
  • \(F\)是奇异的,它的秩为2
  • \(F\)有7个自由度

此时,我们就可以得到在普通情况下的基础矩阵。利用基础矩阵,我们实际上就可以完成极线的定位,根据一张图上点的坐标,以及相机内参和两次拍摄的相对旋转与平移,我们就可以在另一张图上找到该点对应的极线。用数学的语言来描述,假设我们已知两次拍摄的相机内参分别为\(K,K'\)\(O_1\rightarrow O_2\)的变换需要经过旋转和平移\(R,T\),在\(O_1\)对应图像坐标系中,\(p\)的像素坐标为\((u,v)\),那么\(p\)在另外一张图中对应的极线(在另外一张图的图像坐标系下)就是\(l' = Fp\),其中\(F\)为基础矩阵,计算如下: \[ F =K'^{-1}[T_\times]RK^{-1} = K'^{-1}EK^{-1} \]

单应矩阵

本质矩阵和基础矩阵并不是两个像素之间的相互转换关系,而是一种坐标之间的内在约束式。而如果再增加一定的约束,当空间中的场景是同一个平面的时候,那么该平面上的点在左右视图上的投影点就可以通过可逆的矩阵实现一对一的坐标相互转换,这个矩阵就被称为单应矩阵。单应矩阵描述的是空间中的平面在两个摄像机下的投影几何。

考虑上图对应的场景。其中两个摄像机的内参矩阵分别为\(K,K'\),第一个摄像机通过旋转和平移\(R,t\)变换到第二个摄像机,\(\mathbf{n}\)表示在空间中的平面\(\pi\)在第一个摄像机坐标系下的单位法向量,从坐标原点指向平面,\(d\)表示平面\(\pi\)到第一个摄像机坐标系原点的距离。此时我们需要寻找\(p\)\(p'\)之间的对应关系,它们分别表示平面\(\pi\)上的某一点\(P\)在两张图像上的像素坐标。

不妨假设\(P = [\widetilde{P}^T, 1]^T\),那么平面\(\pi\)的方程就是\(\mathbf{n}^T\widetilde{P} = d\),并记\(\mathbf{n}_d = \mathbf{n}/d\)接下来: \[ \begin{aligned} M &= K[I|0], \quad M' = K'[R|t], \quad P = [\widetilde{P}^T, 1]^T \\ p &= MP = K[I|0]\begin{bmatrix} \widetilde{P} \\ 1 \end{bmatrix} = K\widetilde{P} \\ p'&= M'P = K'[R|t]\begin{bmatrix} \widetilde{P} \\ 1 \end{bmatrix} = K'(R\widetilde{P} + t) \\ p'&= K'(R\widetilde{P} + t) = K'(R\widetilde{P} + tI) = K'(R\widetilde{P} + t\mathbf{n}_d^T\widetilde{P}) \\ &= K'(R + t\mathbf{n}^T_d)\widetilde{P} =K'(R + t\mathbf{n}^T_d)K^{-1}p \end{aligned} \] 于是我们可以得到单应矩阵\(H\)\[ p' = Hp,\quad H =K'(R + t\mathbf{n}^T_d)K^{-1} \] 单应矩阵可以帮助我们完成两张视图像素坐标的一一对应转换,但是需要注意前提是同名点来自空间中的同一平面,并且我们知道平面的法向量以及到原点的距离。

单应矩阵具有8个自由度。

注意在此篇文章中,本质矩阵,基础矩阵以及单应矩阵都是相对于第一个相机参考系而言的表示。

平行视图

平行视图的优势

在极几何的基础概念中,我们介绍了一个特殊的极几何情况,就是平行视图。在平行视图的情况下,两个图像平面相互平行,并且基线位于图像平面,极点\(e,e'\)位于无穷远处。

在平行视图下,会有一些非常好的性质

  1. 所有的极线都是平行于u轴的
  2. 对于图像中的\(p\)点,它的同名点\(p'\)一定在对应的极线上,并且这条直线与p所在极线高度相同。即\(p\)\(p'\)\(v\)坐标相同

下面是对这个性质的证明,在实际使用过程中,我们知道有上面那些很好的性质即可。

首先,平行视图仍然属于我们讨论的对同一场景不同角度的拍摄,因此之前的矩阵描述同样可以适用,因此有: \[ F = K'^{-T}[T_\times]RK^{-1} \] 考虑极点\(e'\),它是\(O_1\)光心在\(I_2\)图像平面上的投影,因此我们有: \[ e' = K'[R|T]\begin{bmatrix} 0 \\ 0 \\ 0 \\ 1 \end{bmatrix} = K'T \] 这里我们直接使用一个叉乘的性质:对于任何向量\(a\)来说,如果\(B\)是可逆的,那么在相差一个尺度的情况下,我们有: \[ [a_\times]B = B^{-T}[(B^{-1}a)_\times] \] 我们令\(a = T,B=K'^{-1}\),那么则有: \[ \begin{aligned} \text[T_\times] K'^{-1} &= K'^{T}[(K'T)_\times] \\ [T_\times] &= K'^T[(K'T)_\times]K' \end{aligned} \] 用这个结论带入基础矩阵\(F\),则有: \[ \begin{aligned} F &= K'^{-T}[T_\times]RK^{-1} = K'^{-T}K'^T[(K'T)_\times]K'RK^{-1}\\ &=[(K'T)_\times]K'RK^{-1} \\ &=[e'_\times]K'RK^{-1} \end{aligned} \] 上面的结论是对任何普通情况都成立的,相当于给出了基础矩阵的另外一种使用极点坐标的表示方式。而对于平行视图的情况,我们有: \[ K = K',\quad R = I,\quad e' = \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} \] 在这种情况下,基础矩阵可以简化为: \[ F = [e'_\times]K'RK^{-1} = [e'_\times] = \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \\ \end{bmatrix} \] 于是对于\(p\)来说,极线为: \[ l' = Fp = \begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \\ \end{bmatrix}\begin{bmatrix} p_u \\ p_v \\ 1 \\ \end{bmatrix} = \begin{bmatrix} 0 \\ -1 \\ p_v\\ \end{bmatrix} \] 这表示极线是水平的,平行于u轴。

考虑\(p,p'\)的坐标,则有: \[ \begin{aligned} p'^TFp &= 0 \\ \begin{bmatrix} p'_u & p'_v & 1 \\ \end{bmatrix}\begin{bmatrix} 0 & 0 & 0 \\ 0 & 0 & -1 \\ 0 & 1 & 0 \\ \end{bmatrix}\begin{bmatrix} p_u \\ p_v \\ 1 \\ \end{bmatrix} &= 0 \\ p_v &= p'_v \end{aligned} \] 这表示同名点对之间的纵坐标是相同的,它们位于同一行。

极线校正

我们说平行视图有非常多的好处,但是很多情况下我们拍摄的情况并不是平行视图。此时,我们可以使用极线纠正,来将不是平行视图的情况转化成平行视图。如下图所示,我们希望将两个原始的图像经过\(H,H'\)变换之后得到平行视图的情况,并且在变换过程中保持一一映射。

进行极线校正可以通过一系列步骤完成,这里只介绍步骤内容,具体的原理不再进行说明。

第一步:在两幅图像之间找到一组匹配点(不少于8个),估计出基础矩阵\(F\)

第二步:利用基础矩阵求解出两幅图像中的极点\(e,e'\)

第三步:选择透视变换\(H'\)\(e'\)变换到无穷远点\((f,0,0)\),这里\(H' = T^{-1}GRT\),其中\(T,R,G\)可以通过下面细节求得: \[ T = \begin{bmatrix} 1 & 0 & -\frac{width}{2} \\ 0 & 1 & -\frac{height}{w} \\ 0 & 0 & 1\\ \end{bmatrix} \]\(e' = (e'_1,e'_2,1)\),则: \[ R = \begin{bmatrix} \alpha\frac{e_1'}{\sqrt{e_1'^2+e_2'^2}} & \alpha\frac{e_2'}{\sqrt{e_1'^2+e_2'^2}} & 0 \\ -\alpha\frac{e_2'}{\sqrt{e_1'^2+e_2'^2}} & \alpha\frac{e_1'}{\sqrt{e_1'^2+e_2'^2}} & 0 \\ 0 & 0 & 1 \\ \end{bmatrix},其中e_1' > 0 时\alpha = 1;反之\alpha = -1 \] 接下来: \[ G =\begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ -\frac{1}{f} & 0 & 1\\ \end{bmatrix} \] 第四步:寻找对应的透视变换矩阵\(H\)使得下面的式子最小: \[ \sum_i d(Hp_i,H'p'_i) \] 第五步:分别利用矩阵\(H,H'\)来对左右两幅图像\(I,I'\)进行重采样。

下面是一个极线校正前后的对比:

参考文章

  1. 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)bilibili

摄像机几何与极几何
http://example.com/2024/02/11/摄像机几何与极几何/
作者
EverNorif
发布于
2024年2月11日
许可协议