1. 简介
OpenMVS(Multi-View Stereo reconstruction library)是一个用于多视角立体重建的开源库,用于从多个图像中创建高质量的三维模型。它可以从图像集合中恢复三维几何和纹理信息,以创建更真实的场景重建。
- 注意:openMVS库本身是不具备从image标定相机内外参功能的,因此后续使用的时候还要搭配其它pipeline,如openMVG或者其他sfm-pipeline。
2. 安装openMVS
- 系统环境:windows10,git,vcpkg,cmake(后面三个没有安装的可自行百度,easy)
2.1 下载openMVS项目
openMVS项目链接
在本地随意一个位置输入
git clone https://github.com/cdcseacave/openMVS.git
等待安装即可,失败的大部分情况都是网络问题。
2.2 下载依赖库
使用vcpkg进行库的下载(vcpkg是c++库管理工具,类似于conda,windows下应该没有比vcpkg更好用的c++库管理工具了吧)
vcpkg项目链接
点击链接,按照readme操作就行。
下载后双击bat文件就安装完成(在cmd中直接输入这个文件也行)
# 示例--安装boost库
# 建议先用search查看boost库有哪些版本
.\vcpkg search boost
# 选择合适的版本install
.\vcpkg install boost:x64-windows
# 由于网络原因,可能会失败,重新安装即可
建议安装完所有库后执行下面命令:
.\vcpkg integrate install # 这是告诉系统所有编译器你通过vcpkg安装的所有库的位置,之后写c++代码就可以直接include了,不需要
在手动设置库地址
2.3 安装cmake
下载cmake(自行百度安装,很简单)
安装完成后在cmd输入:
# 目前你已进入openMVS目录
mkdir build(随便取一个名字,建议build或者make)
cd build
cmake .. -DCMAKE_TOOLCHAIN_FILE=你的vcpkg安装路径\scripts\buildsystems\vcpkg.cmake
一般来说,这一步或多或少会遇到错误,我是由于cmake版本过高,CMakeList.txt文件中首行加一句CMAKE_POLICY(SET CMP0146 NEW)就ok了。
2.4 在build目录打开openMVS.sln(visual studio)
打开后界面如下:
右键ALL_BUILD ,点击生成
当然,你也可以按照openMVS项目的readme编译链接也行。
openMVS安装编译结束
3. 跑一跑openMVS示例
3.1 下载scene.mvs文件
前面说过,openMVS是不能直接由image重建三维图像的,因为它没有实现标定image的内外参。
openMVS官方示例在此官方示例
用的是Sceaux Castle的image进行重建
我们的目的是为了测试openMVS是否能用,而不管怎么由images得到mvs文件,所以呢,官方直接替我们生成了openMVS要输入的数据scene.mvs,这个文件是用上面的城堡images进行sfm(用的openMVG库)得到的,文件内容包括相机的内外参、稀疏点云以及对应的images。(后续,如果时间充裕,我会出一个openMVG配合openMVS的使用教程)
下载好scene.mvs文件后,可以用编译好的viewer模块来打开.mvs文件。
把scene.mvs拖到viewer.exe上就能看了(cmd命令行也行: Viewer.exe C:\Users\cv\Downloads\scene.mvs)
3.2 密集点云重建–densifypointcloud
scene.mvs里面只包含稀疏的点云,densifypointcloud.exe利用scene.mvs中提供的相机内外参以及稀疏点云进行图像校正,使image pair 的极线平行,这样就能利用平行的极线约束检测到更多特征(立体匹配内容),得到密集视差图计算深度,实现密集点云重建。
使用方法:
在官方示例中下载图片下载
新建一个文件夹(位置任意,命名任意),比如我的叫testdata,在testdata中新建images文件夹,把下载的image放进去,然后把下载的scene.mvs放在testdata中
命令行进入编译好的目录下(见下图),输入下列命令
等待完成即可(大约需要30分钟),完成后会testdata目录下生成一个scene_dense.mvs文件,可以使用viewer.exe查看效果。
可以看到,MVS生成的密集点云重建效果比sfm好很多
3.3 生成网格模型–reconstructmesh.exe
理论上,MVS的工作已经完成,但是openMVS不止实现密集点云重建,还实现了网格重建以及纹理映射,所以接下来一个一个实验效果。
ReconstructMesh.exe secene_dense.mvs -w E:\3Dreconstruction\openMVS\testdata
生成scene_dense_mesh.mvs 文件(这个过程很快)
3.4 网格细化–refinemesh
RefineMesh.exe secene_dense_mesh.mvs -w E:\3Dreconstruction\openMVS\testdata
生成secene_dense_mesh_refine.mvs(这个过程需要很长时间,可以查看命令行参数,修改默认meshrefine参数)
3.5 纹理映射–texturemesh
TextureMesh.exe secene_dense_mesh.mvs -w E:\3Dreconstruction\openMVS\testdata
生成secene_dense_mesh_texture.mvs,这个过程大约30分钟