VS2010下Bundler的使用以及cygwin的配置

来源:互联网 发布:hptv手机电视软件 编辑:程序博客网 时间:2024/06/15 21:40


描述的是通过分析物体的运动得到三维结构信息的过程。


人类通过移动获得很多环境的三维结构信息。当观察者自己或者其周围的物体运动的时候,可以从获得的图象中获取信息。运动恢复结构需要解决立体图像恢复结构类似的问题:找到三维物体图像的对应点为了找到对应点,需要在图像间跟踪一些类似角点(多方向有梯度值的边缘)的特征。特征沿时间的轨迹将被用来重建三维结构与相机运动。


我们常常将运动恢复结构归结为下面几个步骤:

1. 提取图像特征

2. 估计场景的初始位置和相机的运动

3. 优化估计的结果

4. 标定相机

5. 得到场景的稠密表达

6. 推导出场景的几何结构、纹理特性以及反射特性。


这里介绍一下Bundler:

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

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

Bundler 的源代码可以在这里下载:http://phototour.cs.washington.edu/bundler/。其最新的版本为bundler-v0.4-source.zip。


在编译过程中,我们会遇到以下问题,解决方法:

windows平台下,使用vs2008打开bundler-v0.4-source目录下的vc++目录中的工程文件,逐个编译bundler所需的依赖库,有:5point、ann_1.1_char、cblas、getopt、imagelib、jpeg、matrix、sba-1.5、sfm-driver、f2c、clapack、cminpack等。


编译f2c时,会给出无法找到#include "sysdep1.h"文件的错误。进入f2c的目录,将sysdep1.h0文件名修改为sysdep1.h即可,同时将signal1.h0文件名修改为signal1.h。再次编译f2c库时,会提示无法找到#include "arith.h"文件的错误,同时在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

这时,编译f2c,便成功了。

接下来编译keyMatchFull和Bundler项目,一切顺利。


为了进行获得稠密的三围重建效果,利用Bundler提供的Bundle2PMVS和RadialUndistort工具,生成稠密重建PMVS软件所需的参数。

编译Bundlr2PMVS时,在Bundle2PMVS.cpp文件中会出现“未知的标识符mkdir”的错误。在文件的开头添加#include <direct.h>,

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

//mkdir(output_path, 0770);

_mkdir(output_path);

至此,Bundle2PMVS编译成功。


编译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,这里以Win7,vs2010为例:

1、下载源代码下载地址:http://www.ijg.org/files/    选择最新版本的windows版本压缩包,进行下载。
   eg.: jpegsr9a.zip    1042 Kb    Sun Jan 19 10:26:10 2014    Zip Compressed Data

2、解压缩压缩包,修改文件名jconfig.vc为jconfig.h

3、打开VS2010的命令行窗口
    程序菜单
        Microsoft Visual Studio 2010
        ----Visual Studio Tools
        --------Visual Studio 命令提示(2010)

4、命令行窗口,进入jpeglib解压缩后的目录
    cd E:\jpeg-9a

5、命令行窗口,编译jpeglib,生成libjpeg.lib
    nmake /f makefile.vc

6、使用jpeglib
    在项目的[附加包含目录]添加jpeglib目录(右键项目选择property->Configuration Properties->C/C++->General->Additional Include Directories),
    在项目的[附加库目录]添加jpeglib目录(右键项目选择property->Configuration Properties->VC++ Directories->Library Directories)
    在项目的[附加依赖项]添加libjpeg.lib,(右键项目选择property->Configuration Properties->Linker->Input->Additional Dependencies)
    就可以在项目中使用jpeglib了。

7、注意事项
    libjpeg.lib是用c语言开发的,
    如果在C++程序里使用,需要用extern "C" { }包含一下。
    如下:
    extern "C"
    {
    #include "jpeglib.h"
    }


通过上面的方法,就可以正常编译Bundler了。


下面考虑Bundler的运行:

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

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

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

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

cygwin的安装比较简单:

下载完成后,运行setup.exe程序,出现安装画面。直接点“下一步”,出现安装模式的对话框,如下图所示:


选下一步:


这里有三种安装模式:

  • Install from Internet,这种模式直接从Internet安装,适合网速较快的情况;
  • Download Without Installing,这种模式只从网上下载Cygwin的组件包,但不安装;
  • Install from Local Directory,这种模式与上面第二种模式对应,当你的Cygwin组件包已经下载到本地,则可以使用此模式从本地安装Cygwin。

从上述三种模式中选择适合你的安装模式,这里我们选择第一种安装模式,直接从网上安装,当然在下载的同时,Cygwin组件也保存到了本地,以便以后能够再次安装。本文选择了第一种方式,选中后,点击“下一步”,


这一步选择Cygwin的安装目录,以及一些参数的设置。本文安装位置是E:\cygwin\,你也可以选择自己的安装目录,然后选择“下一步”,


这一步我们可以选择安装过程中从网上下载的Cygwin组件包的保存位置,选择完以后,点击“下一步”,


这一步选择连接的方式,选择你的连接方式,然后点击下一步,会出现选择下载站点的对话框,如下图所示,

在下方输入:http://www.cygwin.cn/pub/之后点击Add,然后再在列表中选中。选择完成后,点击“下一步”,如果不成功的话,也可以选用http://mirrors.163.com.


这一步,我们选择需要下载安装的组件包,为了使我们安装的Cygwin能够编译程序,我们需要安装gcc编译器,默认情况下,gcc并不会被安装,我们需要选中它来安装。为了安装gcc,我们用鼠标点开组件列表中的“Devel”分支,在该分支下,有很多组件,我们必须的是:

binutils、make、gcc、mingw、gdbDevel中寻找,另外还有ImageMagick、Perl、Python这些库。(当然可以选择全部安装,大概32G的空间,这里建议全部安装,会减少很多不必要的错误)

鼠标点击组件前面的循环按钮,会出现组建的版本日期,我们选择最新的版本安装,下图是选中后的部分组件的截图:(相应的功能可以在搜索窗中查找)





选完以后,我们选择下一步,下一步,进入安装过程,如下图所示,


安装的时间依据你选择的组件以及网络情况而定。安装完成后,安装程序会提示是否在桌面上创建Cygwin图标等,点击完成退出安装程序。

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

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

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

4.下面对运行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"。

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

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

$ cd  E:/bundler(根目录)
$ mkdir result(建立result文件夹,存放输出结果)

$ cd result(进入result文件夹)
$ ../RunBundler.sh ../examples/kermit (注: ../examples/kermit指明用于进行多视角重建的图像所在目录)此时已经运行完Bundler, 在./bundle/bundle.out文件里有重建的稀疏点3D坐标和相机参数, 具体说明参见/bundler/readme.txt。
这样/bundler会生成两个文件夹/bundle和/prepare。

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/。


(将Bundler的输出转换为CMVS-PMVS2的输入)
         Bundler会生成一个Bundle2PMVS.exe用于将Bundler生成的结果转化成CMVS要求的输入。注意这里的操作一定是在bundler的根目录下面。否则后面生成的目录文件会有错
$ ../bin/Bundle2PMVS.exe prepare/list.txt bundle/bundle.out

此时生成了pmvs子目录, 编辑里边的prep_pmvs.sh(可以用Notepad++,不建议用win自带的notepad), 指明BUNDLE_BIN_PATH路径来寻找RadialUndistort.exe和Bundle2Vis.exe。注意我们用的是Cygwin所以改BUNDLE_BIN_PATH要注意目录的格式,比如我的Bundler在E盘根目录,那么BUNDLER_BIN_PATH=/cygdrive/e/bundler/bin(地址不能有空格)为了方便我们常常写成BUNDLER_BIN_PATH=../bin
完成最后的转换$ ./pmvs/prep_pmvs.sh(运行时可能会报错,‘\r’之类的错误,可以参考http://blog.csdn.net/u010922186/article/details/41825237,修正错误)
      在pmvs目下生成txt, visualize, models目录和bundle.rd.out, list.rd.txt, vis.dat, pmvs_options.txt文件, 这些都是PMVS2的输入。

CMVS-PMVS的配置:

 Yasutaka Furukama网站上提供的CMVS是基于Linux上的比较。好在有个人将它转成了可以在Windows下运行的文件,见http://francemapping.free.fr/Portfolio/Prog3D/CMVS.html
(1)  下载CMVS-PMVS并解压缩。发现里面有一个binariesWin-Linux文件夹,里面有配置好的基于Linux,Win32,和Win64的可执行程序,将CMVS-PMVS-master\binariesWin-Linux\Win64-VS2010文件夹中的文件全部拷贝到之前的result文件夹目录下。

打开cmd(win+R)

1.进入E盘(E:)

2.进入bundler/result文件夹下(cd E:\bundler\result)

3.输入cmvs pmvs/


4.输入genOption pmvs/

5.pmvs2 pmvs/ option-0000(注意option之前的空格键,后面是四个零)

这样,我们发现/pmvs/models/文件夹多了几个文件,其中*.ply文件为3D模型文件用下面的软件可以查看。


稠密网格的显示:

      我们这里使用的是MeshLab:http://meshlab.sourceforge.net/
(1) 创建一个新的New Empty Project。
(2) File->ImportMesh,进入E:\bundler\result\pmvs\models,读入里面的模型文件(.ply)
















常用的软件包

1.StructurefromMotiontoolboxbyVincentRabaud

2.MatlabFunctionsforMultipleViewGeometrybyAndrewZissermann

3.StructureandMotionToolkitbyPhilTorr

4.MatlabCodeforNon-RigidStructurefromMotionusingFactorisationbyLorenzoTorresani

5.StructurefromMotionforUnorderedPhotoCollectionsbyNoahSnavely




0 0