用照片进行三维模型重建

Posted Jtag特工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用照片进行三维模型重建相关的知识,希望对你有一定的参考价值。

用照片进行三维模型重建

在元宇宙的世界里,需要有大量的3D模型。
而3D模型的数量,一直是困扰从2D到3D转型的拦路虎。

以游戏角色建模为例,这些角色背后是无数的雕刻师用996加班和一地的头发换来的。
很多技术同学听说过类似于3DMax和Maya这样的建模工具,不知道是不是了解ZBrush雕刻的过程:

雕刻只是第一步,针对每个具体的领域,还需要专门的工具来辅助。
比如要给人穿上衣服,我们需要有Marvelous Designer来帮我们生成布料这样复杂的效果。

裙子的建模要更复杂一些:

虽然据说3D建模的工具比原画稍好一点点,但是也是需要美术功底的,还需要耐心。

要想低成本制作3D模型,我们的思路还是利用图像算法和深度学习来进行三维重建。

SfM的原理与应用

传统的图像方法是基于多视觉几何原理,从运动中实现3D重建。其基本方法叫作Structure-from-Motion,简称SfM,它通过无时间序列的一系列2D图像来计算三维信息。

大致的流程如下图所示:

图像首先经过解析,然后进行比对,最后通过SfM算法形成一个点云。

openMVG 多视图几何库

我们概念少讲,直接上手实战。我们使用openMVG多视图几何库来使用SfM算法。MVG是Multiple View Geometry的缩写,就是多视图几何。

首先我们要编译openMVG的库。建议使用Ubuntu 18.04系统。

首先我们要编译一个线性代数库eigen。这个是openMVG的外部依赖,还不能通过apt install来安装。

sudo apt -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev
sudo apt -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
git clone https://gitlab.com/libeigen/eigen.git --branch 3.4
mkdir eigen_build && cd eigen_build
cmake ../eigen
make && sudo make install

下面编译安装openMVG库本身:

  1. 安装一堆图形库:sudo apt install libpng-dev libjpeg-dev libtiff-dev libxxf86vm1 libxxf86vm-dev libxi-dev libxrandr-dev
  2. 安装graphviz: sudo apt install graphviz
  3. 下载openMVG代码:git clone --recursive https://github.com/openMVG/openMVG.git
  4. 创建openMVG_build目录:mkdir openMVG_Build
  5. 转到openMVG_build目录:cd openMVG_Build
  6. 生成编译配置文件:cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/
  7. 编译:make -j
  8. 安装:sudo make install

下面我们就可以找个数据集做测试了。
比如我们使用这个:https://github.com/rperrot/ReconstructionDataSet

我们随便取一个,比如第一个AvignonHotelDesMonnaies,教皇城阿维尼翁的莫奈酒店。

由11张照片组成。

我们在openMVG_Build/software/SfM目录下执行:

python SfM_SequentialPipeline.py ~/workspace/ReconstructionDataSet/AvignonHotelDesMonnaies/ ~/workspace/result/

然后会生成result/reconstruction_global/SfMReconstruction_Report.html这个报告文件:

更直观的结果我们可以通过MeshLab软件打开result/reconstruction_global/cloud_and_poses.ply来查看SFM的结果。这就是传说中的点云。

我们再换一个城堡的数据集:https://github.com/openMVG/ImageDataset_SceauxCastle

命令跟上一个一样:

python SfM_SequentialPipeline.py ~/workspace/github/ImageDataset_SceauxCastle/images/ ~/workspace/castle

点云看起来是这个样子的:

OpenMVS 从点云到模型

有了点云还不够,我们还要继续将其变成3D模型。这时候我们需要另一个库openMVS.

  1. 模型格式转换

上一步我们openMVG生成了一个叫sfm_data.bin的文件,我们首先将其转换成openMVS需要的格式:

openMVG_main_openMVG2openMVS -i sfm_data.bin -o scene.mvs -d scene_undistorted_images
  1. 重建成密集点云

通过DensifyPointCloud工具来生成密集点云:

DensifyPointCloud scene.mvs

跟上面的openMVG生成的点云图一对比,是不是差别很明显呢?

  1. 粗网格重建

调用ReconstructMesh工具来对上一步生成的密集点云进行网格重建:

ReconstructMesh scene_dense.mvs

生成的效果如下:

  1. 网格细化

调用RefineMesh工具来进行网格细化:

RefineMesh scene_dense_mesh.mvs

细化之后效果如下:

  1. 网格纹理

最后一步,给网格加上纹理:

TextureMesh scene_dense_mesh_refine.mvs

这一步将生成scene_dense_mesh_refine_texture.glb,我们就大功告成了。

另外,还生成一张纹理图集合供我们参看。

openMVS库的编译

openMVS库用到的第三方库比openMVG要更多,主要有:

  • Eigen
  • Boost
  • OpenCV
  • CGAL
  • VCGLib
  • Ceres
  • GLFW3
  1. 编译Eigen

首先装一系列依赖库:

sudo apt -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-dev

然后下载eigen的源代码,注意是在gitlab上的,github上已经不维护了。

git clone https://gitlab.com/libeigen/eigen.git --branch 3.4

接着就是cmake的标准过程了:

cd eigen
mkdir build
cd build
cmake ..
make 
sudo make install
  1. 安装Boost, OpenCV, CGAL
sudo apt -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
sudo apt -y install libopencv-dev
sudo apt -y install libcgal-dev libcgal-qt5-dev
  1. 下载VCG源代码
git clone https://github.com/cdcseacave/VCG.git vcglib

最后编译时源码引入,不用编译

  1. 编译Ceres-solver

先安装库:

sudo apt -y install libatlas-base-dev libsuitesparse-dev
sudo apt install libgflags-dev
sudo apt install libgoogle-glog-dev

接着下载源代码:

git clone https://github.com/ceres-solver/ceres-solver

注意,2.1以上的版本使用了std::exclusive_scan,如果你用的gcc版本较老,比如gcc7,请checkout 2.1.0版本。

cmake编译还是老套路:

mkdir build
cd build
cmake ..
make
sudo make install
  1. 编译openMVS

如果前面都成功了,主要是库安装都OK的话,下面就可以编译openMVS了。

git clone https://github.com/cdcseacave/openMVS.git
mkdir build2
cd build2
cmake .. -DVCG_ROOT="$main_path/vcglib"
make -j
sudo make install
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于用照片进行三维模型重建的主要内容,如果未能解决你的问题,请参考以下文章

用照片进行三维模型重建

用照片进行三维模型重建

3D重建中的可视外壳(visual hull)

22个最流行的三维重建软件2022

深度学习背景下的图像三维重建技术进展综述

三维重建方法