从二维图像到三维重建:由运动到结构(SfM)的完整流程推导【含数学原理及推导】
从二维图像到三维重建:由运动到结构(SfM)的完整流程推导【含数学原理及推导】
结构从运动(Structure from Motion,SfM)是一种从二维图像序列中恢复三维结构和相机运动的技术。通过分析图像中稀疏的特征点,我们可以估计出相机在拍摄过程中经历的姿态变化,并重建出场景的三维几何结构。本文将详细介绍SfM的基本概念、应用示例、输入输出要求以及核心的三角测量方法,并通过具体的数学公式和图像说明,深入浅出地解释三维重建的原理。
结构从运动(SfM)- 稀疏特征点的3D重建
1. 引言
由运动到结构(Structure from Motion, SfM)是一种从二维图像序列中恢复三维结构和相机运动的技术。在SfM中,通过分析图像中稀疏的特征点,我们可以估计出相机在拍摄过程中经历的姿态变化,并重建出场景的三维几何结构。COLMAP等常用的SfM工具能够从大量照片中提取稀疏或密集的三维模型,这些模型在考古、建筑、虚拟现实等领域具有重要应用。
1.1 定义
运动(Motion):相机的姿态,即相机在空间中的位置和方向,通过旋转矩阵(R)和位移向量(t)描述。运动信息的恢复帮助我们确定相机在拍摄不同图像时的相对位置和视角。
结构(Structure):物体的三维几何形状,通常是场景的三维点云。通过对多张图像的分析,SfM可以生成稀疏的三维点云模型,甚至可以在进一步的多视图立体视觉(Multi-View Stereo, MVS)处理中生成更为密集的模型。
1.2 SfM的应用示例
稀疏重建:图示中COLMAP的SfM模块使用约21,000张照片重建了罗马中央区域的稀疏模型,展示了场景的主要结构和特征点分布。稀疏模型主要用于相机位姿估计和初步的三维结构呈现。
密集重建:通过COLMAP的多视图立体视觉(MVS)模块,可以在稀疏模型的基础上生成更高分辨率的密集模型。图示中展示了使用MVS技术重建的复杂场景,使得细节更加清晰。这种密集模型在需要高精度三维信息的场景中非常有用,例如虚拟旅游或文化遗产保护等。
2. 输入与输出
输入:一组至少包含两张的二维图像序列,图像间需要有足够的视角变化,以便提取出有效的三维信息。图像中应包含可辨认的、相互对应的特征点,这些特征点用于关联图像之间的空间关系。
输出:
相机的三维运动参数:包括相机的旋转矩阵R RR和位移向量t tt,用于表示相机在三维空间中的位置和方向。
物体的三维结构:即场景中的三维点云,代表场景的几何特征。根据所采用的算法,SfM可以输出稀疏或密集的点云结构。
通过这些输入输出,SfM从二维图像序列中构建了一个完整的三维模型。在实践中,SfM流程包括关键点检测、特征匹配、三角测量、运动估计和光束平差等步骤,进一步优化了重建精度。
3. 三角测量(Triangulation)
三角测量是结构从运动(SfM)中的关键步骤,核心任务是根据多个相机视角的观察结果,推算出三维空间中某个点的位置。
正如图中所示,三角测量通过在不同相机位置和角度下观察到的图像特征点,重建出物体的三维空间位置。这一过程在多视图重建中尤为重要,通常用于计算每个特征点在三维空间中的精确坐标。
3.1 问题描述
在图中,p pp表示三维空间中的点,而c 1 c_1c1 、c 2 c_2c2 、c 3 c_3c3 分别为三个不同的相机位置,每个相机具有不同的姿态( R j , t j ) (R_j, t_j)(Rj ,tj )。x 1 x_1x1 、x 2 x_2x2 和x 3 x_3x3 是该点p pp在不同视图下的投影,即在图像平面上的对应位置。
三角测量的任务就是从这些已知的图像点( x j ) (x_j)(xj )和相机姿态( R j , t j ) (R_j, t_j)(Rj ,tj )中,反推出该空间点p pp的三维坐标。
3.2 投影方程与矩阵表示
在三角测量中,我们可以通过投影方程将三维点p pp映射到图像平面上的点x j x_jxj 。对于每一个视图j jj,投影方程表示为:
x j = P j p x_j = P_j pxj =Pj p
其中:
x j x_jxj 是空间点p pp在第j jj个图像上的投影坐标。
P j P_jPj 是第j jj个相机的投影矩阵,包含内参矩阵和外参矩阵的组合,具体表示为P j = K j [ R j ∣ t j ] P_j = K_j [R_j | t_j]Pj =Kj [Rj ∣tj ]。其中,K j K_jKj 为相机的内参矩阵,定义了相机的焦距和光心位置等参数;[ R j ∣ t j ] [R_j | t_j][Rj ∣tj ]为外参矩阵,描述相机的旋转和平移。
在实际计算中,P j p P_j pPj p通常以矩阵的形式展开,具体为:
P j p = [ p 00 j p 01 j p 02 j p 03 j p 10 j p 11 j p 12 j p 13 j p 20 j p 21 j p 22 j p 23 j ] [ X Y Z 1 ] P_j p = \begin{bmatrix} p_{00}^j & p_{01}^j & p_{02}^j & p_{03}^j \ p_{10}^j & p_{11}^j & p_{12}^j & p_{13}^j \ p_{20}^j & p_{21}^j & p_{22}^j & p_{23}^j \end{bmatrix} \begin{bmatrix} X \ Y \ Z \ 1 \end{bmatrix}Pj p= p00j p10j p20j p01j p11j p21j p02j p12j p22j p03j p13j p23j XYZ1
其中:
X , Y , Z X, Y, ZX,Y,Z是需要求解的空间点p pp的三维坐标。
齐次坐标的最后一项1 11允许我们处理仿射变换。
3.3 齐次坐标与归一化
在三角测量中,我们通常将图像平面上的点x j x_jxj 表示为齐次坐标( x j ′ , y j ′ , 1 ) (x_j', y_j', 1)(xj′ ,yj′ ,1)。齐次坐标是一种在计算机视觉和图形学中常用的表示方式,特别适用于处理仿射变换和透视投影。它允许我们在相机投影矩阵中统一处理平移和缩放变换 。
当图像坐标x j x_jxj 被映射到三维空间时,我们得到的坐标可能不在归一化平面上,而是一个带有深度(或尺度)因子的坐标表示。我们可以将这个图像坐标进一步处理为归一化坐标,使其与相机坐标系直接关联,简化后续的计算过程。
归一化坐标定义如下:
x j = 1 z j [ x j ′ y j ′ 1 ] x_j = \frac{1}{z_j} \begin{bmatrix} x_j' \ y_j' \ 1 \end{bmatrix}xj =zj 1 xj′ yj′ 1
其中,z j z_jzj 是一个深度因子,用于归一化图像坐标。归一化坐标的主要作用是将图像坐标映射到归一化平面上(通常为z = 1 z = 1z=1的平面),使得我们能够忽略相机的尺度变化,将坐标表示与三维空间位置直接关联。
3.4 解析求解三维坐标
在前面的步骤中,我们通过齐次坐标和归一化,将图像上的投影点x j x_jxj 表示为三维点p pp的函数形式。现在,我们可以利用多个视角中的投影点,构建方程组来反推出空间点p pp的三维坐标( X , Y , Z ) (X, Y, Z)(X,Y,Z)。
从投影方程到具体约束关系
对于每一个视图j jj,三维点p pp投影到图像平面上的点x j = ( x j ′ , y j ′ , 1 ) x_j = (x_j', y_j', 1)xj =(xj′ ,yj′ ,1),其关系由如下的投影方程给出:
x j = P j p x_j = P_j pxj =Pj p
其中,P j P_jPj 是相机的投影矩阵,由内参和外参矩阵组成。为了更明确地表达投影过程,我们将P j p P_j pPj p展开为矩阵形式:
P j p = [ p 00 j p 01 j p 02 j p 03 j p 10 j p 11 j p 12 j p 13 j p 20 j p 21 j p 22 j p 23 j ] [ X Y Z 1 ] = [ x j ′ y j ′ z j ′ ] P_j p = \begin{bmatrix} p_{00}^j & p_{01}^j & p_{02}^j & p_{03}^j \ p_{10}^j & p_{11}^j & p_{12}^j & p_{13}^j \ p_{20}^j & p_{21}^j & p_{22}^j & p_{23}^j \end{bmatrix} \begin{bmatrix} X \ Y \ Z \ 1 \end{bmatrix} = \begin{bmatrix} x_j' \ y_j' \ z_j' \end{bmatrix}Pj p= p00j p10j p20j p01j p11j p21j p02j p12j p22j p03j p13j p23j XYZ1 = xj′ yj′ zj′
其中,x j ′ x_j'xj′ 和y j ′ y_j'y