1. 核心数学原理
1.1 问题定义
给定N张已标定影像{Ii}及对应相机内外参{Ki,Ri,ti},求解场景中每个三维点P(X,Y,Z)在所有可见影像上的投影一致性,生成稠密三维点云。
1.2 核心公式
投影方程:pi=Ki[Ri∣ti]P,pi=(ui,vi,1)为齐次坐标 PatchMatch 代价函数:
C(p,d)=∑j∈N(p)ρ(I1(q),I2(Hd(q)))
d为深度,Hd为深度d对应单应矩阵,ρ为相似度度量,N(p)为邻域窗口
- 深度转三维坐标:
P=R1−1(K1−1dp1−t1)
1.3 主流相似度度量
方法 |
适用场景 |
SAD |
光照均匀、纹理丰富区域 |
NCC |
光照线性变化场景 |
Census |
光照非线性变化场景 |
2. 工程化算法分类
2.1 基于深度图的 MVS(主流)
核心:逐影像估计深度图,融合为全局点云 代表:COLMAP MVS、OpenMVS、MVSNet 优势:并行度高、内存可控、支持大场景 指标:1280×960 影像深度图估计 < 10s(RTX 3090)
2.2 基于面片的 MVS
核心:迭代优化三维面片位置与法向 代表:PMVS、CMVS 优势:点云密度高、细节还原好 劣势:计算量大,仅适用于中小场景
2.3 基于体素的 MVS
核心:场景离散化为体素,标记表面体素 代表:Space Carving 优势:拓扑结构正确 劣势:分辨率受限,内存占用大
3. 工程化处理流水线
3.1 输入要求
影像:分辨率≥1280×960,航向重叠≥80%,旁向重叠≥70% 相机参数:内参标定误差≤0.01 像素,外参重投影误差≤0.5 像素 稀疏点云:SfM 输出,点数量≥影像数量 ×100
3.2 核心步骤(OpenMVS)
plaintext
展开
代码语言:JavaScript
自动换行
AI代码解释
InterfaceCOLMAP -i sparse/0 -o scene.mvs DensifyPointCloud scene.mvs \ --resolution-level 1 \ --min-resolution 640 \ --max-resolution 2048 \ --num-views 5 \ --geometric-consistency 1 FusePoints scene_dense.mvs \ --fusion-mode 1 \ --min-num-views 3 \ --max-reprojection-error 2.0 FilterPoints scene_dense.mvs \ --statistical-outlier-removal 1 \ --mean-k 50 \ --stddev-mul-thresh 1.0
3.3 输出结果
格式:PLY 点云(含 XYZ+RGB) 点密度:500-2000 点 /㎡(与影像 GSD 正相关) 效率:1km²/ 天(GSD=5cm,RTX 3090)
4. 精度控制
4.1 评估指标
重投影误差:≤1.0 像素(合格),≤0.5 像素(优秀) 绝对精度:平面≤2×GSD,高程≤3×GSD 完整性:≥95%(与 LiDAR 点云对比)
4.2 误差控制
误差来源 |
量级 |
控制方法 |
相机标定误差 |
1-5 像素 |
20 张以上标定板图像,验证重投影误差 |
影像噪声 |
0.5-2 像素 |
高斯滤波(σ=1.0)预处理 |
纹理缺失 |
5-20 像素 |
重叠度提升至 85%,补充人工标记点 |
遮挡 |
3-10 像素 |
参与匹配影像数量≥5 张 |
融合误差 |
1-3 像素 |
最小可见视角≥3,重投影误差阈值≤2.0 |
5. 常见问题解决方案
问题 |
根因 |
量化解决方案 |
玻璃 / 水面空洞 |
无纹理匹配失败 |
结合 LiDAR 点云补全,LiDAR 点密度≥50 点 /㎡ |
点云分层错位 |
相机外参误差大 |
重新光束法平差,增加地面控制点 |
点云噪声过多 |
深度图估计错误 |
启用几何一致性检查,统计滤波倍数 1.5 |
大场景内存溢出 |
单批次数据过大 |
分块处理,块大小≤500m×500m |
重建速度慢 |
分辨率过高 |
分辨率级别设为 2,最大分辨率 1024 |