一.简介
Bundler和PMVS(CMVS)是进行三维重构中非常有用的一套工具包,Bundler利用一系列无序图片可以生成场景的稀疏点云,这些稀疏点云通过PMVS工具包可以得到稠密点云,从而可以重建出场景的3D模型。
Bundler是Noah Snavely博士采用C和C++开发的sfm(Structure from Motion)的系统,它能够通过对某个场景不同角度的多张图片生成稀疏点的三维信息,并且估计每一幅图片的相机参数(内参和外参)。最早的版本被用在Photo Tourism的项目上。
Bundler的输入是一些图像、图像特征以及图像匹配信息,输出则是一个根据这些图像反应的场景的3D重建模型,伴有少量识别得到的相机以及场景几何信息。系统借用一个由Lourakis 和Argyros提供的称为Sparse Bundle Adjustment的开发包的修改版,一点一点递增地重建出图像场景。Bundler已经成功的应用在许多网络相册系统,尤其是一些建筑相册里。
PMVS和CMVS(CMVS是PMVS的改进版,里面包含PMVS)是Yasutaka Furukama博士写的已知一组图片和图片对应的相机参数生成dense reconstruction (稠密的三维模型)。
二. Bundler下载与安装
1.Bundler工具包下载
(1)Bundler下载
Bundler可以在官方进行下载(http://www.cs.cornell.edu/~snavely/bundler/),最近的安装包为bundler-v0.4-source.zip。也可以去GIthub上下载(https://github.com/snavely/bundler_sfm)
(2)sift下载
Bundler工具包需要利用sift进行特征提取,可以去lowe大神的网站去下载.
2.Bundler编译安装
我自己在安装的时候中间还是出了一些小问题,所以我在这里也记录了以下安装过程。
(1)Bundler编译
只需要进入Bundler根目录并执行make即可
cd bundler_sfm-master
make
(2)sift执行文件
Bundler的运行需要sift进行特征提取,这里我们对上面下载的sift源码进行编译,即可以获得sift的执行文件。
cd siftDemoV4/siftDemoV4
make
然后将生成的"sift"文件拷贝到文件夹bundler_sfm-master/bin中。(bundler根目录下的bin文件夹)
此外我们还需要安装运行sift所需的一个依赖包,这个问题可以参见github上的issue #36,执行以下指令即可
sudo apt-get install libc6-dev-i386
否则的话,可能出现以下错误
sift.txt: 1: sift.txt: ../../bin/sift: not found
(3)jhead安装
如果出现下面错误的话,请安装jhead包,这个包应该是脚本./bin/extract_focal运行所需。
[extract_focal] Error: jhead not found. Please install jhead to ./bin
安装方法如下:
sudo apt-get install jhead
安装完成后需要将jhead文件拷贝到./bin下
sudo cp /usr/bin/jhead ./bin
(4)ANN共享文件配置
按照官网上所说,我们需要将/libANN_char.so加入系统库中。
copy the approximate nearest neighbors (ANN) shared library at BASE_PATH/lib/libANN_char.so
to a location in your LD_LIBRARY_PATH (or add BASE_PATH/lib to LD_LIBRARY_PATH
执行以下指令即可:
sudo cp ./lib/libANN_char.so /lib
注意,此处的libANN_char.so文件是编译Bundler生成的,因此必须保证第(1)步编译成功。
下面是不配置出现的错误:
3.测试
我们可以利用自带的example中的图片进行测试,例如我们以kermit为例:
cd ./examples/kermit
../../RunBundler.sh
最终会生成很多的结果文件。其中bundler文件夹下的bundler.out中存储了重建的稀疏点3D坐标和相机参数。内容的具体格式可以参加/bundler/readme.txt。
4.Bundle2PMVS转换
在利用Bundler得到场景的稀疏点云后就可以利用PMVS进行稠密点云的重建了,当然在这之前我们还需要将Bundler的输出转换为CMVS-PMVS2的输入格式。我们利用bin下的Bundle2PMVS即可完成这一过程。
../../bin/Bundle2PMVS prepare/list.txt bundle/bundle.init.out
执行完毕后会有如下提示:
@@ Conversion complete, execute "sh pmvs/prep_pmvs.sh" to finalize
@@ (you will first need to edit prep_pmvs.sh to specify your bundler path,
@@ so that the script knows where to find your
@@ RadialUndistort and Bundle2Vis binaries)
此时会生成了pmvs子目录, 里面有文件prep_pmvs.sh,我们需要执行sh pmvs/prep_pmvs.sh,在执行前需要编辑prep_pmvs.sh,将BUNDLER_BIN_PATH修改为bundler的bin文件夹的实际路径。例如:
BUNDLER_BIN_PATH=/media/machao/Data/chma/bundler_sfm-master/bin
之后就可以执行sh pmvs/prep_pmvs.sh了。然后,我们会得到txt, visualize, models目录和bundle.rd.out, list.rd.txt, vis.dat, pmvs_options.txt等文件,这些东西就可以作为PMVS的输入了。
三.PMVS(CMVS)的下载与安装
1.PMVS(CMVS)下载
Bundler官网上提供的PMVS链接已经失效,PMVS2和CMVS的官网地址分别为:http://www.di.ens.fr/pmvs/ ,http://www.di.ens.fr/cmvs , 我们可以在上面下载PMVS和CMVS。
PMVS2的下载包为:pmvs-2-fix0.tar.gz(http://www.di.ens.fr/pmvs/pmvs-2-fix0.tar.gz)
CMVS的下载包为:cmvs-fix2.tar.gz (243Mb)(http://www.di.ens.fr/cmvs/cmvs-fix2.tar.gz)
2.PMVS(CMVS)安装
(1) PMVS2安装
安装可以参考官网的官方说明(http://www.di.ens.fr/pmvs/documentation.html)
Compilation
We suggest on using the binary distribution, but if you choose to compile the source codes, try the following.Make sure you have all the libraries listed above in your system.
Go to directory "program/main"
Add INCLUDE and LDLIBRARY paths to Makefile
make depend
make
按照官方这个说明一步步进行。需要注意的是我们可能需要安装一些依赖包:
sudo apt-get install libgtk2.0-dev libdevil-dev libboost-all-dev libatlas-cpp-0.6-dev libatlas-dev imagemagick libcminpack-dev libgfortran3 libmetis-edf-dev libparmetis-dev freeglut3-dev libgsl0-dev
sudo apt-get install libgsl0-dev libblas-dev libatlas-dev liblapack-dev liblapacke-dev
此外还需要一个编译过的目标文件 mylapack.o (该文件貌似在老版本里,新版本里不知为何移除了?)
编译过程中可能出现的错误:
g++ -c -O2 -Wall -Wno-deprecated -I/usr/include ../base/numeric/mylapack.cc
../base/numeric/mylapack.cc:6:25: fatal error: clapack/f2c.h: No such file or directory
compilation terminated.
Makefile:39: recipe for target 'mylapack.o' failed
修改方法:
Update ../base/numeric/mylapack.cc
From:
extern "C" {
#include <clapack/f2c.h>
#include <clapack/clapack.h>};
To:
extern "C" {
//#include <clapack/f2c.h>
//#include <clapack/clapack.h>
#include <lapacke.h>};
#define integer int
Update ../base/numeric/mylapack.h
From:
static void lls(std::vector<float>& A, std::vector<float>& b, long int width, long int height);
static void lls(std::vector<double>& A, std::vector<double>& b, long int width, long int height);
To:
static void lls(std::vector<float>& A, std::vector<float>& b, int width, int height);
static void lls(std::vector<double>& A, std::vector<double>& b, int width, int height);
(2) CMVS安装
安装可以参考官网的官方说明(http://www.di.ens.fr/cmvs/documentation.html)
1)安装依赖软件和库
Bundler
PMVS2
Graclus(http://userweb.cs.utexas.edu/users/dml/Software/graclus.html)。下载完后需要根据个人系统是32位还是64位修改下编译配置文件Makefile.in中的option项即
COPTIONS = -DNUMBITS=32#32位机器
COPTIONS = -DNUMBITS=64#64位机器
修改完成后在终端执行make即可。
2)安装CMVS
cd ./pmvs-2// Go to PMVS2 directory
mv program/main/Makefile program/main/Makefile.bak // Back-up Makefile
然后讲下载的CMVS包解压并将文件(夹)覆盖PMVS的文件夹。然后修改Makefile文件,只要是要将前面安装的Graclus的目录包括进去。
YOUR_INCLUDE_METIS_PATH = -I/path/to/your/graclus1.2/metisLib
注意前面要加上“-I"。同时需要将graclus1.2下的ibmetis.a、libmultilevel.a两个文件放置到Makefile里设置的YOUR_LDLIB_PATH路径下。另外值得注意的是,下载的cmvs中的Makefile文件里有两行(10,13行)说明内容没有注释掉,需要手动注释(前面加#号即可)。
修改完Makefile文件后make即可。
如果出现下面错误:
../base/cmvs/bundle.cc:1134:52: error: ‘accumulate’ was not declared in this scope
修改方法:
Add this to ../base/cmvs/bundle.cc
#include <numeric>
如果出现下面错误:
修改方法:
Add this to genOption.cc
#include <cstdlib>
按照上面方法修改之后重新make即可。
安装成功后将会得到 pmvs2、cmvs、genOption三个二进制文件。
3.PMVS使用
以PMVS工具包里自带的data/hall为例:
默认指令
./pmvs2 ../../data/hall/ option.txt
如果你的机器内存不是很大的话, 可以分成两步执行
./pmvs2 ../../data/hall/ option.txt-0000
./pmvs2 ../../data/hall/ option.txt-0001
如果你的机器内存足够的话,可以常识下面指令获得稠密点云
./pmvs2 ../../data/hall/ option-highres.txt
结果将会保存在文件夹hall/models/下,如果采用的是默认指定,那么将会得到以下三个文件:
outputs.option.txt.ply (colored 3d points for visualization)
option.txt.patch (full reconstruction information)
option.txt.pset (input file for PoissonSurfaceRecon by Michael Misha Kazhdan and Matthew Bolitho)
这几个文件中保存的就是稠密重建点云信息。
4.CMVS使用
使用可以参考官方文档(http://www.di.ens.fr/cmvs/documentation.html)
Command specifications
cmvs
Usage: ./cmvs prefix maximage[=100] CPU[=4]
Example: If you want to specify maximage=70 and CPU=6 with the data directory located at ./pmvs, try the following command
./cmvs ./pmvs/ 70 6
You should choose maximage based on the amount of memory in your machine.
CPU should be the number of (virtual) CPUs or cores in your machine.
If you want more control of the program, look into the comments inside program/main/cmvs.cc
genOption
Usage: ./genOption prefix level[=1] csize[=2] threshold[=0.7] wsize[=7] minImageNum[=3] CPU[=8]
Parameters are for PMVS2 option files.
5.稠密点云的可视化
上面利用PMVS进行稠密重建得到的结果outputs.option.txt.ply可以用一些可视化软件进行显示,这里我们可以采用MeshLab。