三維重建簡介
三維重建是一個計算機視覺領域經典的問題,近年來也出現了許多利用深度學習直接從圖像中得到網格的方法,取得了很好的效果。本文主要關注三維重建的經典實現方法,其步驟爲:
- 通過相機獲取一系列三維物體不同側面的圖片
- 對相機的內外參數進行標定
- 對圖像中的特徵進行提取(如SIFT、SURF等)
- 從匹配得到的信息中構建三維稀疏點雲
- 根據稀疏點雲進行稠密點雲重建
- 對點雲進行預處理(如去噪、下采樣等)
- 進行網格重建
- 進行紋理映射
這些步驟已經有許多三維重建框架來實現,主要框架對比如下:
本文主要利用openMVG+openMVS來實現三維重建
環境配置
本文的環境是在Ubuntu 16.04 LTS下進行配置的
openMVG
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
openMVS
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實現三維重建了
openMVG
我採用的測試圖片如下: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
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