4.1 多视图几何与 SfM


4.1 多视图几何与 SfM

本节摘要:SfM 从一堆无序照片同时恢复相机位姿与稀疏三维结构。对极几何提供两视图的几何约束,增量式流水线"两张起家、逐张并入",束调整以重投影误差为货币做全局平差。本节是经典成图路线的主干。

内业第一站:手里只有照片,没有深度。第一章说过单张照片的深度理论上已丢,但两台相机看同一场景,同名点在两张照片上的位置差(视差)携带深度信息——双目原理推广到 N 张无序照片,就是运动恢复结构。名字直译其义:同时恢复"运动"(相机位姿)与"结构"(场景三维点),与第五章 SLAM 是同一枚硬币的离线与在线两面。

对极几何:两视图之间的交通规则

两个相机看同一个点,光心、像点、物点构成的平面叫极平面;它与两张像面的交线叫极线。核心约束:一张照片上的点,在另一张照片上必然落在对应的极线上——搜索范围从整个画面压缩到一条直线。本质矩阵(内参已知时)与基础矩阵(未知内参时)编码了这条规则,八点法用八对同名点线性解出。

对极几何:两视图之间的交通规则

增量式 SfM:两张起家,逐张并入

流水线五步:第一步特征提取与匹配(SIFT 类尺度不变特征,跨视角认出同名点);第二步选一对基线宽、匹配多的照片做初始化,五点法解相对位姿;第三步三角化匹配点得到首批三维点;第四步逐张并入——新照片先由已有三维点投影定位(PnP 问题),再三角化新点,如此滚雪球;第五步束调整做全局平差。

束调整是全流程的灵魂:把所有相机位姿(每台十二或更多参数)与所有三维点放进同一个最小二乘,目标函数是重投影误差平方和——第一章的规范在百万参数规模上兑现。能解它靠两点:雅可比矩阵天然稀疏(每个残差只依赖一台相机与一个点),稀疏舒尔补求解器先把点变量消元、只解相机块。

# 用 Open3D 体验重建与位姿联合优化(接口式示例) import open3d as o3d # 官方示例数据:多视图照片已提取的特征与匹配 # 增量重建的核心调用(生产中通常用 COLMAP 等完整实现) camera = o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimaryColorCamera) rgbd = [] # 逐帧 RGBD(此处以深度路线示意) # 束调整在 Open3D 中的对应物:RGBD 序列的位姿联合优化 volume = o3d.pipelines.integration.ScalableTSDFVolume( voxel_length=4.0 / 512, sdf_trunc=0.04) print('TSDF 体素边长: %.5f 米, 截断阈值: %.2f 米' % (4.0/512, 0.04)) # 输出: TSDF 体素边长: 0.00781 米, 截断阈值: 0.04 米

上面的体素边长与截断阈值这两个数字,是稠密化阶段(下节 TSDF)的关键参数,这里先留个锚点。SfM 的稀疏输出通常是几千到几十万个点,只够"骨架",稠密化由 MVS(多视图立体)完成:逐像素深度估计再融合成稠密点云,下节展开其工程主干。

实战演练:估算一个重建的验收指标

背景:拿到一份 COLMAP 输出的重建报告(真实作业中的标准交付物之一),判定质量等级。操作:核对三项指标。

# 重建质量验收(数值来自一份 400 张街景照片的作业报告) n_cam, n_pts = 400, 487_000 mean_reproj, max_reproj = 0.42, 1.8 # 像素 track_median = 6 # 每点被多少张照片看到的中位数 print('平均重投影误差: %.2f px(合格线 0.5)' % mean_reproj) print('最大重投影误差: %.1f px(合格线 3.0)' % max_reproj) print('轨长中位数: %d(低于 3 的点建议剔除)' % track_median) # 输出: # 平均重投影误差: 0.42 px(合格线 0.5) # 最大重投影误差: 1.8 px(合格线 3.0) # 轨长中位数: 6(低于 3 的点建议剔除) sparse_density = n_pts / n_cam print('每相机锚点数: %d' % sparse_density) # 输出: 每相机锚点数: 1217

结果解读:平均重投影误差零点四二像素达标,但要看分布——若有百分之五的照片误差超一像素,多半是匹配污染或弱纹理平面,应剔除后重跑束调整;轨长中位数六意味着平均每个点被六张照片交叉验证,结构可信。变式:弱纹理墙面常出现"轨长为一"的悬浮点,成图前按轨长过滤是标准清理动作。

⚠️ 常见坑:照片拍得像"传送带"——绕物体一圈但相邻张几乎同视角。初始化 pair 的基线过窄,三角化深度误差按基线倒数放大,整份重建尺度发虚。拍摄纪律:相邻照片重叠六成以上、视角差保持在十度量级。

💡 关键直觉:SfM 与束调整的关系,如同放线与平差——先粗略把网铺开,再用全部观测一起 least squares 收紧每一个结点。

采集纪律清单

SfM 的失败八成在采集端,出发前对照这份清单过一遍能省掉整晚的算力:一,环绕拍摄相邻重叠六成以上,纯环绕不够时加顶部与底部补拍;二,视角变化靠移动位置而不是站在原地变焦,变焦会破坏内参一致性;三,避免玻璃、镜面与大面积空白墙面占画面主体,匹配点会成片消失;四,关闭自动对焦与自动曝光的剧烈跳变,锁定参数拍摄;五,运动模糊是大敌,室内弱光宁可升感光度也不要降快门。拍完当场抽两三对相邻照片看匹配点数量(几十秒的事),低于预期立即补拍——现场发现的采集缺陷是五分钟的代价,回家后才发现是五小时的代价。

本节要点回顾

  • 对极约束把双视图匹配从二维搜索压到一维极线,本质矩阵是其代数形式;
  • 增量式流程:两张初始化、三角化、逐张并入、束调整收官;
  • 束调整是百万参数的稀疏最小二乘,重投影误差是唯一验收货币;
  • 拍摄纪律决定重建上限:重叠度与视角差是采集端可控的两个旋钮;
  • 稀疏骨架稠密化,交给下一节的 TSDF 融合。

有深度相机的话不必绕照片这条路。下一节看消费级扫描仪的内核:深度图融合成图。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U