文章目录
- 1. 基本概念
- 2. 代数方法
- 3. 捆绑调整
课程链接: 计算机视觉之三维重建(深入浅出SfM与SLAM核心算法)—— 7.多视图几何(下)。
1. 基本概念
透视结构恢复问题的数学模型如下图所示:
透视结构恢复的歧义如下图所示。从图中可以看出, x i j = M i X j = ( M i H − 1 ) ( H X j ) = M ∗ X ∗ x_{ij} = \mathbf{M}_i X_j = (\mathbf{M}_i \mathbf{H}^{-1})(\mathbf{H} X_j) = \mathbf{M}^* X^* xij=MiXj=(MiH−1)(HXj)=M∗X∗。因此,估计的投影矩阵 M ∗ \mathbf{M^*} M∗ 与真实的投影矩阵 M \mathbf{M} M 至多相差一个可逆矩阵 H − 1 \mathbf{H}^{-1} H−1(这里 H \mathbf{H} H 是 4 × 4 4 \times 4 4×4 可逆矩阵),而重建的三维点 X ∗ X^* X∗ 与真实三维点 X j X_j Xj 之间相差矩阵 H \mathbf{H} H 所定义的线性变换。
在相差一个 4 × 4 4 \times 4 4×4 可逆矩阵 H \mathbf{H} H 的情况下,恢复摄像机运动与场景结构的方法有两种:
代数方法
(通过基础矩阵 F \mathbf{F} F)捆绑调整
(Bundle Adjustment, BA)
2. 代数方法
我们先讨论 2 视图的解法,再拓展到 N N N 视图的解法。2 视图的代数解法如下:
代数方法的求解步骤如下图所示。首先,通过归一化八点法求解出基础矩阵 F \mathbf{F} F。然后,我们需要通过基础矩阵 F \mathbf{F} F 估计出两个相机的投影矩阵 M 1 \mathbf{M}_1 M1 和 M 2 \mathbf{M}_2 M2。最后,利用三角化求解三维点。
由于透视歧义存在,即 x i j = M i X j = ( M i H − 1 ) ( H X j ) = M ∗ X ∗ x_{ij} = \mathbf{M}_i X_j = (\mathbf{M}_i \mathbf{H}^{-1})(\mathbf{H} X_j) = \mathbf{M}^* X^* xij=MiXj=(MiH−1)(HXj)=M∗X∗。因此,我们总是可以找到一个可逆矩阵 H \mathbf{H} H,使得:
{ M 1 ∗ = M 1 H − 1 = [ I ∣ 0 ] M 2 ∗ = M 2 H − 1 = [ A ∣ b ] \begin{cases} \mathbf{M}^*_{1} = \mathbf{M}_1 \mathbf{H}^{-1} = [\mathbf{I} | 0] \\ \mathbf{M}^*_{2} = \mathbf{M}_2 \mathbf{H}^{-1} = [\mathbf{A} | b] \end{cases} {M1∗=M1H−1=[I∣0]M2∗=M2H−1=[A∣b]我们通过下图的方法建立基础矩阵 F \mathbf{F} F 与 A \mathbf{A} A 和 b b b 之间的数学关系,即
F = [ b × ] A \mathbf{F} = [b_{\times}] \mathbf{A} F=[b×]A这里用到了向量叉积的性质: a × b = − b × a \boldsymbol{a} \times \boldsymbol{b} = -\boldsymbol{b} \times \boldsymbol{a} a×b=−b×a。
根据基础矩阵 F \mathbf{F} F 估计 A \mathbf{A} A 和 b b b 的方法如下图所示:
从图中可知, b b b 为方程 F T b = 0 \mathbf{F}^T b = 0 FTb=0 的解,且 A = − [ b × ] F \mathbf{A} = -[b_{\times}] \mathbf{F} A=−[b×]F。上述证明中应用了如下公式: [ b × ] [ b × ] = b b T − ∣ b ∣ 2 I [b_{\times}][b_{\times}] = b b^T - |b|^2 \mathbf{I} [b×][b×]=bbT−∣b∣2I证明如下:
[ b × ] [ b × ] = ( 0 − b z b y b z 0 − b x − b y b x 0 ) ( 0 − b z b y b z 0 − b x − b y b x 0 ) = ( − b z 2 − b y 2 b x b y b x b z b x b y − b z 2 − b x 2 b y b z b x b z b y b z − b y 2 − b x 2 ) = ( b x 2 b x b y b x b z b x b y b y 2 b y b z b x b z b y b z b z 2 ) − ( b x 2 + b y 2 + b z 2 0 0 0 b x 2 + b y 2 + b z 2 0 0 0 b x 2 + b y 2 + b z 2 ) = ( b x b y b z ) ( b x b y b z ) − ( b x 2 + b y 2 + b z 2 ) ( 1 0 0 0 1 0 0 0 1 ) = b b T − ∣ b ∣ 2 I \begin{align*} [b_{\times}][b_{\times}] &= \begin{pmatrix} 0 & -b_z & b_y \\ b_z & 0 & -b_x \\ -b_y & b_x & 0 \end{pmatrix} \begin{pmatrix} 0 & -b_z & b_y \\ b_z & 0 & -b_x \\ -b_y & b_x & 0 \end{pmatrix} \\ &= \begin{pmatrix} -b_z^2 - b_y^2 & b_x b_y & b_x b_z \\ b_x b_y & -b_z^2 - b_x^2 & b_y b_z \\ b_x b_z & b_y b_z & -b_y^2 - b_x^2 \end{pmatrix} \\ &= \begin{pmatrix} b_x^2 & b_x b_y & b_x b_z \\ b_x b_y & b_y^2 & b_y b_z \\ b_x b_z & b_y b_z & b_z^2 \end{pmatrix} - \begin{pmatrix} b_x^2 + b_y^2 + b_z^2 & 0 & 0 \\ 0 & b_x^2 + b_y^2 + b_z^2 & 0 \\ 0 & 0 & b_x^2 + b_y^2 + b_z^2 \end{pmatrix} \\ &= \begin{pmatrix} b_x \\ b_y \\ b_z \end{pmatrix} \begin{pmatrix} b_x b_y b_z \end{pmatrix} - (b_x^2 + b_y^2 + b_z^2) \begin{pmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{pmatrix} = b b^T - |b|^2 \mathbf{I} \end{align*} [b×][b×]= 0bz−by−bz0bxby−bx0 0bz−by−bz0bxby−bx0 = −bz2−by2bxbybxbzbxby−bz2−bx2bybzbxbzbybz−by2−bx2 = bx2bxbybxbzbxbyby2bybzbxbzbybzbz2 − bx2+by2+bz2000bx2+by2+bz2000bx2+by2+bz2 = bxbybz (bxbybz)−(bx2+by2+bz2) 100010001 =bbT−∣b∣2I又因为:
{ e ′ T F = 0 F T b = 0 ⇒ ( F T b ) T = 0 ⇒ b T F = 0 \begin{cases} e^{\prime T} \mathbf{F} = 0 \\ \mathbf{F}^T b = 0 \Rightarrow (\mathbf{F}^T b)^T = 0 \Rightarrow b^T \mathbf{F} = 0 \end{cases} {e′TF=0FTb=0⇒(FTb)T=0⇒bTF=0因此, b b b 可以取值为 e ′ ∥ e ′ ∥ \dfrac{e^{\prime}}{\|e^{\prime}\|} ∥e′∥e′,其中 e ′ e^{\prime} e′ 为极点。
由上述讨论知,当设置第一个相机的投影矩阵为 M 1 ∗ = [ I 0 ] \mathbf{M}^*_1 = [I \quad 0] M1∗=[I0] 时,第二个相机的投影矩阵 M 2 ∗ = [ − [ b × ] F b ] ] \mathbf{M}^*_2 = [-[b_{\times}] \mathbf{F} \quad b]] M2∗=[−[b×]Fb]]。当我们已知相机的投影矩阵时,就可以使用三角化计算三维点,关于三角化可以参考博客:三维重建 —— 4. 三维重建基础与极几何。
上述已讨论过两视图的代数解法。通过计算每个图像对 ( I k , I h ) (I_k, I_h) (Ik,Ih) 的运动与结构,即可将该方法推广到 N N N 视图情况,如下图所示。
3. 捆绑调整
代数法与分解法的局限性如下图所示:
捆绑调整(Bundle Adjustment, BA)是计算机视觉、摄影测量和机器人领域中用于联合优化相机参数(位姿、内参)与三维点坐标的核心技术,其目标是通过最小化重投影误差,提升三维重建或运动恢复结构的全局一致性。重投影误差是指三维点通过相机模型投影到图像平面后,与真实观测点之间的欧氏距离。最小化重投影误差的数学公式如下:
min { K i , R i , T i , X j } ∑ i = 1 m ∑ j = 1 n ∥ proj ( K i [ R i ∣ T i ] X j ) − ( u i j , v i j ) ∥ 2 \min_{\{\mathbf{K_i}, \mathbf{R_i}, T_i, X_j\}} \sum_{i=1}^{m} \sum_{j=1}^{n} \left\| \text{proj}(\mathbf{K_i} [\mathbf{R_i} \mid T_i] X_j) - (u_{ij}, v_{ij}) \right\|^2 {Ki,Ri,Ti,Xj}mini=1∑mj=1∑n∥proj(Ki[Ri∣Ti]Xj)−(uij,vij)∥2BA 依赖迭代优化,常用方法包括:梯度下降法、牛顿法、LM 算法等。下图介绍了 BA 算法以及其优势和局限性。值得注意的是:BA 算法常用作 SfM 的最后一步,而分解或代数方法可作为优化问题的初始解。