最新版 bundler(不是v0.4) 的编译和使用

来源:互联网 发布:数据库攻击技术 编辑:程序博客网 时间:2024/05/03 02:22

    本文在其他博客上修改而来,原博客是针对bundler v0.4,对现在最新的bundler有很多地方不适用了。特别是在Ubuntu环境下bundler的编译和使用。我先说如何在windows下用VS2013和cygwin来编译和运行bundler。

原文连接:http://blog.csdn.net/halfwet/article/details/6973918


1.      Bundler简介

        Bundler是一个采用C和C++开发的称为sfm(struct-from-motion)的系统,它能够利用无序的图片集合(例如来自网络的图片)重建出3D的模型。最早的版本被用在Photo Tourism的项目上。项目的官方网站在此:bundler project。

        Bundler的输入是一些图像、图像特征以及图像匹配信息,输出则是一个根据这些图像反应的场景的3D重建模型,伴有少量识别得到的相机以及场景几何信息。系统借用一个由Lourakis 和Argyros提供的称为Sparse Bundle Adjustment的开发包的修改版,一点一点递增地重建出图像场景。Bundler已经成功的应用在许多网络相册系统,尤其是一些建筑相册里。

         Bundler 的源代码可以在这里下载:bundler源码。


2.      Bundler的编译

         下载到Bundler的源代码之后,我们首先要对其进行编译。在bundler\vc++\文件夹下有Visual Studio2005创建的工程Bundler.sln,当然我们也可以使用更高的版本进行编译。我使用的是VS2013,win8.1.直接点击工程文件Bundler.sln,会自动导入到VS2013并升级该工程。

然后先依次对每一个工程编译生成, 在编译过程中,我遇到了以下问题,并参考网上的方法修改:

在编译第一个工程5point的时候,在matrix.h中会出现错误 ,error C2054: 在“inline”之后应输入“(” ,参考博客,解决方法是在头文件添加如下语句:

#if defined(WIN32) && !defined(__cplusplus)

#define inline __inline

#endif


编译Bundlr2PMVS时,在Bundle2PMVS.cpp文件中会出现两个错误和若干警告。

“未知的标识符mkdir”的错误。

在文件的开头添加#include<direct.h>,

同时将mkdir替换为_mkdir,如下所示:

//mkdir(output_path,0770);

_mkdir(output_path);


错误    42    error C2491: “erf”: 不允许 dllimport 函数 的定义

查了一些资料,这里好像是说erf函数重定义了?,反正我就点击这个错误,进入到filter.c中,然后把下面这个函数全部屏蔽了再编译就好了。

如果有人知道其他更好的方法希望能告知。


谢qq_34264881出,老的math.h里没有erf函数,而新的math.h已经有这个函数了,直接把erf注释掉。


屏蔽整个函数

/*#ifdef WIN32static double erf (double x) {  int sign;  double t;  if (x < 0)    {      sign = -1;      x = -x;    }  else sign = 1;     //This form uses equation 7.126 of A&S.  It is accurate to 1.5e-7.     t = 1 / (1 + 0.3275911 * x);     if (x < 1.0e17) {    t = 1.0 - (t * (0.254829592 + t *     (-0.284496736 + t *     (1.421413741 + t *      (-1.453152027 + t *       (1.061405429)))))) * exp (-x * x);  }  else t = 1.0;  t = t * sign;     return t;} #endif */

至此,Bundle2PMVS编译成功。

 

编译KeyMatchFull时,在KeyMatchFull.cpp会出现两个错误,"max" 不是std的成员 和 找不到 ‘max’。

加上 #include <algorithm>就行了。


编译RadialUndistort时,在RadialUndistort.cpp文件中会出现“无法识别的标识符index”。

原先的代码如下所示:

//char *space = index(buf, ' ');
//if (space) *space = 0;

将其替换为:

std::string str(buf);
int space_pos = str.find(' ');
str.at(space_pos) = 0;

files.push_back(str);

如果出现找不到jpeglib.h,先编译一遍bundler然后再编译就可以了。

也可以在RadialUndistort的属性里面C/C++ -> 常规 -> 附加包含目录中包含jpeglib.h的目录,..\lib\jpeg\src;



至此,RadialUndistort编译成功。

 

最后编译bundler时,出现两个错误。“_isnan”不是“std”的成员,去掉前面的std::就可以了。


3.      Bundler的运行

        编译完成后,需要将bundler\vc++\Debug\目录下的Bundler.exe,KeyMatchFull.exe, RadialUndistort.exe, Bundle2PMVS.exe, jpeg.dll,ann_1.1_char.dll文件统统考到bundler\bin\目录下。

在成功执行Bundler前,我们需要做几步准备工作:

(转自http://www.cnblogs.com/weizhoupan/archive/2011/03/05/Intro_on_Bundler.html)

        1.下载和安装Cygwin。Cygwin是许多自由软件的集合,最初由Cygnus Solutions开发,用于各种版本的Microsoft Windows上,运行UNIX类系统。由于Bundler默认是通过在Unix环境下执行shell脚本来启动Bundler的,因为在Windows环境下需要安装Cygwin以执行shell脚本。

要下载cygwin,直接在setup.exe上点右键“另存为”即可。也可以复制右边这个地址:http://cygwin.com/setup.exe

cygwin的安装比较简单,可以参考这篇教程:http://www.programarts.com/cfree_ch/doc/help/UsingCF/CompilerSupport/Cygwin/Cygwin1.htm

北京理工大学的童鞋可以添加这个镜像进行安装:http://mirror.bitunion.org/cygwin/.

但要注意一点,Bundler程序中会使用perl、python来进行一些预处理,因此在安装过程中需要把Devel、Perl、Python三个组件库都选上。另外还有ImageMagick这个库,用来处理图片。

下载安装的时间比较久,需要等待一段时间。安装过程中一些杀毒软件(比如360)可能会提示一些安全警告,无视即可。

        2.下载特征检测器。Bundler推荐使用SIFT来进行特征提取,可以到SIFT的作者David Lowe的主页上下载他提供的SIFT Demo作为我们的检测器。下载页面为: http://www.cs.ubc.ca/~lowe/keypoints/ 或者直接点击右边的下载地址下载:SIFTdemo program (Version 4, July 2005)

下载完成后,解压该文档,将目录下的siftWin32.exe文件拷贝到BASE_PATH\bin目录中。

        3.准备图片。将要进行分析处理的图片放到一个目录里,比如BASE_PATH\Pictures\中(下面也统一以Pictures代替图片目录)。作为例子,Bundler自己也提供了两套图片,分别放在BASE_PATH\examples\ET和BASE_PATH\examples\kermit中。

        4.下面对运行Bundler的脚本文件进行修改:(如果不想修改脚本文件,可以按照bundler说明文档说的那样,在图片目录下,比如BASE_PATH\examples\kermit中,直接运行如下命令../.././RunBundler.sh)

把RunBundler.sh文件中BASE_PATH=$(dirname $(which $0)); 一句等号后边的东西替换为Bundler的根目录,也就是RunBundler.sh文件所在的目录,记得加双引号。如BASE_PATH="E:/SDK/bundler"。

然后把ToSift.sh文件中BIN_PATH设为bin目录,如BIN_PATH="E:/SDK/bundler/bin"。

        5.这下就大功告成了!!

打开Cygwin,cd定位到Bundler根目录下,然后输入下面的命令测试一下例子的图片:

./RunBundler.sh examples/ET


事实上,我在运行bundler的时候,在完成了检测、匹配之后,进入bundler,就会出现错误。原因是Bundle.cpp 中有三个 dummy 变量没有被初始化就返回了。

8>d:\bundler\src\bundle.cpp(3083): warning C4700: the variable 'dummy' is being used without being initialised
8>d:\bundler\src\bundle.cpp(3113): warning C4700: the variable 'dummy' is being used without being initialised
8>d:\bundler\src\bundle.cpp(3233): warning C4700: the variable 'dummy' is being used without being initialised

定位到程序中,将其初始化为0就可以了。camera_params_t dummy = {0};

 

4.      后续工作

        Bundler输出的文件大多以“bundle_*.out”的形式来命名,我们称之为“bundle文件”。缺省命令下,Bundler在每张图片经过分析和注册(register)后都会输出一个相应的bundle文件用来保存当前的状态信息,并以“bundle_<n>.out”的形式命名。当所有的文件都注册后,Bundler就会输出一个最终的文件“bundle.out”。另外,每一回合结束时还会紧接着生成一些后缀名为“ply”的文件,这些文件包含的是经过重建后的相机和点的信息。这些ply文件可以通过使用专用的查看器scanalyze来查看,地址为:http://graphics.stanford.edu/software/scanalyze/。当然也可以通过meshlab来查看,下载地址为:http://meshlab.sourceforge.net/。

        利用Bundler可以得到较为稀疏的点云(pointclouds)数据。如果需要得到更密集的点,可以使用Yasutaka Furukawa博士写的另外一个非常强大的软件包,称为PMVS2,下载:http://grail.cs.washington.edu/software/pmvs/。一种比较常见的途径是使用Bundler来得到相机参数,然后使用Bundle2PMVS程序,将生成结果转换为PMVS2的输入,然后使用PMVS2来得到更密集的点云。另外,读者们可能会对另外一个同样由Furukawa博士开发的实用工具——CMVS感兴趣,CMVS是一个场景聚类程序,在使用PMVS2前可以使用它来进行一些预处理,下载:http://grail.cs.washington.edu/software/cmvs/。

0 0
原创粉丝点击