如何把一组图像转换为3D模型,这可能是三维重建初学者们最常遇到的问题。这个过程融合了计算机视觉、计算机图形学、图像处理等多门学科的知识,是一套非常复杂的工程系统,许多同学想要学习却苦于没有资料参考,导致入门难度大大提高。
在介绍开源系统之前,我们先简单概述一下三维重建的基本原理:
下图给出了各种三维重建开源系统的信息,第一列为开源系统名称,其他列为该系统支持重建的哪些阶段。绿色表示支持,红色表示不支持。
VisualSFM的基本理念是SFM(StructureFromMotion):
安装:
下载好的文件名称叫VisualSFM_windows_32bit.zip,将其解压便可得到exe文件,无需安装。
VisualSFM的操作:
点击“openMultipleImages”按钮,选择所需的图片(运用shift选取),再点击“open”,如下图所示。
在TaskViewerwindow中可以看到处理的步骤及进度,如下图。
2.匹配照片之间的特征点
点击“ComputeMissingMatches”,如下图。
3.进行稀疏重建
点击“Compute3DReconstruction”,如下图。
结果如下图:
4.进行稠密重建
点击“RunDenseReconstruction”,如下图。
选择一个文件放置将要创建的模型,如下图。
在完成上面4步后,基本操作就完成了。
在VisualSFM中,已经根据图像重建出了三维点云,下一步就是使用meshlab把三维点云重建成三维模型。
接下来运行meshlab,如下所示:
打开之后会提示打开使用的图像文件,这里只要选择同目录下的list.txt文件即可,打开后会载入一个稀疏的点云模型。
2.选择File——>ImportMesh,导入00/models中的option-0000.ply文件。如下图所示:
同时可以利用图中的按钮删除一些你不想要的杂点。
3.Filter–>PointSet–>SurfaceReconstruction:Poisson进行网格化。
OctreeDepth:控制着网格的细节,此值越大细节越丰富但占内存越大运行起来慢,一般设10,可慢慢调大。
4.上面的操作会生成一个气泡把模型包起来,接下来使用Filters–>Selection–>Selectfaceswithedgeslongerthan把模型中多余的面去除。
5.修复流型边缘,Filters–>Selection–>SelectNon-Manifoldedges
6.参数化,Filter–>Texture–>Parameterizationfromregisteredrasters
7.投影纹理,Filter–>Texture–>Projectactiverasterscolortocurrentmesh,fillingthetexture
这里可以设置分辨率,512的2的二次方倍:512/1024/2048/4096/8192…分辨率越高,则结果越清晰。
8.ExportMeshas...导出文件,最终结果如下图:
Bundler和CMVS-PMVS是进行多视图三维重建的一套非常有用的工具包。Bundler利用一系列无序图片生成场景的稀疏点云,并且估计每一幅图片的相机参数(内参和外参)。CMVS-PMVS可以利用已知图片以及图片对应相机参数(使用Bundler求得)来进行稠密的三维重建(densereconstruction)。
2.源码下载
直接从github上来下载Bundler和CMVS-PMVS的源码,在linux终端分别输入如下命令,等待下载完成。
3.安装依赖
为了编译和运行Bundler,我们需要安装如下依赖
sudoapt-getinstallliblapack-devlibblas-devminpack-devf2cgfortranjheadimagemagick接下来继续安装SIFT依赖
sudoapt-getinstalllibc6-dev-i386安装CMVS-PMVS依赖
sudoapt-getinstalllibgtk2.0-devlibdevil-devlibboost-all-devlibatlas-cpp-0.6-devlibatlas-devlibcminpack-devlibgfortran3libmetis-edf-devlibparmetis-devfreeglut3-devlibgsl0-dev4.编译Bundler和CMVS-PMVS
首先我们编译Bundler,在linux终端使用cd命令进入到bundler_sfm下,也就是Makefile文件所在的目录,然后在终端输入make命令,回车等待编译完成。编译完成后会在bin目录下会生成可执行文件。为了使Bundler顺利执行,我们还要进行如下操作:
sudocp/usr/bin/jheadbin/sudocpbin/libANN_char.so/usr/lib/接下来我们继续对CMVS-PMVS进行编译,我们依然使用cd命令进入到CMVS-PMVS/program/下,然后依次执行以下命令:
mkdirbuild&&cdbuildcmake..make执行完成后,CMVS-PMVS也就编译完成了,生成的可执行文件位于build目录下的main目录中。为了接下来运行方便,我们将生成的可执行文件cmvs、genOption、pmvs2这三个文件拷贝到bundler_sfm目录的bin下。
5.执行Bundler和CMVS-PMVS进行三维重建
我们可以利用自带的example中的图片进行测试,我们以ET为例来说明如何进行三维重建。首先还是使用cd命令进入到ET文件夹下,然后执行以下命令:
../../RunBundler.sh最终会生成很多的结果文件,其中bundler文件夹下的bundler.out中存储了重建的稀疏点3D坐标和相机参数。
接下来我们就可以利用PMVS进行稠密点云的重建了,在这之前我们还需要将Bundler的输出转换为CMVS-PMVS的输入格式。我们利用bin下的Bundle2PMVS即可完成这一过程。
../../bin/Bundle2PMVSprepare/list.txtbundle/bundle.out此时会生成pmvs目录,在此目录下有prep_pmvs.sh文件,我们编辑此文件,将里边的BUNDLER_BIN_PATH修改为bundler的bin文件夹的实际路径。例如:
BUNDLER_BIN_PATH=/home/chao/AAAAAA/temp/bundler_sfm/bin
然后依次执行如下操作:
shpmvs/prep_pmvs.sh../../bin/cmvspmvs/../../bin/genOptionpmvs/../../bin/pmvs2pmvs/option-0000(注意option之前的空格键)生成的最终结果位于pmvs目录的models文件夹下,名称为option-0000.ply,我们直接使用meshlab打开此文件便可以看到结果。如下图所示:
我们也可以自己拍照片来进行三维重建,但是要注意两个问题
参考资料
解压并运行COLMAP:
2.新建项目
【File】–>【NewProject】
3.新建database文件,选择images所在路径
【New】新建db文件
【Select】选择images所在路径
4.特征提取
【Processing】–>【Featureextraction】
Cameramodel选择【SIMPLE_RADIAL】
参数选择【ParametersfromEXIF】
5.特征匹配
【Processing】–>【Featurematching】
6.稀疏重建
【Reconstruction】–>【Automaticreconstruction】
或者【Reconstruction】–>【Startreconstruction】
Workspacefolder,【Selectfolder】选择项目目录
Imagefolder,【Selectfolder】选择图片路径
7.稠密重建
【Reconstruction】–>【Densereconstruction】
Workspace工作空间,【Select】选择项目目录
【Undistortion】–>【Stereo】稀疏重建-->【Fusion】所有点云融合
8.重建后的点云在COLMAP中可视化不错,也可以用meshlab软件可视化:
mve是加强版的三维重建开源软件,三维重建和纹理映射都有,功能齐全,但在国内用的不多。
系统:ubuntu17.10编译器:gcc7.2.0MVE工具的编译:
或者应用git命令:
可以选择直接阅读手册编译:
也可按照下面内容操作:
1)进入下载好的mve文件夹
应用MVE前准备
同样在上面提到的用户手册(userguide)中,有说如何应用:
按照上述命令,一步一步处理序列图片,可以最终得到三维重建的结果。
不过在输入上述命令的时候,会遇到找不到命令的情况,因为上述的应用还尚未添加到环境变量中,所以不能直接在命令行下使用,所以为了方便使用,将这些所有的工具都添加到环境变量中去,添加环境变量的方式如下:
1)应用vi编辑器打开环境变量的文件(命令如下,即将mve的所有apps都添加到环境变量中):
使用DerHass数据集,里面包含一堆图片,可以把MVE的所有工具都能用一遍,生成一个ply的三维模型:
4.应用MVE
1)下载得到数据集后解压:
2)在上图所示的文件夹,即存放der_hass-20140923文件夹的目录下打开终端,输入命令(der_hass-20140923代表的时待处理的数据集,der_hass代表的是处理后输出的存放数据的文件夹):
最后得到的各种ply文件如图:
最后生成的文件为surface-L2-clean.ply,用meshlab打开的结果为:
用OpenMVS重建的结果如下所示:
详细步骤
OpenMVS依赖的几个开源库,有两个是可选的可以先不安装.
2.安装说明
工具:
3.Linux编译
Ubuntu16.04
opencv中部分函数未定义
先卸载:
sudoapt-getautoremoveopencv-docopencv-datalibopencv-devlibopencv2.4-javalibopencv2.4-jnipython-opencvlibopencv-core2.4libopencv-gpu2.4libopencv-ts2.4libopencv-photo2.4libopencv-contrib2.4libopencv-imgproc2.4libopencv-superres2.4libopencv-stitching2.4libopencv-ocl2.4libopencv-legacy2.4libopencv-ml2.4libopencv-video2.4libopencv-videostab2.4libopencv-objdetect2.4libopencv-calib3d2.4再源码安装,可以安装比如4.1.1版本。
boost报错
解决方法:升级boost==1.6.3
使用说明
OpenMVS可执行文件生成在openMVS/openMVS_build/bin/里面,在openMVS_build文件夹下打开终端,按照顺序执行如下命令:(-w设置的是数据的路径,-i是输入的文件名,-o是输出的文件名)。
稠密重建
./bin/DensifyPointCloud-w/home/**/data/openMVS_sample-iscene.mvs-otest_dense.mvs输出log:
得到的稠密点云test_dense.ply:
曲面重建
./bin/ReconstructMesh-w/home/data-itest_dense.mvs-otest_mesh.mvs输出的log:
生成的网格模型test_mesh.ply:
网格优化
./bin/RefineMesh-w/home/data-itest_mesh.mvs-otest_refinemesh.mvs输出的log:
优化的模型test_refinemesh.ply:
纹理贴图
./bin/TextureMesh-w/home/data-itest_refinemesh.mvs-otest_texture.mvs输出的log:
输出的结果test_texture.plytest_texture.png。
openMVG(OpenMultipleViewGeometry):开源多视角立体几何库,这是一个cv界处理多视角立体几何的著名开源库,信奉“简单,可维护”,提供了一套强大的接口,每个模块都被测试过,尽力提供一致可靠的体验。
CMVS-PMVS(amodifiedversion):将运动结构(SfM)软件的输出作为输入,然后将输入图像分解成一组可管理大小的图像簇。MVS软件可以用来独立和并行地处理每个簇,其中来自所有簇的重建不错过任何细节。
常见的多视图三维重建管线:重建稀疏点云-StructurefromMotion(Sfm)→重建稠密点云-Multi-ViewStereo(MSV)→重建表面-SurfaceGeneration(SG)→纹理映射-TextureMapping(TM)
在本部分中,OpenMVG负责从原始图像到稀疏点云,PMVS负责重建稠密点云、重建表面和纹理映射。
OpenMVG安装过程:
原始数据:11张从不同角度拍摄的城堡照片
右上方俯视城堡稀疏点云:(打开reconstruction_xxx下的colorized.ply或robust.ply)
#1.把openMVG生成的SfM_Data转为适用于PMVS输入格式的文件cdopenMVG/ImageDataset_SceauxCastle/reconstruction_global/openMVG_main_openMVG2PMVS-isfm_data.bin-o./*注:执行后会在-o路径下生成一各PMVS目录,包含models,txt,visualize三个子目录:models为空;txt包含对应图像的txt文档,每个里面都是一个3x4的矩阵,大概是相机位姿;visualize包含11张图像,不确定是原图像还是校正过的图像#2.使用PMVS重建稠密点云、表面、纹理pmvs2./PMVS/pmvs_options.txt#注:不要修改pmvs_options.txt文件名*注:执行后会在./PMVS/models文件夹中生成一个pmvs_options.txt.ply点云文件,用meshlab打开即可看到重建出来的彩色稠密点云。