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

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

参考文档:

(1)linux下使用Bundler +CMVS-PMVS进行三维重建的博客:http://blog.csdn.net/u013358387/article/details/71576660 (十分感谢)

(2)Bundler 及 PMVS 常见问题&解决方法http://blog.csdn.net/xdczj/article/details/51301877(十分感谢)

数据集:

三维重建数据集:http://vision.ia.ac.cn/zh/data/index.html


一、简介

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

 

二、源码下载

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

1、git clonehttps://github.com/snavely/bundler_sfm.git

2、git clonehttps://github.com/pmoulon/CMVS-PMVS.git

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

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

 

三、安装依赖

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

1、sudo apt-getinstall liblapack-dev libblas-dev minpack-dev f2c gfortran jhead imagemagick

接下来继续安装SIFT依赖

1、sudo apt-getinstall libc6-dev-i386

安装CMVS-PMVS依赖

1、sudo apt-getinstall libgtk2.0-dev libdevil-dev libboost-all-dev libatlas-cpp-0.6-devlibatlas-dev libcminpack-dev libgfortran3 libmetis-edf-dev libparmetis-devfreeglut3-dev libgsl0-dev

四、编译Bundler和CMVS-PMVS

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

   第一步:找到下载的SIFT程序,解压之后将里边的sift可执行文件拷贝到bundler_sfm下的bin目录下。

   第二步:安装依赖的时候我们安装了jhead,我们要将jhead文件拷贝到bundler_sfm下的bin目录下。可以使用命令

     sudocp /usr/bin/jhead bin/ 

    第三步:将bundler_sfm/bin/目录下生成的libANN_char.so文件拷贝到系统库

     sudocp bin/libANN_char.so /usr/lib/

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

  1、mkdirbuild && cd build

  2、cmake ..

3、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即可完成这一过程。

1、../../bin/Bundle2PMVS prepare/list.txtbundle/bundle.out

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

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

然后依次执行如下操作

1、sh pmvs/prep_pmvs.sh   

2、../../bin/cmvs pmvs/

3、../../bin/genOption pmvs/(这一步命令执行完没有什么反应)

4、../../bin/pmvs2 pmvs/ option-0000 (注意option之前的空格键)

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

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

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

1、Bundler在进行三维重建时会使用jhead 读取照片信息,然后根据读取的相机型号从bin目录下的extract_focal.pl文件中读ccd_widths,如果你使用的相机不在此文件列表中,你需要查询自己相机ccd_widths并按照格式手动加入extract_focal.pl文件。解决方案见最后面的补充。

2、图片尺寸问题。我在跑数据时,由于图片尺寸过大,导致失败,此时只需要将图片按比例缩放即可,一般设置长为2000,保持宽度比即可。在linux下推荐使用imagemagick,方便快捷。教程可参考http://blog.sina.com.cn/s/blog_68f88be10102vohm.html

 

最后附上自己的三维重建结果(结果不是很理想)

九华山旃檀寺

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

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

 

茶叶盒子

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

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

笔芯

 

 

*补充:问题如图

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

即无法找到相机CCD传感器宽度信息。

解决方案:

①先确定你的相机型号,然后到网上查找该相机的CCD参数。需要注意的是,程序要求的CCD宽度并不是说只能用CCD相机,CMOS相机也是一样的,CMOS感应器宽度就是所需的CCD宽度。

② 查到CCD/CMOS宽度信息后,在bin目录下找到extract_focal.pl配置文件,使用记事本程序打开,按照相应格式把你的相机传感器宽度信息加进去。注意格式要严格按照规定:

"[Camera make] [Cameramodel]" => [Sensor width]

(即"[相机制造商] [相机型号]" => [传感器宽度])。

另外,至于如何确定相机制造商Camera make和型号Camera model,可以把你拍摄的一张照片放到bin文件目录中,打开终端,通过jhead程序进行确认,输入命令:

jhead myphoto.jpg(图片名称)