COLMAP多视图立体实战:一组照片如何变成稠密三维模型
COLMAP多视图立体实战一组照片如何变成稠密三维模型【免费下载链接】colmapCOLMAP - Structure-from-Motion and Multi-View Stereo项目地址: https://gitcode.com/GitHub_Trending/co/colmap你绕着一件文物拍了两百张照片打开COLMAP做三维重建出来的模型却满是窟窿。墙面断裂、花纹丢失点云没法用。问题通常不出在拍摄而出在多视图立体MVS环节。它是从多张照片里估计每个像素三维位置的那一步参数不对它就白跑。SfM与MVS的分工为什么稀疏点不够用COLMAP的三维重建分两段。前一段是运动恢复结构SfM从照片里提取特征点在不同照片间找到同一点解出相机位置和一小撮三维点。这些点像钉进场景的标杆只落在有纹理的地方边角、花纹、边缘。一面白墙拍出来几乎没有点。稀疏点有三个硬伤。不全面无纹理表面没有点有噪声错配没有滤干净不连续没有表面只有一堆孤立的点。工业测量、3D打印、数字化存档拿到的都只能是一堆点没法用。MVS接手后一半。它拿SfM给的相机位姿和稀疏点当参照对每张照片的每个像素估计它的三维位置。做对了输出就是上百万点的稠密点云完整到可以进一步三角化成网格。下面这张是COLMAP真实的SfM输出点贴着建筑轮廓大面积玻璃幕墙和天空完全空着从去畸变图像到网格每个环节如何交接先明确一件事MVS只消费SfM算出来的东西。你得先做完特征提取、匹配和增量重建拿到相机位姿与稀疏点再进稠密重建。深度估计为什么用PatchMatch而不是暴力搜索第一步是图像准备。MVS先把所有照片去畸变变成理想针孔几何再按max_image_size缩放。目的就两个重投影公式统一显存可控。核心是深度估计。每个像素都要回答离相机多远。暴力做法是拿一个小窗口patch在场景中滑动试遍所有深度再比每个深度下patch在其他照片里像不像。搜索空间巨大而且绝大多数是无用的。PatchMatch的思路是先随机猜。每个像素先取少量随机深度值留下得分最好的再做有根据的传播相邻像素的深度通常相近所以优先试用邻居的深度再用越来越小的随机步长精修。搜索集中在真值附近几轮迭代就能收敛。得分由两项加权。一是光度一致性用归一化互相关NCC简单说就是衡量两块图像长得像不像的系数比较patch投到其他图像后的相似度。二是几何一致性看重投影误差即从一张照片猜出的三维点投回另一张照片时偏了几个像素。两项都过关这个深度才可信。整个过程在GPU上并行每张照片输出一张深度图每个像素存一个距离值和一张法向图每个像素存表面朝向。默认值在 patch_match_options.h 里。整条流水线的命令顺序不长colmap feature_extractor --database_path database.db --image_path images colmap exhaustive_matcher --database_path database.db colmap incremental_mapper --database_path database.db --image_path images --workspace_path sparse colmap patch_match_stereo --workspace_path sparse colmap stereo_fusion --workspace_path sparse colmap poisson_meshing --input_path sparse/fused.ply --output_path mesh.ply深度图融合三个阈值怎么定单张照片的深度图一定有错同一个物理位置会被很多张图测到。融合就是投票。对每个深度图像素先反投影成三维点再投到一组其他图像上检查三道阈值重投影误差不超过max_reproj_error默认2.0像素深度差在max_depth_error以内法向夹角在max_normal_error默认10度以内。至少min_num_pixels默认5张图都过关这个点才保留否则当噪声扔掉。输出是融合后的稠密点云规则定义在 fusion.h。网格生成泊松与推进前缘两条路线最后一步把点云变成网格两条路线。泊松重建拿点云法向当线索在八叉树网格上解出连续表面depth参数控制剖分精度默认13结果平滑完整但薄结构可能被抹平。推进前缘法从一个三角形出发逐片生长表面带可见性过滤会把和相机视角矛盾的三角面直接丢掉细节保持得更好。参数分别在 poisson_meshing.h 和 advancing_front_meshing.h。三类场景的调参思路如果场景以低纹理为主白墙、玻璃、素地面NCC那一项很难得分因为patch长得都差不多深度图会全是噪声。这时把window_radius从默认5调到7到9让patch视野更大、更有区分度同时把num_samples从15提到20到30给随机搜索更多命中真值的机会。还不行就先回头补拍拉远机位或增加重叠角度。如果只求快速预览显存又紧张抓手是max_image_size和window_step。把max_image_size设到2000到4000直接降内存把window_step设成2NCC计算隔像素采样源码注释说明速度约按 window_step 的平方提升代价是深度图细节变粗。cache_size默认32GB调小也能压内存代价是磁盘读写变多。如果产出要用于测量或3D打印精度优先重点在融合阶段。把min_num_pixels从5提到8到10只留多视图支撑强的点max_reproj_error保持默认2.0别调大colmap stereo_fusion --workspace_path sparse \ --stereo_fusion.min_num_pixels 8 \ --stereo_fusion.max_reproj_error 2.0三个常见坑与修复大面积空洞、整块侧面缺失。原因通常是那个角度没拍够或深度图被默认阈值判成不稳定而过滤掉了。修复先看稀疏模型里相机朝向确认哪些方向缺视角补拍拍摄够的话把max_reproj_error调到2.5到3.0min_num_pixels降到3到4用一点噪声换完整性。重影、双墙面。原因是相机位姿有偏差同一面物理表面被不同图像测出两个深度融合时两个版本都过关了。修复回查SfM阶段稀疏模型重投影误差偏大的话重跑mapper或收紧匹配融合阶段不要调高max_normal_error保持默认10.0法向不一致正是抓双表面的信号。网格带尖刺毛边或者表面过度平滑。原因是泊松解对噪声法向敏感depth过高会放大噪声过低或trim默认10.0过高会把细节抹掉。修复先把depth降到12或把trim提到20.0剪掉虚假面再不行就换推进前缘法它的可见性过滤更能拒绝与实际视角矛盾的面。第一次跑通可以从仓库里的doc/sample-project示例工程入手参数说明可对照 COLMAP Tutorial。跑通之后再按自己的场景调参数。遇到bug或有功能想法可以去项目页提issue和PR社区一直在跟进。【免费下载链接】colmapCOLMAP - Structure-from-Motion and Multi-View Stereo项目地址: https://gitcode.com/GitHub_Trending/co/colmap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考