Ubuntu 16.04下安装Bunlder和PMVS(CMVS)

<u>版权所有,转载请注明出处</u>


一. 简介

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可以在官方进行下载,最近的安装包为bundler-v0.4-source.zip。也可以去GIthub上下载.
(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
sift_error.png

(2)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

(3)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)步编译成功。
下面是不配置出现的错误:

error_ANN.png

3.测试

我们可以利用自带的example中的图片进行测试,例如我们以kermit为例:

cd ./examples/kermit
../../RunBundler.sh

最终会生成很多的结果文件。其中bundler文件夹下的bundler.out中存储了重建的稀疏点3D坐标和相机参数。内容的具体格式可以参加/bundler/readme.txt。

bundler测试结果.png

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
CMVS的下载包为:cmvs-fix2.tar.gz (243Mb)

2. PMVS(CMVS)安装

(1) PMVS2安装
安装可以参考官网的官方说明

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安装
安装可以参考官网的官方说明
1)安装依赖软件和库

  • Bundler
  • PMVS2
  • Graclus。下载完后需要根据个人系统是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>

  • 如果出现下面错误:
    stdlib_error.png

    修改方法参考这里:

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/下,如果采用的是默认指定,那么将会得到以下三个文件:

这几个文件中保存的就是稠密重建点云信息。

4. CMVS使用

使用可以参考官方文档

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

四. 参考内容

<div align = center>-END-</div>


<u>版权所有,转载请注明出处</u>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容