文章目录
📌 适合对象:计算机视觉初学者、三维重建入门者
⏱️ 预计阅读时间:50-60分钟
🎯 学习目标:理解Structure from Motion(SFM)的基本原理,掌握从多张图像重建三维场景的完整流程
📚 学习路线图
本文内容一览(快速理解)
- Structure from Motion(SFM):从运动的相机图像中恢复三维场景结构
- 两视图重建(Two-view Reconstruction):从两张图像重建三维点的基本流程
- 基础矩阵(Fundamental Matrix):描述两视图之间几何关系的矩阵
- 本质矩阵(Essential Matrix):已知相机内参时的基础矩阵
- 三角化(Triangulation):从对应点和相机参数计算三维点坐标
- Bundle Adjustment(光束法平差):同时优化相机参数和三维点坐标
- 多视图立体视觉(MVS):从多视图生成密集的三维点云
一、什么是Structure from Motion(Structure from Motion):从运动的相机恢复三维场景
这一章要建立的基础:理解SFM的核心概念和目标
核心问题:如何从多张不同视角拍摄的图像中恢复三维场景?
[!NOTE]
📝 关键点总结:Structure from Motion(SFM)是从运动的相机拍摄的多张图像中,同时恢复三维场景结构(Structure)和相机运动(Motion)的技术。Structure是三维点云,Motion是相机的位置和朝向。
1.1 SFM的基本概念(What is SFM):同时恢复场景结构和相机运动
概念的本质:
Structure from Motion(SFM)是一个联合问题:给定多张从不同视角拍摄的图像,我们需要同时估计:
- Structure(结构):场景的三维点云
- Motion(运动):每张图像对应的相机位置和朝向
这就像考古学家通过多张不同角度的照片重建古代建筑一样,需要同时知道建筑的结构和拍摄照片的位置。
图解说明:
💡 说明:
- 输入:多张从不同视角拍摄的图像
- 输出:三维点云(场景结构)和相机参数(相机运动)
- 核心思想:这是一个联合优化问题,结构和运动相互依赖
类比理解:
想象你在看一座建筑,但只能看到它的照片。如果你有:
- 从不同角度拍摄的多张照片
- 每张照片的拍摄位置(相机运动)
你就可以重建这座建筑的三维模型(结构)。SFM就是自动完成这个过程:从照片中同时推断出建筑的三维结构和拍摄位置。
实际例子:
SFM的应用场景:
1. 街景重建:Google Street View使用SFM重建街道的三维模型
2. 照片旅游:Photo Tourism项目可以从网络照片重建地标建筑
3. 机器人导航:SLAM(同时定位与建图)使用SFM技术
4. 电影特效:从多张照片重建场景用于电影制作
SFM的完整流程:
Images → Points: Structure from Motion
Points → More points: Multiple View Stereo
Points → Meshes: Model Fitting
Meshes → Models: Texture Mapping
1.2 SFM的完整流程(SFM Pipeline):从图像到三维模型的步骤
概念的本质:
SFM是一个多步骤的流程,从稀疏的特征点开始,逐步生成密集的三维点云,最终得到完整的三维模型。
图解说明:
💡 说明:
- SFM:从图像生成稀疏的三维点云(特征点对应的3D点)
- MVS(多视图立体视觉):从稀疏点云生成密集的三维点云
- 模型拟合:将点云转换为网格模型
- 纹理映射:将图像纹理映射到网格模型上
类比理解:
想象你在用积木搭建模型:
- SFM:先搭建框架(稀疏的关键点)
- MVS:填充细节(密集的点云)
- 模型拟合:用表面覆盖框架(网格模型)
- 纹理映射:给表面涂色(纹理映射)
实际例子:
SFM流程的各个步骤:
1. Structure from Motion:
- 输入:多张图像
- 输出:稀疏的三维点云(特征点对应的3D点)
- 方法:特征匹配、相机估计、三角化
2. Multiple View Stereo:
- 输入:稀疏点云和图像
- 输出:密集的三维点云
- 方法:密集匹配、匹配传播
3. Model Fitting:
- 输入:点云
- 输出:网格模型
- 方法:表面重建、网格优化
4. Texture Mapping:
- 输入:网格模型和图像
- 输出:带纹理的完整模型
- 方法:纹理映射、融合
二、两视图重建(Two-view Reconstruction):从两张图像重建三维点的基本流程
这一章要建立的基础:理解从两张图像重建三维点的完整流程
核心问题:如何从两张图像中重建三维点?
[!NOTE]
📝 关键点总结:两视图重建包含五个步骤:特征点检测、特征描述、特征匹配、估计基础矩阵和本质矩阵、三角化得到三维点。
2.1 两视图重建的流程(Two-view Reconstruction Pipeline):五个关键步骤
概念的本质:
两视图重建是从两张图像重建三维点的基本方法。流程包括:检测特征点、提取描述符、匹配特征点、估计几何关系、三角化得到三维点。
图解说明:
💡 说明:
- 特征点检测:在两幅图像中检测特征点(如使用SIFT)
- 特征描述:为每个特征点提取描述符(如SIFT描述符)
- 特征匹配:找到两幅图像中对应的特征点
- 基础矩阵:描述两视图之间的几何关系
- 本质矩阵:已知相机内参时的基础矩阵
- 三角化:从对应点和相机参数计算三维点坐标
类比理解:
想象你在用双眼看一个物体(立体视觉):
- 特征点检测:识别物体上的关键点(如角点)
- 特征描述:描述每个关键点的特征
- 特征匹配:找到左右眼看到的相同关键点
- 几何关系:理解双眼之间的位置关系
- 三角化:根据视差计算物体的距离和三维位置
实际例子:
两视图重建的步骤:
1. 特征点检测:
- 使用SIFT检测器在两幅图像中检测特征点
- 得到特征点的位置和尺度
2. 特征描述:
- 为每个特征点提取SIFT描述符
- 描述符是$128$维的特征向量
3. 特征匹配:
- 通过比较描述符找到对应的特征点
- 使用比率测试去除误匹配
4. 估计基础矩阵:
- 从匹配的特征点估计基础矩阵$F$
- 基础矩阵描述两视图之间的几何关系
5. 估计本质矩阵:
- 如果已知相机内参$K$,可以从$F$计算本质矩阵$E$
- 本质矩阵可以分解得到相机旋转$R$和平移$t$
6. 三角化:
- 从对应点和相机参数计算三维点坐标
- 得到稀疏的三维点云
2.2 基础矩阵(Fundamental Matrix):描述两视图之间的几何关系
概念的本质:
基础矩阵(Fundamental Matrix)是一个 3 × 3 3 \times 3 3×3矩阵,描述了同一场景点在两幅图像中的对应关系。如果点 x x x在图像1中,点 x ′ x' x′在图像2中是对应点,那么 x ′ T F x = 0 x'^T F x = 0 x′TFx=0。
图解说明:
💡 说明:
- 基础矩阵 F F F: 3 × 3 3 \times 3 3×3矩阵,描述两视图之间的几何关系
- 极线约束:如果 x x x和 x ′ x' x′是对应点,那么 x ′ T F x = 0 x'^T F x = 0 x′TFx=0
- 估计方法:需要至少8个对应点(8点算法)
类比理解:
想象你在看一幅画,但只能看到它的两个不同角度的照片。基础矩阵就像是一个"翻译器",告诉你:如果第一张照片中的某个点在某个位置,那么它在第二张照片中应该在哪条线上(极线)。这大大缩小了搜索范围。
实际例子:
基础矩阵的作用:
- 描述两视图之间的几何关系
- 提供对应点的约束条件
- 用于去除误匹配
估计基础矩阵:
- 需要至少8个对应点
- 使用8点算法(DLT方法)
- 考虑代数误差和几何误差
- 使用RANSAC去除误匹配
基础矩阵的性质:
- 秩为2(有7个自由度)
- 对极线约束:$x'^T F x = 0$
- 可以用于去除误匹配
2.3 本质矩阵和相机参数(Essential Matrix and Camera Parameters):从本质矩阵恢复相机运动
概念的本质:
本质矩阵(Essential Matrix)是基础矩阵在已知相机内参时的形式。从本质矩阵可以分解得到相机的旋转R和平移t,即相机的运动参数。
图解说明:
💡 说明:
- 本质矩阵 E E E: E = K ′ T F K E = K'^T F K E=K′TFK,其中 K K K是相机内参
- 分解 E E E:从 E E E可以分解得到 R R R和 t t t(有4种可能解,需要选择正确的)
- 相机参数: R R R和 t t t描述了第二幅图像相对于第一幅图像的相机运动
类比理解:
想象你在用两个相机拍摄同一个场景。本质矩阵就像是一个"运动传感器",告诉你第二个相机相对于第一个相机旋转了多少、移动了多少。这就像GPS告诉你你的位置变化一样。
实际例子:
本质矩阵的估计:
- 如果已知相机内参$K$,可以从基础矩阵$F$计算本质矩阵$E$
- $E = K'^T F K$
从本质矩阵恢复相机参数:
- 本质矩阵$E$可以分解为$R$和$t$
- 有4种可能的解,需要选择正确的(通过三角化测试)
- $R$是$3 \times 3$旋转矩阵,$t$是$3 \times 1$平移向量
相机参数的意义:
- $R$:第二幅图像相对于第一幅图像的旋转
- $t$:第二幅图像相对于第一幅图像的平移
- 这些参数描述了相机的运动
2.4 三角化(Triangulation):从对应点和相机参数计算三维点
概念的本质:
三角化是从两幅图像中的对应点和已知的相机参数计算三维点坐标的过程。利用两条射线(从相机中心到图像点)的交点来确定三维点的位置。
图解说明:
💡 说明:
- 三角化原理:从两个相机中心分别向对应的图像点画射线,两条射线的交点就是三维点
- 计算方法:使用最小二乘法求解,因为两条射线可能不完全相交(由于噪声)
- 结果:得到稀疏的三维点云(特征点对应的3D点)
类比理解:
想象你在用双眼看一个物体。你的左眼看到物体在某个方向,右眼也看到物体在某个方向。你的大脑会自动计算这两条视线的交点,确定物体的距离和位置。三角化就是计算机视觉中的这个过程。
实际例子:
三角化的步骤:
1. 已知两幅图像中的对应点$x_1$和$x_2$
2. 已知两个相机的参数$R_1, t_1$和$R_2, t_2$
3. 从相机中心向图像点画射线
4. 计算两条射线的交点(使用最小二乘法)
5. 得到三维点坐标
三角化的注意事项:
- 两条射线可能不完全相交(由于噪声)
- 使用最小二乘法求解
- 需要检查点的深度(应该在相机前方)
- 可以用于验证相机参数的正确性
三、多视图SFM(Multi-view SFM):从多张图像重建完整场景
这一章要建立的基础:理解如何将多张图像的三维点云合并成完整的场景
核心问题:如何将多张图像重建的点云合并成统一的坐标系?
[!NOTE]
📝 关键点总结:多视图SFM需要将多张图像重建的点云合并到统一的坐标系中,并使用Bundle Adjustment同时优化所有相机参数和三维点坐标。
3.1 合并点云(Merging Point Clouds):统一坐标系
概念的本质:
当有多张图像时,每两幅图像可以重建一个点云。但这些点云在不同的坐标系中,需要将它们转换到统一的坐标系中合并。
图解说明:
💡 说明:
- 问题:每两幅图像重建的点云在不同的坐标系中
- 解决:找到公共图像(如图像2),将其他点云转换到图像1的坐标系
- 方法:使用图像2的相机参数进行坐标变换
类比理解:
想象你在用多张照片重建一座建筑。每两张照片可以重建一部分,但这些部分在不同的"坐标系"中(就像用不同的尺子测量)。你需要找到它们之间的"连接点"(公共图像),将所有部分转换到同一个坐标系中,然后拼接起来。
实际例子:
合并点云的过程:
1. 从图像1和图像2重建点云1(在图像1的坐标系中)
2. 从图像2和图像3重建点云2(在图像2的坐标系中)
3. 找到公共图像(图像2)
4. 使用图像2的相机参数将点云2转换到图像1的坐标系
5. 合并两个点云,去除重复点
坐标变换:
- 需要知道图像2在两个重建中的相机参数
- 使用旋转和平移矩阵进行坐标变换
- 确保所有点云在同一个坐标系中
3.2 Bundle Adjustment(光束法平差):同时优化相机参数和三维点
概念的本质:
Bundle Adjustment是一个优化过程,同时优化所有相机的参数(R, t)和所有三维点的坐标,使得重投影误差最小。重投影误差是观测到的图像点位置与根据3D点投影得到的图像点位置之间的差异。
图解说明:
💡 说明:
- 目标函数:最小化重投影误差,即观测值与投影值的差异(单位:像素)
- 优化变量:所有相机的参数 ( R , t ) (R, t) (R,t)和所有三维点的坐标
- 优化方法:使用Levenberg-Marquardt算法(非线性最小二乘)
类比理解:
想象你在用多张照片重建一座建筑。初始的重建可能不够准确(相机位置和建筑形状都有误差)。Bundle Adjustment就像是一个"精修师",同时调整相机的位置和建筑的形状,使得所有照片都能最好地"解释"观测到的图像点。这就像拼图时,你不仅调整拼图片的位置,还微调拼图片的形状,使得整体最匹配。
实际例子:
Bundle Adjustment的目标:
- 输入:观测到的2D图像点位置
- 输出:优化的相机参数和3D点坐标
- 目标:最小化重投影误差
重投影误差:
- 观测值:图像中实际检测到的点位置
- 投影值:根据3D点和相机参数投影得到的点位置
- 误差:两者之间的差异(单位:像素)
优化方法:
- 使用Levenberg-Marquardt算法
- 实际中可以使用Ceres Solver(Google的开源优化库)
- 需要好的初始值(从两视图重建得到)
Bundle Adjustment的重要性:
- 提高重建精度
- 处理累积误差
- 是SFM流程中的关键步骤
3.3 初始化的重要性(Initialization Matters):好的初始值很重要
概念的本质:
Bundle Adjustment是一个非线性优化问题,需要好的初始值才能收敛到正确的解。初始值通常来自两视图重建的结果。
图解说明:
💡 说明:
- 非线性优化:Bundle Adjustment是非线性优化问题,可能有多个局部最优解
- 初始值:好的初始值(接近真实值)可以确保收敛到正确的解
- 两视图重建:初始值通常来自两视图重建的结果
类比理解:
想象你在一个有很多山峰的地形中寻找最高峰。如果你从正确的位置开始(好的初始值),你会找到真正的最高峰。但如果你从错误的位置开始(差的初始值),你可能会被困在一个小山峰上(局部最优解)。Bundle Adjustment也是一样,需要好的初始值。
实际例子:
初始值的重要性:
- Bundle Adjustment是非线性优化,可能有多个局部最优解
- 好的初始值可以确保收敛到正确的全局最优解
- 差的初始值可能导致收敛到错误的局部最优解
初始值的来源:
- 通常来自两视图重建的结果
- 需要选择好的图像对(有足够的重叠和特征点)
- 逐步添加更多图像和点
初始化策略:
- 从最好的两视图对开始
- 逐步添加更多图像
- 每次添加后都进行Bundle Adjustment
- 确保每一步都有足够的约束
四、多视图立体视觉(Multiple View Stereo):生成密集的三维点云
这一章要建立的基础:理解如何从稀疏点云生成密集的三维点云
核心问题:如何从多视图生成密集的三维点云?
[!NOTE]
📝 关键点总结:多视图立体视觉(MVS)使用匹配传播的方法,从稀疏的特征点匹配开始,逐步传播到周围区域,生成密集的三维点云。
4.1 MVS的基本思想(MVS Basics):从稀疏到密集
概念的本质:
SFM只能生成稀疏的三维点云(特征点对应的3D点)。MVS的目标是生成密集的三维点云,覆盖整个场景的表面。MVS使用匹配传播的方法,从稀疏匹配开始,逐步传播到周围区域。
图解说明:
💡 说明:
- SFM输出:稀疏的三维点云(只有特征点对应的3D点)
- MVS目标:生成密集的三维点云(覆盖整个场景表面)
- 方法:匹配传播,从已知匹配开始,逐步传播到周围区域
类比理解:
想象你在用画笔填充一幅画的轮廓。SFM就像先画出轮廓(稀疏的关键点),MVS就像填充细节(密集的点)。匹配传播就像从已知的区域开始,逐步向周围扩散,填充整个区域。
实际例子:
MVS的输入和输出:
- 输入:多张图像、相机参数(从SFM得到)、稀疏点云
- 输出:密集的三维点云
MVS的挑战:
- 需要找到所有像素的对应关系(不仅仅是特征点)
- 需要处理遮挡、重复纹理等问题
- 计算量大
MVS的方法:
- 匹配传播:从已知匹配开始,逐步传播
- 使用ZNCC(零均值归一化互相关)作为匹配度量
- 只在可匹配区域传播(纹理丰富的区域)
4.2 匹配描述符ZNCC(ZNCC Descriptor):对光照变化鲁棒的匹配度量
概念的本质:
ZNCC(Zero-mean Normalized Cross-Correlation,零均值归一化互相关)是一种匹配度量,用于比较两个图像块的相似性。它对线性光照变化不敏感,在纹理区域和均匀区域都有良好的表现。
图解说明:
💡 说明:
- ZNCC:零均值归一化互相关,用于比较两个图像块的相似性
- 优点:对线性光照变化不敏感(如亮度、对比度变化)
- 范围:ZNCC值在-1到1之间,值越大表示越相似
类比理解:
想象你在比较两张照片中的同一个物体,但光照不同(一张在阳光下,一张在阴影中)。ZNCC就像是一个"智能比较器",能够忽略光照差异,专注于物体的实际特征(纹理、形状等)。这就像你能够认出同一个人,无论他是在阳光下还是在阴影中。
实际例子:
ZNCC的优势:
- 对线性光照变化不敏感(亮度、对比度变化)
- 在纹理区域表现好(能区分不同的纹理)
- 在均匀区域更保守(不容易误匹配)
ZNCC vs 其他度量:
- 比绝对差值和平方差值更鲁棒
- 在纹理区域对噪声更容忍
- 在均匀区域更保守,减少误匹配
ZNCC的计算:
- 先对图像块进行零均值化(减去均值)
- 然后归一化(除以标准差)
- 计算互相关
- 结果在-1到1之间
4.3 匹配传播(Matching Propagation):从种子点传播到周围区域
概念的本质:
匹配传播是从已知的匹配点(种子点)开始,逐步向周围区域传播匹配的过程。使用优先级队列维护候选匹配,优先处理相似度高的匹配,逐步扩展匹配区域。
图解说明:
💡 说明:
- 种子点:从SFM得到的稀疏匹配点作为种子
- 优先级队列:维护候选匹配,按ZNCC值排序
- 传播过程:从队列中取出最佳匹配,检查其邻域,添加新候选匹配
- 安全措施:处理唯一性约束,只在可匹配区域传播
类比理解:
想象你在填充一幅拼图。匹配传播就像:
- 种子点:先放置一些关键拼图片(从SFM得到)
- 优先级队列:准备一堆候选拼图片,按匹配度排序
- 传播:从最匹配的拼图片开始,向周围扩展,找到相邻的拼图片
- 安全措施:确保每块拼图片只放置一次,只在有足够纹理的区域放置
实际例子:
匹配传播的算法:
1. 初始化:
- 将所有种子匹配(从SFM得到)放入优先级队列Q
- 使用ZNCC值作为优先级
2. 迭代过程:
- 从Q中取出ZNCC值最高的匹配
- 检查其空间邻域,找到新的候选匹配
- 计算新候选匹配的ZNCC值
- 如果满足条件,添加到结果中
- 将新候选匹配添加到Q中
3. 安全措施:
- 唯一性约束:每个像素只匹配一次
- 可匹配区域:只在纹理丰富的区域传播(梯度大于阈值)
- 避免在均匀区域传播(容易误匹配)
匹配传播的优势:
- 从可靠的匹配开始(种子点)
- 逐步扩展到周围区域
- 使用优先级队列确保先处理最可靠的匹配
- 安全措施减少误匹配
4.4 可匹配区域(Matchable Area):只在纹理丰富的区域匹配
概念的本质:
不是图像中的所有区域都适合匹配。可匹配区域是纹理丰富的区域(梯度大于阈值),这些区域有足够的特征可以进行可靠的匹配。在均匀区域(如白墙、天空)很难进行可靠的匹配。
图解说明:
💡 说明:
- 可匹配区域:梯度大于阈值的区域,有足够的纹理特征
- 不可匹配区域:梯度小于阈值的均匀区域(如白墙、天空)
- 作用:只在可匹配区域进行匹配传播,避免误匹配
类比理解:
想象你在比较两张照片,寻找相同的特征。可匹配区域就像照片中有明显特征的地方(如窗户、门、纹理),这些地方容易识别和匹配。不可匹配区域就像照片中空白的地方(如白墙、天空),这些地方没有特征,很难进行可靠的匹配。
实际例子:
可匹配区域的判断:
- 计算图像梯度(衡量纹理丰富程度)
- 如果最大梯度 > 阈值,则是可匹配区域
- 否则是不可匹配区域(均匀区域)
可匹配区域的例子:
- 纹理丰富的区域:砖墙、草地、树叶
- 有边缘的区域:窗户边缘、门框
- 有角点的区域:建筑物的角
不可匹配区域的例子:
- 均匀区域:白墙、天空、水面
- 这些区域没有足够的特征进行可靠匹配
匹配传播的限制:
- 只在可匹配区域进行匹配传播
- 避免在均匀区域传播(容易误匹配)
- 提高匹配的可靠性
📝 本章总结
核心要点回顾:
-
Structure from Motion(SFM):
- 从运动的相机图像中同时恢复三维场景结构和相机运动
- 输出稀疏的三维点云和相机参数
-
两视图重建:
- 特征点检测 → 特征描述 → 特征匹配 → 基础矩阵 → 本质矩阵 → 三角化
- 从两张图像重建三维点的基本流程
-
基础矩阵和本质矩阵:
- 基础矩阵描述两视图之间的几何关系
- 本质矩阵在已知相机内参时的形式,可以分解得到相机运动
-
多视图SFM:
- 合并多个点云到统一坐标系
- Bundle Adjustment同时优化所有相机参数和三维点
-
多视图立体视觉(MVS):
- 从稀疏点云生成密集的三维点云
- 使用匹配传播和ZNCC描述符
知识地图:
关键决策点:
- 选择图像对:选择有足够重叠和特征点的图像对进行两视图重建
- 估计基础矩阵:使用8点算法和RANSAC去除误匹配
- 合并点云:找到公共图像,统一坐标系
- Bundle Adjustment:需要好的初始值,使用非线性优化
- MVS匹配:只在可匹配区域(纹理丰富)进行匹配传播
- 应用场景:根据应用需求选择合适的SFM和MVS方法
📚 延伸阅读
推荐资源
-
Szeliski’s Book: Computer Vision: Algorithms and Applications, Chapter 7
- 详细的SFM理论和实践
-
经典论文:
- “Building Rome in a Day” - 大规模SFM重建
- “Accurate, Dense, and Robust Multi-View Stereopsis” - PMVS方法
-
实践项目:
- SFMedu程序:学习SFM的完整实现
- 使用Ceres Solver进行Bundle Adjustment
- 实现匹配传播算法
-
实际应用:
- Google Street View:街景重建
- Photo Tourism:从网络照片重建地标
- SLAM:机器人同时定位与建图
3331

被折叠的 条评论
为什么被折叠?



