(参考自:http://www.cnblogs.com/weizhoupan/archive/2011/03/05/Intro_on_Bundler.html
http://blog.csdn.net/manji_lee/article/details/7596877
http://blog.csdn.net/lxiaoxiaot/article/details/6721247
http://blog.csdn.net/azkabannull/article/details/7872958)
一、什么是Bundler
Bundler是一个采用C和C++开发的称为SfM(struct-from-motion)的系统,实现了根据用户提供的无序的图像序列,生成稀疏的三维点云模型。它能够利用无序的图片集合(例如来自网络的图片)重建出3D的模型。最早的版本被用在Photo Tourism的项目上。
Photo Tourism系统可以交互式浏览和探索大型非结构化场景照片集合。系统有一个基于图像的建模前端,它会自动计算每一张照片的角度,以及稀疏模型对应的场景和形象的三维模型。
图1.Photo Tourism
Bundler的输入是一些图像、图像特征以及图像匹配信息,输出则是一个根据这些图像反应的场景的3D重建模型,伴有少量识别得到的相机以及场景几何信息。系统借用一个由Lourakis 和Argyros提供的称为Sparse Bundle Adjustment的开发包的修改版,一点一点递增地重建出图像场景。Bundler已经成功的应用在许多网络相册系统,尤其是一些建筑相册里。
二、Bundler的下载
Bundler的下载页面在:http://phototour.cs.washington.edu/bundler/
现在只需要得到Windows下的可执行文件,可以直接下载:bundler-v0.4-source.zip 下载后将其解压到一个路径,比如:F:\SfM
三、Windows XP环境下Bundler的编译
(1)打开解决方案
使用VS2005打开bundler-v0.4-source目录下的vc++目录中的解决方案文件。
图2.打开解决方案
看到有很多项目构成,在打开的IDE中生成解决方案:
图3. Bundler解决方案
(2)修改编译错误
生成中会出现很多错误:
图4.Blundler的编译错误
出现错误的原因好像是因为Bundler的源代码是在Unix/Linux下开发的,按照博客:http://blog.csdn.net/lxiaoxiaot/article/details/6721247中所述的步骤现在一一改正:
首先是fatal error C1083: 无法打开包括文件:“sysdep1.h”: No such file or directory的错误。进入bundler-v0.4-source\lib\f2c目录,将sysdep1.h0文件名修改为sysdep1.h即可,同时将signal1.h0文件名修改为signal1.h:
图5.修改头文件后缀名
再次生成时,会提示fatal error C1083: 无法打开包括文件:“arith.h”: No such file or directory的错误:
图6.无法打开包括文件:“arith.h”的错误
这是因为在bundler-v0.4-source\lib\f2c目录下并没有名字为arith.h的文件,这时可以新建一个arith.h文件,在文件里添加如下内容即可:
- #define IEEE_8087
- #define Arith_Kind_ASL 1
- #define Long int
- #define Intcast (int)(long)
- #define Double_Align
- #define X64_bit_pointers
- #define QNaN0 0x0
- #define QNaN1 0xfff80000
图7.添加头文件arith.h
此时,生成错误还剩两个,为了进行获得稠密的三围重建效果,利用Bundler提供的Bundle2PMVS和RadialUndistort工具,生成稠密重建PMVS软件所需的参数。
在Bundle2PMVS.cpp文件中会出现错误error C3861: “mkdir”: 找不到标识符的错误。
在RadialUndistort.cpp文件中会出现error C3861: “index”: 找不到标识符的错误。
图8.找不到标识符的错误
对于第一个错误的原因是:mkdir是Linux下创建目录的函数,需要两个参数,第一个是路径,第二个是权限。而Windows下则是使用_mkdir,只需要一个路径的参数,需要在文件的开头添加#include<direct.h>,同时将mkdir替换为_mkdir,如下所示:
对于第二个错误的原因:index是Linux下查找字符串中第一个出现的指定字符的函数,Windows中没有这个函数。需要使用STL中string类的方法来完成这个工作。原先的代码如下所示:
现在可以生成成功。
三、Windows XP下Bundler的运行的准备工作
在成功执行Bundler前,我们需要做几步准备工作:
(1)将需要的文件复制到指定目录
Bundler生成完成后,需要将bundler-v0.4-source\vc++\Debug\目录下的Bundler.exe、Bundle2PMVS.exe、KeyMatchFull.exe、RadialUndistort.exe、jpeg.dll、ann_1.1_char.dll文件统统考到bundler-v0.4-source\bin\目录下。
(2)下载和安装Cygwin
Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于在各种版本的Microsoft Windows上运行UNIX类系统。由于Bundler默认是通过在Unix环境下执行shell脚本来启动Bundler的,因为在Windows环境下需要安装Cygwin以执行shell脚本。
Cygwin的下载地址:http://cygwin.com/setup.exe
Cygwin的安装过程:
图9.安装Cygwin
图10.选择下一步
图11.选择Install from Internet
图12.选择下载目录
图13.选择连接方式 Use Internet Explorer Proxy Settings
图14.这里弹出的警告一定要选择“确定”
图15.选择需要的安装包
肯定需要使用Devel组件,但不必全部安装,选择里面的四个关键包安装即可,为了使我们安装的Cygwin能够编译程序,我们需要安装gcc编译器,默认情况下,gcc并不会被安装,我们需要选中它来安装。为了安装gcc,我们用鼠标点开组件列表中的“Devel”分支,在该分支下,有很多组件,我们必须的是:
binutils
gcc
gcc-mingw
gdb
图16.打开Devel分支
图17.选择binutils
图18.选择gcc
图19.选择gcc-mingw
图20.选择gdb
但要注意一点,Bundler程序中会使用perl、python来进行一些预处理,因此在安装过程中需要把Devel、Perl、Python三个组件库都选上。另外还有ImageMagick这个库,用来处理图片。
图21.选择ImageMagick库,在Graphics分支下
图22.选择perl、python组件库
图23.安装完成(时间可能比较长)
(3)下载特征检测器
Bundler推荐使用SIFT来进行特征提取,可以到SIFT的作者David Lowe的主页上下载他提供的SIFT Demo作为我们的检测器。下载页面为:http://www.cs.ubc.ca/~lowe/keypoints/或者直接点击下载地址下载:SIFT demo program(Version 4, July 2005)
下载完成后,解压该文档,将目录下的siftWin32.exe文件拷贝到bundler-v0.4-source\bin目录中。
图24.特征检测器
(4)准备图片
将要进行分析处理的图片放到一个目录里,Bundler自己也提供了两套图片,分别放在bundler-v0.4-source\examples\ET和bundler-v0.4-source\examples\kermit中。
(5)下面对运行Bundler的脚本文件进行修改:
把RunBundler.sh文件中BASE_PATH=$(dirname $(which $0)); 一句等号后边的东西替换为Bundler的根目录,也就是RunBundler.sh文件所在的目录,记得加双引号。如BASE_PATH="E:/SDK/bundler-v0.4-source";。
然后把ToSift.sh文件中BIN_PATH设为bin目录,如BIN_PATH="E:/SDK/bundler-v0.4-source/bin"。
(6).这下就大功告成了!!
打开Cygwin,cd定位到Bundler根目录下,然后输入下面的命令测试一下例子的图片:
./RunBundler.sh examples/ET