从零到一:手把手教你用OpenMVG+OpenMVS重建自己的数据集(附避坑指南)

发布时间:2026/7/6 12:55:35
从零到一:手把手教你用OpenMVG+OpenMVS重建自己的数据集(附避坑指南) 1. 环境准备避坑从系统配置开始第一次用OpenMVGOpenMVS重建自己的照片集时我在环境配置上栽了不少跟头。这里分享下实测可用的方案推荐使用Ubuntu 20.04 LTS系统内存建议16GB以上处理50张手机照片至少需要8GB。显卡不是必须的但如果有NVIDIA显卡并安装CUDA后续密集点云处理能快3-5倍。安装依赖时最容易出现libjpeg版本冲突。建议按这个顺序操作# 先安装OpenMVS的依赖 sudo apt-get install -y git cmake libpng-dev libjpeg-dev libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev libopencv-dev libcgal-dev libglfw3-dev libomp-dev关键提示一定要先装OpenMVS再装OpenMVG我试过反过来操作结果在稠密重建阶段出现诡异的图像加载失败最后发现是两个库的libjpeg版本不兼容导致的。编译OpenMVG时记得修改CMakeLists.txt# 找到openMVG/src/CMakeLists.txt # 注释掉以下段落避免使用内部jpeg库 #if (DEFINED OpenMVG_USE_INTERNAL_JPEG) # message(STATUS LIBJPEG (internal)) #else() # message(STATUS LIBJPEG (external)) #endif()2. 数据采集的黄金法则用手机拍了一组校园雕塑的照片结果重建出来全是碎片。后来发现是拍摄方式有问题这里总结几个实测有效的技巧拍摄动线像削苹果皮一样环绕物体拍摄相邻照片重叠度要超过60%。我习惯先水平绕一圈每15°拍一张再上下倾斜30°绕第二圈避坑要点避免纯色墙面背景特征点不足关闭美颜滤镜会破坏纹理细节固定曝光参数自动曝光会导致颜色不一致手机参数用专业模式锁定焦距iPhone用户可以用Halide这类APP。我的华为P40 Pro设置参数焦距5.58mm后面会用到这个值实测案例处理20张1280x720照片只需3分钟但同样数量的4000x3000照片要25分钟。建议手机拍摄分辨率设为1080P足够3. 相机参数处理实战非专业相机的参数设置是个大坑。OpenMVG需要知道传感器宽度(sensor_width)这个值在官方数据库sensor_width_camera_database.txt里可能没有。以我的华为手机为例用exiftool查看照片元数据exiftool -Model -FocalLength -FocalLengthIn35mmFormat your_photo.jpg得到关键参数Model: CLT-AL00 Focal Length: 5.58 mm在sensor_width_camera_database.txt末尾添加计算公式传感器宽度35mm等效焦距/实际焦距*36CLT-AL00;5.94遇到报错Could not find sensor width for this camera时可以临时用相近型号替代但重建精度会下降约15%。4. OpenMVG完整工作流准备好/dataset/images文件夹后按这个顺序执行# 1. 生成图像列表 openMVG_main_SfMInit_ImageListing -i /dataset/images -o /dataset/matches -d /usr/local/share/openMVG/sensor_width_camera_database.txt # 2. 计算特征点AKAZE算法比SIFT快3倍 openMVG_main_ComputeFeatures -i /dataset/matches/sfm_data.json -o /dataset/matches -m AKAZE_FLOAT # 3. 特征匹配-n Nearest匹配模式适合新手 openMVG_main_ComputeMatches -i /dataset/matches/sfm_data.json -o /dataset/matches -n NEAREST # 4. 增量式重建全局重建需要更多内存 openMVG_main_IncrementalSfM -i /dataset/matches/sfm_data.json -o /dataset/reconstruction -m /dataset/matches常见报错解决方案Failed to load image XXX检查路径深度不要超过3层Not enough matches found回到步骤2改用SIFT算法卡在Choosing initial pair手动输入两个数字选择初始匹配对5. OpenMVS稠密重建技巧转换数据格式时要注意openMVG_main_openMVG2openMVS -i /dataset/reconstruction/sfm_data.bin -o /dataset/mvs/scene.mvs这三个步骤最吃硬件资源# 1. 稠密点云显存不足加--resolution-level 2 DensifyPointCloud /dataset/mvs/scene.mvs # 2. 网格重建CPU线程数设为核数-2 ReconstructMesh /dataset/mvs/scene_dense.mvs --threads 6 # 3. 纹理映射内存不足时加--resolution-level 1 TextureMesh /dataset/mvs/scene_dense_mesh.mvs遇到内存爆炸怎么办我总结的应急方案在scene.mvs里降低resolution参数默认1改为2用split命令分割场景适合大场景虚拟内存大法swap分区设置20GB以上sudo fallocate -l 20G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile6. 效果优化与可视化用MeshLab查看scene_dense_mesh.ply时可以过滤噪点Filters Cleaning and Repairing Remove Isolated Pieces平滑表面Filters Smoothing... Laplacian Smooth增强纹理Filters Texture Parametric Texture Atlas最后提醒重建质量取决于最差的那张照片。有次我20张照片里混入一张模糊的整个模型就崩了。建议先用openMVG_main_QualityEvaluation筛选不合格照片。