基于MVS的三维重建算法学习笔记(一)— MVS三维重建概述与OpenMVS开源框架配置
- 声明
- 1. MVS(Multi-view stereo)概述
- 稀疏重建与稠密重建的区别
- 稀疏重建——SFM(Structure from Motion)算法
- 稠密重建——MVS(Multi-view stereo)方法
- 图像一致性
- 立体匹配
- 2. OpenMVS开源框架
- 介绍
- OpenMVS安装
- OpenMVS测试
- Meshlab下载
- 测试数据集下载
- 1. 稠密重建
- 2. 曲面重建
- 3. 网格优化
- 4. 纹理贴图
- 参考文献和资料
声明
本人书写本系列博客目的是为了记录我学习三维重建领域相关知识的过程和心得,不涉及任何商业意图,欢迎互相交流,批评指正。
1. MVS(Multi-view stereo)概述
MVS(多视点立体视觉,Multi-view stereo)能够单独从图像中构造出高度细节化的3D模型,采集一个庞大的图像数据集,用其来构建出一个用来解析图像的3D几何模型。MVS算法的流程图如下所示,输入为一组图像及其相应的摄像机参数:
- 采集图片;
- 计算每个图片的相机参数;
- 从图像集和相应的摄像机参数中重建场景的三维几何;
- 还原场景的构成材料;
稀疏重建与稠密重建的区别
稀疏重建通常是重建一些图像特征点的三维坐标,稀疏重建主要用于定位。稠密重建又称三维重建,是对整个图像或图像中绝大部分像素进行重建。二者分别对应着MVS三维重建方法中的第二步和第三步:稀疏重建一般使用SFM算法,得到每张图片的相机参数;稠密重建则对应着MVS中最核心的部分,一般所说的MVS算法指的就是稠密重建。
稀疏重建——SFM(Structure from Motion)算法
MVS算法的性能只取决于输入图像的质量和摄像机参数,所以MVS的成功很大程度上归功于底层的用来计算摄像机参数的SFM算法。SFM算法以一组图像作为输入,生成两个信息:每幅图像的摄像机参数和图像中可见的一组三维点,这些点通常被编码为轨迹。 轨迹被定义为重建的3D点的3D坐标和输入图像子集中对应的2D坐标的列表,算法流程如下图所示:
稠密重建——MVS(Multi-view stereo)方法
稠密重建是假设相机参数已知的情况下,寻找空间中具有光度一致性(Photo-consistency)的点,对场景进行立体匹配的过程;
图像一致性
假设对于下面两幅图像和这样一个三维场景,若选择的三维点位于物体的表面上,那么这个三位点根据相机的内外参投影到图像上,以投影点为中心取出两个方形的小patch,那么它们所包含的场景应该是比较类似的;反之,如果这个点在物体外,两个小patch相差是比较大的,若能度量两个patch之间的一致性,就可以衡量这个三维点是否位于物体表面或者位于这个物体表面的概率大小。
立体匹配
立体匹配这一概念贯穿整个MVS方法,其目标就是从不同视角的图像中找到匹配的对应点,从而从二维图像中恢复出三维信息,即通过校正后的一对图像获取到视差图的过程,叫做立体匹配;而通过匹配后得到的视差图就能够转化为深度图,从而从深度图中获取图像的三维信息,完成稠密重建的任务。
2. OpenMVS开源框架
介绍
OpenMVS是一个比较经典的MVS(Multi-View Stereo)开源库,集成三维重建整个完整的技术方案(相机模型,多视立体几何,稠密重建,曲面重建,点云融合,纹理贴图)。在每个重建环节使用的都是非常经典有效的算法,例如包含目前三维重建非常经典有效的深度图重建算法SGM,PatchMatch。综合重建效果和性能,目前MVS是所有开源库中最好的。该框架还涉及Graph Cut、MRF、泊松融合等比较经典的通用算法原理与代码实现,以及常见的点云后处理和网格后处理(去噪、细分,去非流形,补洞)等图形学相关算法。
综合来说,OpenMVS非常适合入门系统学习和二次开发。代码框架非常完善,代码实现清晰且规范,可快速提高项目实战经验。学习三维重建必备。
OpenMVS安装
- Ubuntu 18.04+CMake+git+C/C++编译器(gcc等);
- 替换镜像,加快下载速度,具体参考教程;
- 准备一个空闲的机器安装以下任务:
sudo apt-get update -qq && sudo apt-get install -qq
sudo apt-get -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa- dev
- 安装Eigen(version 3.2,Linux下只能是这个版本):
git clone https://gitlab.com/libeigen/eigen.git --branch 3.2
mkdir eigen_build && cd eigen_build
cmake . ../eigen
make && sudo make install
cd ..
- 安装Boost:
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
- 安装OpenCV(version 2.4 or higher):
sudo apt-get -y install libopencv-dev
- 安装CGAL:
sudo apt-get -y install libcgal-dev libcgal-qt5-dev
- 安装VCGLib(注意要安装2020年的版本,参考教程):
git clone https://github.com/cdcseacave/VCG.git vcglib
- 安装OpenMVS:
git clone https://github.com/electech6/openMVS_comments.git openMVS
mkdir openMVS_build && cd openMVS_build
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="/path to vcglib/vcglib"
其中/path to vcglib/要改为自己系统下的vcglib的路径;
10. 生成OpenMVS库文件(在编译的过程中可能会出现一些warning,不用管,这一步会有许多种类的报错,具体的修改方案参考教程):
sudo make -j2 && sudo make install
OpenMVS测试
OpenMVS可执行文件生成在openMVS/openMVS_build/bin/里面,(-w 设置的是数据的路径,-i 是输入的文件名,-o是输出的文件名),执行命令时在openMVS_build文件夹中打开终端:
Meshlab下载
参考教程
测试数据集下载
链接:https://pan.baidu.com/s/13T04aKJ2OB6_RX7IMMGhpg
提取码:oxkp
下载完的数据如下所示:
1. 稠密重建
./bin/DensifyPointCloud -w /path to data/data -i scene.mvs -o test_dense.mvs
其中/path to data/需要改为data在系统中的路径,运行后得到log和test_dense.ply:
2. 曲面重建
./bin/ReconstructMesh -w /path to data/data -i test_dense.mvs -o test_mesh.mvs
得到log和test_mesh.ply:
3. 网格优化
./bin/RefineMesh -w /path to data/data -i test_mesh.mvs -o test_refinemesh.mvs
得到log和test_refinemesh.ply:
4. 纹理贴图
./bin/TextureMesh -w /path to data/data -i test_refinemesh.mvs -o test_texture.mvs
得到log和test_texture.ply以及test_texture.png:
参考文献和资料
[1]Multi-View Stereo: A Tutorial
[2]三维重建笔记——稠密重建
[3]MVS——multi view system从多视图的密集重建(1)
[4]初识立体匹配