三维重建是一个计算机视觉领域经典的问题,近年来也出现了许多利用深度学习直接从图像中得到网格的方法,取得了很好的效果。本文主要关注三维重建的经典实现方法,其步骤为:
这些步骤已经有许多三维重建框架来实现,主要框架对比如下:
本文主要利用openMVG+openMVS来实现三维重建
本文的环境是在Ubuntu 16.04 LTS下进行配置的
openMVG配置过程主要参考这里。
首先进行外部库的安装
sudo apt-get install libpng-dev libjpeg-dev libtiff-dev libxxf86vm1 libxxf86vm-dev libxi-dev libxrandr-dev
如果想要看.svg文件,安装Graphviz(可选)
sudo apt-get install graphviz
下载并切换到openMVG目录
git clone --recursive https://github.com/openMVG/openMVG.git
mkdir openMVG_Build && cd openMVG_Build
配置并生成(需要安装cmake)
cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/
cmake --build . --target install
测试,我在此处测试失败了,但是不影响使用效果
make test
openMVG配置过程主要参考这里。
首先更新apt-get并安装外部库,原文还指定main_path=pwd
,可以省略,其作用是当做后面的路径,需要换成自己的安装位置
sudo apt-get update -qq && sudo apt-get install -qq
sudo apt-get -y install build-essential git mercurial cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev libxmu-dev libxi-dev
安装Eigen
hg clone https://bitbucket.org/eigen/eigen#3.2
mkdir eigen_build && cd eigen_build
cmake . ../eigen
make && sudo make install
安装Boost
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
安装OpenCV
sudo apt-get -y install libopencv-dev
安装CGAL
sudo apt-get -y install libcgal-dev libcgal-qt5-dev
安装VCGLib
git clone https://github.com/cdcseacave/VCG.git vcglib
安装Ceres,原文从https://ceres-solver.googlesource.com/ceres-solver下载会提示失败,因此换了一个下载地址
sudo apt-get -y install libatlas-base-dev libsuitesparse-dev
git clone https://github.com/ceres-solver/ceres-solver ceres-solver
mkdir ceres_build && cd ceres_build
cmake . ../ceres-solver/ -DMINIGLOG=ON -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j2 && sudo make install
cd ..
安装GLFW3(可选)
sudo apt-get -y install freeglut3-dev libglew-dev libglfw3-dev
下载openMVS,此处-DVCG_ROOT需指定为安装vcglib的路径,如果想把openMVS作为库使用,在最后加上-DBUILD_SHARED_LIBS=ON
git clone https://github.com/cdcseacave/openMVS.git openMVS
mkdir openMVS_build && cd openMVS_build
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="$~/openMVS/vcglib"
安装openMVS库(可选)
make -j2 && sudo make install
如果安装了Anaconda,此处会报错
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2
因为make会自动采用Anaconda的gcc,但是其版本过低会导致make失败,解决方案是暂时移走Anaconda3/lib下的libuuid库文件
ls ~/Anaconda3/lib/libuuid*
mkdir ~/Anaconda3/libuuid
mv ~/Anaconda3/lib/libuuid* ~/Anaconda3/libuuid
等make完成以后再将文件移回即可
mv ~/Anaconda3/libuuid ~/Anaconda3/lib/libuuid*
下面就可以使用openMVG+openMVS实现三维重建了
我采用的测试图片如下:https://github.com/openMVG/ImageDataset_SceauxCastle。首先切换到图片目录后开始执行指令,需要指定相机焦距-f,大致可以由图像长乘以1.2估计得到,例如图像长宽为1280×720,则焦距估计为1280×1.2=1536。
openMVG_main_SfMInit_ImageListing -i <images-dir> -f focal_length -o <output-dir>
openMVG_main_ComputeFeatures -i <output-dir>/sfm_data.json -o <output-dir>
openMVG_main_ComputeMatches -i <output-dir>/sfm_data.json -o <output-dir>
openMVG_main_IncrementalSfM -i <output-dir>/sfm_data.json -m <output-dir> -o <output-dir>/reconstruction
openMVG_main_ComputeSfM_DataColor -i <output-dir>/reconstruction/sfm_data.bin -o <output-dir>/colored.ply
openMVG_main_ComputeStructureFromKnownPoses -i <output-dir>/reconstrution/sfm_data.bin -m . -o <output-dir>/reconstruction/robust.bin -f <output-dir>/matches.f.bin
openMVG得到的稀疏点云结果可以用meshlab打开:
openMVS可以很好地与openMVG对接,其主要的作用是进行稠密点云重建、网格重建与纹理映射。-d 4与–resolution-level=4的作用是为了简化运算,减小了重建的网格数量与精细程度
openMVG_main_openMVG2openMVS -i <output-dir>/reconstruction/robust.bin -o scene.mvs
DensifyPointCloud scene.mvs
ReconstructMesh -d 4 scene_dense.mvs
RefineMesh --resolution-level=4 scene_dense_mesh.mvs
TextureMesh scene_dense_mesh_refine.mvs
最后得到的效果:
[1] https://leohope.com/%E8%A7%A3%E9%97%AE%E9%A2%98/2018/03/06/compare-re3d-system/
[2] https://www.itread01.com/content/1543864993.html
[3] http://www.ishenping.com/ArtInfo/3737460.html
[4] https://blog.csdn.net/weixin_41631970/article/details/87893750
[5] https://www.youtube.com/watch?v=ELHOjC_V-FE&t=1134s