本篇文章是在以下两个博客:http://blog.csdn.net/zzzblog/article/details/17166869 和 http://blog.csdn.net/halfwet/article/details/6973918的基础上,外加结合自己编译调试过程中所遇到的问题对上面两个博客进行的总结和相应修改。
【windows7—64位系统下用VS2010实现编译,并通过cygwin实现运行】 【下一篇文章操作步骤更加简便】
Bundler是Noah Snavely博士写的Structure from Motion的工具包。它能够通过对某个场景不同角度的多张图片生成稀疏点的三维信息,并且估计每一幅图片的相机参数(内参和外参)。Bundler属于SFM的范畴。
PMVS和CMVS(CMVS是PMVS的改进版,里面包含PMVS)是Yasutaka Furukama博士写的已知一组图片和图片对应的相机参数生成densereconstruction (稠密的三维模型)。
那么结合SFM和Dense Reconstruction,我们就可以生成自己需要的三维模型了。上面两个工具包的配置说简单也简单说麻烦也麻烦。
一:Bundler的配置:
Bundler的配置有两种途径:1)通过makefile[下载源代码中的.zip.gz];2)通过VS[下载源代码中的.zip]。
【在windows系统上,上面两种途径都会用到cygwin】
本篇博客通过VS2010/VS2013对Bundler进行编译,并使用cygwin(下面会提到)运行程序。即上面所说的Bundler的
配置途径2)
配置途径1)是上面所提的博客,即 http://blog.csdn.net/zzzblog/article/details/17166869 和
http://www.cnblogs.com/mothe123/p/3570981.html (推荐看这个,里面第五步有错误,
应该修改为$ ../RunBundler.sh ../examples/kermit )
二:Bundler的编译:
过程如下:
(1) 访问 http://www.cs.cornell.edu/~snavely/bundler/ 下载bundler-v0.4-source.zip并解压。
(2)在windows平台下,使用visual studio2010打开bundler-v0.4-source目录下的vc++目录中的工程文
件:Bundler.sln;(文件里面有两个Bundle,选择
Microsoft Visual也就是文件较大的那个 )
2.1然后按顺序逐个编译bundler所需的依赖库(先执行2.2对代码进行修改,2.1的编译过程就几乎不会出现错误了),
有:5point、ann_1.1_char、cblas、getopt、imagelib、jpeg、matrix、sba-1.5、sfm-
driver、f2c、clapack、cminpack等。【例:选中5point->生成->生成
解决方案,这里会有几个错误不用管,按照下面一步一步改就行。改完之后->重新生成解决方案便成功了。
注意:对后面的ann_1.1_char等进行编译时要点击->重新生成解决方案,要不会报一个错误】
【还需要注意的是对keyMatchFull和RadiaUndistort重新生成解决方案时会出错,不用管,这是因为后面有的库还没有编
译。直接编译剩余的依赖库,最后重新编译
keyMatchFull和RadiaUndistort,就会成功】
2.2下面是代码中需要修改的部分:【建议在顺序逐个编译上面所提到的bundler依赖库前,先进行以下修改】
在编译f2c时,会给出无法找到#include "sysdep1.h"文件的错误以及会提示无法找到#include "arith.h"文件的错误。
解决方法:在bundler-v0.4-source目录下进入f2c的目录,
1>将sysdep1.h0文件名修改为sysdep1.h;
2>将signal1.h0文件名修改为signal1.h;
3>新建一个arith.h文件(创建头文件头只需将文件名定义为arith),这本身是个头文件(注意区别里面的cpp文件),在文件里添加如下内容即可:
#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
为了进行获得稠密的三围重建效果,利用Bundler提供的Bundle2PMVS和RadialUndistort工具,生成稠密重建PMVS软件所需的参数。
在编译Bundlr2PMVS时,在Bundle2PMVS.cpp文件中会出现“未知的标识符mkdir”的错误。
解决方法:
1>在文件的开头添加#include
2>将mkdir替换为_mkdir,如下所示:
//mkdir(output_path,0770);
_mkdir(output_path);【有的配置说将这里改成了mkdir(output_path);】
在编译RadialUndistort时,在RadialUndistort.cpp文件中会出现“无法识别的标识符index”以及无法打开jpeglib.h。
解决方法:1>修改代码如下所示:
//char *space =index(buf, ' ');
//if (space) *space = 0;
std::stringstr(buf);
int space_pos = str.find(' ');
str.at(space_pos) = 0;
files.push_back(str);
2>修改LoadJPEG.cpp的头文件为#inlcude"jpeglib.h",然后添加jpeglib.h的路径如下:
具体步骤为:右键点击LoadJPEG.cpp属性,出现如下窗口
三. Bundler的运行
编译完成后,需要将bundler-v0.4-source\vc++\Debug(或者release)\目录下的Bundler.exe,KeyMatchFull.exe, RadialUndistort.exe, Bundle2PMVS.exe, jpeg.dll,ann_1.1_char.dll文件统统考到bundler-v0.4-source\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://blog.csdn.net/baidu_32134295/article/details/53227270】在安装过程重会让你选择镜像链接地址,可以通过Add将下面163地址(下载速度超快)加进去,并使用该地址进行下载,地址为:http://mirrors.163.com/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目录中BASE_PATH就是已解压的bundler-v0.4-source文件夹路径。
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)下面对运行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)运行Bundler
Bundler里面有两个examples,里面存放了若干不同视角的图片,我们使用其中的一个examplekermit。
$ cd E:/SDK/bundler-v0.4-source
$ mkdir result(建立result文件夹,存放输出结果)
$ cd result(进入result文件夹)
$ ../RunBundler.sh ../examples/kermit (注:../examples/kermit指明用于进行多视角重建的图像所在目录)此时已经
运行完Bundler,在./bundle/bundle.out文件里有重建的稀疏点3D坐标和相机参数,具体说明参见/bundler/readme.txt。
这样/bundler会生成两个文件夹/bundle和/prepare。
三: 后续工作
Bundler输出的文件大多以“bundle_*.out”的形式来命名,我们称之为“bundle文件”。缺省命令下,Bundler在每张图片经过分析和注册(register)后都会输出一个相应的bundle文件用来保存当前的状态信息,并以“bundle_
利用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/。