使用Colmap+OpenMVS进行物体的三维重建

一、准备工作
1.1 下载Colmap:https://demuc.de/colmap/#download
选择cuda版本的进行下载。
1.2 下载OpenMVS,可以选择下载源码自行编译也可以选择封装好的可执行程序。
Github源码:https://github.com/cdcseacave/openMVS
可执行程序:https://github.com/cdcseacave/openMVS_sample
1.3 在终端中输入nvidia-smi根据显卡驱动的信息下载对应版本的cuda

二、使用Colmap生成稠密点云
2.1 新建文件夹并在该文件夹中创建一个images文件夹,将需要重建的图片放入images中,注意文件路径中不能出现中文和空格。我使用51张由C4D生成的卫星模型图进行三维重建。


使用自建数据集时注意:
①尽量使用单反相机或专业数码相机进行数据采集,如果要用手机进行采集,请使用单摄像头的手机进行数据采集。
②尽量选择纹理丰富的外界环境进行数据采集,避免玻璃围墙、瓷砖和打蜡地板等强反光材料环境以及完全没有纹理的场景。
③尽量选择光照明亮,且光照条件变化不剧烈的环境,最好选择室内环境。如室内客厅,开启客厅大灯进行灯光补偿。
④尽量围绕重建物体或环境采集较多的影像,且在采集过程中控制快门速度,避免模糊。
2.2 打开1.1中下载的Colmap文件夹,启动COLMAP.bat,点击File→New Project创建一个新项目,在Database栏中点击New并进入2.1创建的文件夹目录中,使用colmap自带的sqlite工具创建一个.db文件,输入名字并保存;在Images栏中选择刚刚创建的images文件夹,最后save。




2.3 点击Processing → Feature Extraction,相机模型选择PINHOLE,点击Extract获取图片特征。


2.4 点击Processing → Feature matching → Run,对获取到的特征点进行匹配,使用默认参数既可。


2.5 点击Reconstruction → Start reconstruction,开始重建,colmap会生成对应的稀疏点云和各个视角的相机姿态,等待执行完毕。


2.6 在之前image的同级目录下创建一个dense文件夹,点击Reconstruction → Dense reconstruction,点击select,选择刚刚创建的dense文件夹用来保存稠密重建的结果。点击Undistorion对图像进行去畸变,点击Stereo对每张图片生成深度图(此过程需要较长时间),等待深度图生成后点击fusion进行基于深度图融合的稠密重建。


三、使用OpenMVS重建模型
使用编译好的openmvs_sample进行重建工作。
3.1 首先将生成的稠密点云以及图片信息转换成openmvs支持的.mvs文件。在openmvs_sample中的bin文件内打开终端,执行命令:.\interfaceCOLMAP.exe -i D:\Reconstruction\academy\dense -o D:\Reconstruction\academy\dense\scene.mvs --image-folder D:\Reconstruction\academy\dense\images

在dense文件夹下生成了scene.mvs文件。
3.2 进行重建操作,执行命令:
.\ReconstructMesh.exe -i D:\Reconstruction\academy\dense\scene.mvs -o D:\Reconstruction\academy\dense\mesh.mvs

生成mesh.mvs文件
注意,执行此步骤时可能会报错无法找到某路径下的图片,根据报错的路径提示将2.1中的image文件夹复制过去即可。
3.3 对3.2中生成的模型添加纹理,执行命令:
.\TextureMesh.exe -i D:\Reconstruction\academy\dense\mesh.mvs

3.4 对mesh.mvs文件使用OpenMVS的可视化工具Viewer.exe进行可视化:
.\Viewer.exe -i D:\Reconstruction\academy\dense\mesh_texture.mvs


和原模型相比,建模出现空洞可能的原因是表面有反光、使用C4D生成的图片分辨率不高(每张图仅有100k不到)可用特征过少,导致深度图生成精度不高,后续在获取图片的时候可以选择其他角度,同时提高生成图像的质量。
原理:
Colmap使用SIFT算法对特征点进行提取,利用特征描述向量找到有场景重叠的景象,即特征匹配;然后根据采集到的信息,使用SfM的方法进行稀疏重建,输出目标的稀疏点云和场景中全部的相机参数。对图像进行去畸变操作后,使用MVS(Mutli-View Stereo)来计算图像中每个像素的深度和法向信息,利用深度图的配准原理融合多个图像的深度图,最终产生稠密点云。
之后使用OpenMVS对稠密点云进行网格重建,重建后可以对mesh文件进行网格细化操作;最后输入网格文件、相机位姿、照片,对网格文件进行纹理贴图操作,输出带有纹理贴图的网格模型。
总结:
COLMAP可以用于快速三维重建,代码封装良好,使用方便。但深度图估计速度过慢,切在深度图估计的精度上略低于深度学习方法。同时为了增加泛用性和鲁棒性以及保证重建速度,使用了Colmap中的默认参数进行三维重建,所以对于特定场景或物体的重建效果可能不理想,后续可以详细学习源码来对其中参数进行调整,或者在源码的基础上对算法进行优化,使其更符合我们需要的场景。
参考文章:
Colmap官方文档:https://colmap.github.io/database.html
https://zhuanlan.zhihu.com/p/566828254
https://zhuanlan.zhihu.com/p/183673331
https://blog.csdn.net/weixin_44543463/article/details/125628410
自学习用,侵删