Bundler在Window下的编译

(参考自: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文件,在文件里添加如下内容即可:

[cpp]  view plain copy
  1. #define IEEE_8087  
  2. #define Arith_Kind_ASL 1  
  3. #define Long int  
  4. #define Intcast (int)(long)  
  5. #define Double_Align  
  6. #define X64_bit_pointers  
  7. #define QNaN0 0x0  
  8. #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



猜你喜欢

转载自blog.csdn.net/wislon/article/details/46571997