跳到主要内容

10.4 分层重建

来源:Richard Hartley 与 Andrew Zisserman 的 Multiple View Geometry in Computer Vision,第 10 章 3D Reconstruction of Cameras and Structure,10.4 小节 Stratified reconstruction。

这一节讲的是如何把 10.3 射影重建 逐步升级:

projective reconstruction
-> affine reconstruction
-> metric reconstruction

这条路线叫做 stratified reconstruction,中文可理解为“分层重建”。

本节核心

两视图未标定重建一开始只能得到射影重建:

P,P,{Xi}P,\quad P',\quad \{\mathbf{X}_i\}

它和真实欧氏重建之间相差一个未知的三维射影变换:

PE=PH1,PE=PH1,XEi=HXiP_E = PH^{-1}, \qquad P'_E = P'H^{-1}, \qquad \mathbf{X}_{Ei} = H\mathbf{X}_i

分层重建的目标是逐步减少 HH 的自由度:

阶段需要识别的几何对象重建歧义
projective射影变换
affine无穷远平面 π\pi_\infty仿射变换
metric绝对二次曲线 Ω\Omega_\infty相似变换

直观地说:

  • 找到 π\pi_\infty,就恢复了“哪些方向是平行的”。
  • 找到 Ω\Omega_\infty,就进一步恢复了“角度和长度比例”。

10.4.1 从射影重建到仿射重建

仿射重建的关键是定位无穷远平面:

π\pi_\infty

原因是:仿射几何和射影几何的区别,正是是否知道哪个平面是无穷远平面。

如果我们在当前射影重建的坐标系中识别出某个平面 π\boldsymbol{\pi},并知道它对应真实世界的无穷远平面,那么就可以把它变换到标准位置:

π=(0,0,0,1)T\pi_\infty = (0,0,0,1)^T

完成这一步之后,重建就不再只是射影重建,而是仿射重建。

用 H 把无穷远平面放回标准位置

设当前射影坐标系中的无穷远平面为:

π=(π1,π2,π3,π4)T\boldsymbol{\pi} = (\pi_1,\pi_2,\pi_3,\pi_4)^T

目标是找一个三维射影变换 HH,使得平面按如下方式变换:

HTπ=(0,0,0,1)TH^{-T}\boldsymbol{\pi} = (0,0,0,1)^T

如果 π40\pi_4 \neq 0,可以使用如下形式的矩阵:

H=[I3×30π1π2π3π4]H = \begin{bmatrix} I_{3\times3} & \mathbf{0}\\ \pi_1 & \pi_2 & \pi_3 & \pi_4 \end{bmatrix}

然后对三维点和相机做同样的升级:

XiHXi\mathbf{X}_i \mapsto H\mathbf{X}_i PPH1,PPH1P \mapsto PH^{-1}, \qquad P' \mapsto P'H^{-1}
信息

这一步只保证无穷远平面的位置正确。得到的结果和真实欧氏结构之间仍然可能差一个仿射变换。

为什么这是仿射重建

π\pi_\infty 已经被放到正确位置后,剩余的不确定变换必须保持 π\pi_\infty 不动。

保持无穷远平面不动的射影变换,正是仿射变换。

因此,此时重建结果与真实结构之间只差:

affine transformation\text{affine transformation}

这意味着我们已经恢复了仿射性质,例如:

  • 平行性。
  • 线段中点。
  • 一组点的质心。
  • 同一直线上的长度比例。
  • 线和平面之间的平行关系。

但还不能恢复:

  • 角度。
  • 垂直关系。
  • 真实长度比例。
  • 圆、球等度量性质。

如何找到无穷远平面

书中给出几类可以识别 π\pi_\infty 的额外信息。

纯平移相机运动

如果两台相机之间只有平移,没有旋转,并且内参不变,那么可以得到仿射重建。

直观原因是:无穷远点在纯平移下投影位置不变。

例如人在直路上向前移动时,近处物体明显移动,但非常远的物体几乎不动。这种“不动”的方向信息对应无穷远平面上的点。

在纯平移情形下,可以选择仿射相机:

P=[I0]P = \begin{bmatrix} I & \mathbf{0} \end{bmatrix} P=[Ie]P' = \begin{bmatrix} I & \mathbf{e}' \end{bmatrix}

基础矩阵具有特殊形式:

F=[e]×F = [\mathbf{e}']_\times
提示

这说明纯平移不是普通两视图情形,而是带有额外运动约束的情形。实际求解时应该利用 FF 的特殊反对称结构。

场景中的平行线

如果场景中有三组不同方向的平行线,也可以确定无穷远平面。

原因是:一组真实平行线在三维空间中相交于同一个无穷远点。

每一组平行线给出一个无穷远点:

X,1,X,2,X,3\mathbf{X}_{\infty,1}, \quad \mathbf{X}_{\infty,2}, \quad \mathbf{X}_{\infty,3}

只要三组方向不同,这三个无穷远点就能确定一个平面:

π\pi_\infty

这也是建筑场景中常用的思路:墙边、窗框、屋顶边缘等经常提供多组平行线。

注意

在有噪声的真实图像中,原本应该相交的空间线通常不会精确相交。因此实际计算不能简单用两条线硬求交点,而需要鲁棒估计和优化。

单张图中的消失点也有用

不一定要在两张图中都直接找到同一个消失点。

假设第一张图中由平行线得到消失点:

v\mathbf{v}

第二张图中有对应方向的一条图像线:

l\mathbf{l}'

由于消失点也满足对极约束,第二张图中的对应消失点 v\mathbf{v}' 位于:

FvF\mathbf{v}

这条对极线上,同时又位于 l\mathbf{l}' 上。因此:

v=l×(Fv)\mathbf{v}' = \mathbf{l}' \times (F\mathbf{v})

再由两视图中的消失点对应,可以在当前重建中三角化出无穷远点。

已知直线上的长度比例

如果知道同一直线上几个点之间的仿射长度比例,也可以确定该直线方向上的无穷远点。

典型例子:

  • 三个点等间距。
  • 两段线段长度比已知。
  • 建筑立面上重复结构间隔相同。

一旦能从图像中确定某个方向的无穷远点,多个不同方向的无穷远点就能共同确定 π\pi_\infty

已知某个相机是仿射相机

如果已知某个相机可以近似看作 affine camera,那么也可以完成射影到仿射的升级。

仿射相机的 principal plane 正是无穷远平面。

相机矩阵的 principal plane 对应它的第三行。因此,如果某个相机已知为仿射相机,就可以把该相机的 principal plane 作为 π\pi_\infty 来使用。

信息

真实相机严格来说不是仿射相机。仿射相机只是当场景深度变化远小于相机到场景距离时的近似模型。

无穷远单应 H∞

一旦得到仿射重建,就可以定义两幅图像之间的无穷远单应:

HH_\infty

它表示这样一个映射:

  1. 第一张图中的点 x\mathbf{x} 反投影成空间射线。
  2. 射线与无穷远平面 π\pi_\infty 相交。
  3. 该无穷远点再投影到第二张图,得到 x\mathbf{x}'

于是:

x=Hx\mathbf{x}' = H_\infty \mathbf{x}

如果仿射重建中的两台相机为:

P=[Mm],P=[Mm]P = \begin{bmatrix} M & \mathbf{m} \end{bmatrix}, \qquad P' = \begin{bmatrix} M' & \mathbf{m}' \end{bmatrix}

那么:

H=MM1H_\infty = M'M^{-1}

特别地,如果选择:

P=[I0],P=[Me]P = \begin{bmatrix} I & \mathbf{0} \end{bmatrix}, \qquad P' = \begin{bmatrix} M' & \mathbf{e}' \end{bmatrix}

则:

H=MH_\infty = M'

反过来,如果已经知道 HH_\infty,也可以选择仿射相机:

P=[I0],P=[He]P = \begin{bmatrix} I & \mathbf{0} \end{bmatrix}, \qquad P' = \begin{bmatrix} H_\infty & \mathbf{e}' \end{bmatrix}

这说明:

knowing πknowing H\text{knowing } \pi_\infty \quad \Longleftrightarrow \quad \text{knowing } H_\infty

10.4.2 从仿射重建到度量重建

度量重建的关键是识别绝对二次曲线:

Ω\Omega_\infty

它位于无穷远平面 π\pi_\infty 上。

所以一旦识别出 Ω\Omega_\infty,也就隐含识别了 π\pi_\infty

在分层路线中,我们通常已经有了仿射重建,也就是已经知道 π\pi_\infty。接下来只需要在无穷远平面上进一步确定 Ω\Omega_\infty

为什么 Ω∞ 给出度量信息

射影变换会破坏角度和长度比例。

但如果一个变换保持绝对二次曲线 Ω\Omega_\infty 不变,那么它只能是相似变换:

rotation+translation+uniform scale\text{rotation} + \text{translation} + \text{uniform scale}

因此,一旦把当前重建中的 Ω\Omega_\infty 变换到标准欧氏位置,重建就升级为 metric reconstruction。

此时保留下来的歧义只剩:

similarity transformation\text{similarity transformation}

也就是无法确定绝对位置、朝向和整体尺度,但可以确定角度和长度比例。

用 IAC 升级到度量重建

实践中常用的是绝对二次曲线在图像中的投影,称为 image of the absolute conic,简称 IAC:

ω\omega

假设我们已经有仿射重建,某个相机写作:

P=[Mm]P = \begin{bmatrix} M & \mathbf{m} \end{bmatrix}

并且知道该图像中的 IAC 为 ω\omega

那么可以用如下仿射变换把重建升级为度量重建:

HM=[A100T1]H_M = \begin{bmatrix} A^{-1} & \mathbf{0}\\ \mathbf{0}^T & 1 \end{bmatrix}

其中 AA 满足:

AAT=(MTωM)1AA^T = (M^T\omega M)^{-1}

通常可以通过 Cholesky 分解求出 AA

注意

如果 (MTωM)1(M^T\omega M)^{-1} 不是正定矩阵,就无法按这种方式得到有效的 AA。这通常意味着约束、估计或数据存在问题。

IAC 和相机内参 K 的关系

IAC 只依赖相机内参,不依赖相机位置和朝向。

如果相机内参矩阵为 KK,则:

ω=KTK1\omega = K^{-T}K^{-1}

等价地:

ω1=KKT\omega^{-1} = KK^T

因此,如果知道 ω\omega,可以反推出 KK;如果知道或部分知道 KK,也可以约束 ω\omega

常见内参约束包括:

  • zero skew:
ω12=ω21=0\omega_{12} = \omega_{21} = 0
  • square pixels:
ω11=ω22\omega_{11} = \omega_{22}

这些约束可以和场景约束、多视图约束一起使用。

如何得到 IAC 的约束

书中列出三类常见来源。

场景正交性

如果两组场景直线在三维中互相垂直,它们在图像中对应两个消失点:

v1,v2\mathbf{v}_1,\quad \mathbf{v}_2

则它们对 IAC 给出一个线性约束:

v1Tωv2=0\mathbf{v}_1^T \omega \mathbf{v}_2 = 0

如果一个方向与某个平面垂直,图像中对应一个消失点 v\mathbf{v} 和一条消失线 l\mathbf{l},则有:

l=ωv\mathbf{l} = \omega \mathbf{v}

典型例子是:竖直方向的消失点与水平地面的消失线互相约束。

已知或部分已知的相机内参

如果知道相机内参 KK,就直接知道:

ω=KTK1\omega = K^{-T}K^{-1}

如果只知道部分内参,也能提供部分约束。

例如:

  • skew 为 0。
  • 像素是正方形。
  • 主点近似在图像中心。
  • 焦距在某个范围内。

这些都能帮助确定 ω\omega

多张图使用同一相机

如果两张图由同一台相机拍摄,并且内参不变,那么两张图中的 IAC 相同:

ω=ω\omega = \omega'

又因为绝对二次曲线位于无穷远平面上,它在两张图像之间可以通过无穷远单应转移:

ω=HTωH1\omega' = H_\infty^{-T}\omega H_\infty^{-1}

如果 ω=ω\omega = \omega',就得到:

ω=HTωH1\omega = H_\infty^{-T}\omega H_\infty^{-1}

这会对 ω\omega 的元素形成线性约束。

提示

单靠同一相机约束通常还不够完全确定 ω\omega,但它可以和 square pixels、zero skew、正交消失点等约束结合起来。

10.4.3 直接使用 IAC 做度量重建

前面讲的是:

projective -> affine -> metric

但如果已经知道每张图中的 IAC,也可以更直接地走向度量重建。

一种做法是:

  1. ω\omega 计算相机内参 KK
  2. 使用已标定相机方法,计算 essential matrix。
  3. 从 essential matrix 恢复相机姿态。
  4. 三角化三维点,得到度量重建。

因为:

ω1=KKT\omega^{-1} = KK^T

所以可以通过矩阵分解从 ω\omega 得到 KK

不过从 essential matrix 恢复相机姿态时,通常会出现多个候选解,需要用点是否位于相机前方来排除错误解。

另一种直接理解

也可以从三维角度理解。

已知两台射影相机:

P,PP,\quad P'

以及两张图像中的 IAC:

ω,ω\omega,\quad \omega'

把图像中的二次曲线反投影回三维,会得到两个二次锥。它们的交线中包含绝对二次曲线 Ω\Omega_\infty

一旦确定 Ω\Omega_\infty,它所在的支撑平面就是:

π\pi_\infty

于是仿射和度量结构都被确定。

书中提醒:两个二次锥一般可能给出两个候选的平面二次曲线,这对应两视图重建中的 twisted pair ambiguity。

分层重建的整体图

可以把 10.4 总结成:

点对应
-> F
-> projective reconstruction
-> 找到 π∞
-> affine reconstruction
-> 找到 Ω∞ 或 IAC ω
-> metric reconstruction

每一步都在加入额外信息:

升级额外信息获得的能力
projective -> affineπ\pi_\inftyHH_\infty平行、中点、质心、仿射比例
affine -> metricΩ\Omega_\inftyω\omega角度、垂直、长度比例、形状

和 10.3 的关系

10.3 告诉我们:从未标定两视图只能恢复到一个未知射影变换 HH

10.4 讨论如何逐步限制这个 HH

  1. 找到 π\pi_\infty,把 HH 从一般射影变换限制为仿射变换。
  2. 找到 Ω\Omega_\infty,把剩余仿射变换限制为相似变换。

所以分层重建不是重新做一套重建,而是在已有射影重建上逐层加入约束。

本节记忆点

  • stratified reconstruction 的路线是:
projective -> affine -> metric
  • 从射影到仿射的关键是识别无穷远平面 π\pi_\infty
  • 从仿射到度量的关键是识别绝对二次曲线 Ω\Omega_\infty 或它的图像 ω\omega
  • 纯平移、三组平行线、已知长度比例、仿射相机假设都可能帮助确定 π\pi_\infty
  • 场景正交性、相机内参约束、同一相机多视图约束都可能帮助确定 ω\omega
  • 无穷远单应 HH_\infty 等价于图像层面的 π\pi_\infty 信息。
  • IAC 满足:
ω=KTK1\omega = K^{-T}K^{-1}
  • 度量重建仍然不能恢复绝对位置、朝向和尺度,只能恢复到相似变换。

后续问题

进入 10.5 时可以重点关注:

  1. 如果有已知三维坐标的控制点,能否直接从射影重建跳到度量重建?
  2. 至少需要几个 ground control points?
  3. 直接方法和分层方法相比,各自适合什么场景?