linux下使用Bundler + CMVS-PMVS进行三维重建

一、简介

Bundler和CMVS-PMVS是进行多视图三维重建的一套非常有用的工具包。Bundler利用一系列无序图片生成场景的稀疏点云,并且估计每一幅图片的相机参数(内参和外参)。CMVS-PMVS可以利用已知图片以及图片对应相机参数(使用Bundler求得)来进行稠密的三维重建(dense reconstruction)。

二、源码下载

我们直接从github上来下载Bundler和CMVS-PMVS的源码,在linux 终端分别输入如下命令,等待下载完成。

git clone https://github.com/snavely/bundler_sfm.git
git clone https://github.com/pmoulon/CMVS-PMVS.git

由于Bundler要使用SIFT进行特征提取,我们还要去下面这个网站下载SIFT

http://www.cs.ubc.ca/~lowe/keypoints/

三、安装依赖

为了编译和运行Bundler,我们需要安装如下依赖

sudo apt-get install liblapack-dev libblas-dev minpack-dev f2c gfortran jhead imagemagick

接下来继续安装SIFT依赖

sudo apt-get install libc6-dev-i386

安装CMVS-PMVS依赖

sudo apt-get install libgtk2.0-dev libdevil-dev libboost-all-dev libatlas-cpp-0.6-dev libatlas-dev libcminpack-dev libgfortran3 libmetis-edf-dev libparmetis-dev freeglut3-dev libgsl0-dev

四、编译Bundler和CMVS-PMVS

首先我们编译Bundler,在linux 终端使用cd命令进入到bundler_sfm下,也就是Makefile文件所在的目录,然后在终端输入make命令,回车等待编译完成。编译完成后会在bin目录下会生成可执行文件。为了使Bundler顺利执行,我们还要进行如下操作

  1. 找到下载的SIFT程序,解压之后将里边的sift可执行文件拷贝到bundler_sfm下的bin目录下。
  2. 安装依赖的时候我们安装了jhead,我们要将jhead文件拷贝到bundler_sfm下的bin目录下。可以使用命令
     sudo cp /usr/bin/jhead bin/ 
  3. 将bundler_sfm/bin/目录下生成的libANN_char.so文件拷贝到系统库
     sudo cp bin/libANN_char.so /usr/lib/ 

接下来我们继续对CMVS-PMVS进行编译,我们依然使用cd命令进入到CMVS-PMVS/program/下,然后依次执行以下命令

 mkdir build && cd build
 cmake ..
 make

执行完成后,CMVS-PMVS也就编译完成了,生成的可执行文件位于build目录下的main目录中。为了接下来运行方便,我们将生成的可执行文件cmvs、genOption、pmvs2这三个文件拷贝到bundler_sfm目录的bin下。

五、执行Bundler和CMVS-PMVS进行三维重建
 
我们可以利用自带的example中的图片进行测试,我们以ET为例来说明如何进行三维重建。首先还是使用cd命令进入到ET文件夹下,然后执行以下命令

../../RunBundler.sh

最终会生成很多的结果文件,其中bundler文件夹下的bundler.out中存储了重建的稀疏点3D坐标和相机参数。
接下来我们就可以利用PMVS进行稠密点云的重建了,在这之前我们还需要将Bundler的输出转换为CMVS-PMVS的输入格式。我们利用bin下的Bundle2PMVS即可完成这一过程。

../../bin/Bundle2PMVS prepare/list.txt bundle/bundle.out 

此时会生成pmvs目录,在此目录下有prep_pmvs.sh文件,我们编辑此文件,将里边的BUNDLER_BIN_PATH修改为bundler的bin文件夹的实际路径。例如:

BUNDLER_BIN_PATH=/home/chao/AAAAAA/temp/bundler_sfm/bin

然后依次执行如下操作

sh pmvs/prep_pmvs.sh
../../bin/cmvs pmvs/
../../bin/genOption pmvs/
../../bin/pmvs2 pmvs/ option-0000 (注意option之前的空格键)

生成的最终结果位于pmvs目录的models 文件夹下,名称为option-0000.ply,我们直接使用meshlab打开此文件便可以看到结果。如下图所示

linux下使用Bundler + CMVS-PMVS进行三维重建_第1张图片

我们也可以自己拍照片来进行三维重建,但是要注意两个问题

  1. Bundler在进行三维重建时会使用jhead 读取照片信息,然后根据读取的相机型号从bin目录下的extract_focal.pl文件中读取ccd_widths,如果你使用的相机不在此文件列表中,你需要查询自己相机的ccd_widths并按照格式手动加入extract_focal.pl文件。
  2. 图片尺寸问题。笔者在跑数据时,由于图片尺寸过大,导致失败,此时只需要将图片按比例缩放即可。在linux下推荐使用imagemagick,方便快捷。可参考http://blog.sina.com.cn/s/blog_68f88be10102vohm.html

最后附上自己的三维重建结果

linux下使用Bundler + CMVS-PMVS进行三维重建_第2张图片

linux下使用Bundler + CMVS-PMVS进行三维重建_第3张图片

linux下使用Bundler + CMVS-PMVS进行三维重建_第4张图片

linux下使用Bundler + CMVS-PMVS进行三维重建_第5张图片

此数据github地址如下

https://github.com/chao0210/multiview-dataset.git

你可能感兴趣的:(三维重建)