Bundler的安装和配置

一、什么是Bundler

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

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

  下面我们就来了解一下Bundler的下载、安装和开发环境配置。

二、Bundler的下载

  Bundler的下载页面在:http://phototour.cs.washington.edu/bundler/

  如果只需要得到windows下的可执行文件,可以直接下载:bundler-v0.3-binary.zip

  如果需要得到源代码,则可以下载目前较新的版本:bundler-v0.4-source.zip 或者:bundler-v0.4-source.tar.gz (两者没区别,后者是Linux下的常用压缩格式)。

三、Bundler的安装配置

  以Windows为例。下载Bundler后,将其解压到一个路径,比如:E:\bundler(下面都以BASE_PATH来代替)

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

  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

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

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

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

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

注意siftWin32.exe只能出来pgm图像文件。

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

  4.运行Bundler。打开Cygwin,cd定位到BASE_PATH目录下,然后输入下面的命令:

   
   
./RunBundler.sh Pictures

  关于Bundler还提供了许多种命令行选项,具体的用法可以参考BASE_PATH\README.txt文件。

  如果只想测试一下例子的图片,则可以键入:

   
   
./RunBundler.sh examples/ET
或者:
   
   
./RunBundler.sh examples/Kermit

  图2就是运行ET例子的截图:

  

          图2 Windows下使用cygWin执行Bundler的结果

  Linux下的安装则简单一些。主要的区别在于以下几点:

  1.由于Linux本身支持shell,因此不需要安装Cygwin。

  2.下载Lowe的SIFT Demo后,自带的siftWin32.exe已不可用。需要通过手动make编译得到sift的可执行文件。完成后将sift文件拷贝到BASE_PATH\bin目录中。

  3.完成了上面两步后还不够,如果直接执行RunBundler.sh脚本,会提示图3所示的错误。

  

                图3 提示缺少共享库文件错误

  这是因为我们没有设置好共享库。最直接的做法是将BASE_PATH\bin目录下的libANN_char.so复制到/lib中:

   
   
$ sudo cp libANN_char.so /lib

  此时再执行一次RunBundler.sh脚本,即可顺利执行完毕得到结果,如图4所示。

  

            图4 Linux下Bundler的运行结果

四、Bundler的输出格式

  我们可以在BASE_PATH\Bundler目录下找到生成的结果。如图5所示。

  

           图5 Bundler目录下存放的处理结果

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

  这些bundle文件包含了一些经过估算得到的场景和相机几何信息。文件的格式如下:  

   
   
# Bundle file v0. 3 <num_cameras> <num_points> [2 integers] <camera1> <camera2> ... <cameraN> <point1> <point2> ... <pointM>

  每一个camera实体<cameraI> 的值是估算得到的相机内部和外部参数,形式为:

   
   
<f> <k1> <k2> [the focal length, followed by two radial distortion coeffs] <R> [a 3x3 matrix representing the camera rotation] <t> [a 3-vector describing the camera translation]

  每个相机的排序根据其在图片列表中的出现顺序来指定。

  每个point实体<pointI>格式为:

   
   
<position> [a 3-vector describing the 3D position of the point] <color> [a 3-vector describing the RGB color of the point] <view list> [a list of views the point is visible in]

  其中,view list存放的是每一个点所在的场景列表的信息,开头第一个数是每个场景列表的长度信息,然后紧接着分别是相机索引信息、该点所在的SIFT关键点序列的索引信息,以及该关键点所在的位置。

  根据这些bundle文件内容以及小孔成像模型,我们就可以大致得到每台相机的参数:

  focal length (f),

  two radial distortion parameters (k1and k2),

  rotation (R),

  translation (t)。

  按照下面的法则我们可以将一个3D点X投影到参数为(R,t,f)的相机中:

   
   
P = R * X + t (conversion from world to camera coordinates) p = -P / P.z (perspective division) p ' = f * r(p) * p (conversion to pixel coordinates)

  其中,P.z是P的z坐标值。r(p)是一个用来计算出径向畸变(radial distortion)校正的尺度变量值的函数:

   
   
r(p) = 1.0 + k1 * ||p||^ 2 + k2 * ||p||^ 4.

  最后,利用上面的公式还可以得到相机的方向(viewing direction)为:

   
   
R ' * [0 0 -1] ' (i.e., the third row of R or third column of R ' )

  其中,' 表示一个矩阵或者向量的转置,而相机的空间位置就为: 

   
   
-R ' * t .

五、总结

  本文介绍了如何使用Bundler来根据图片得到相机参数以及一些空间点云数据,并详细介绍了它在Windows和Linux下的安装和配置方法,以及输出结果的格式。得到的数据将能够运用在3D重建中。利用Bundler可以得到较为稀疏的点云(point clouds)数据。如果需要得到更密集的点,可以使用Yasutaka Furukawa博士写的另外一个非常强大的软件包,称为PMVS2。一种比较常见的途径是使用Bundler来得到相机参数,然后使用Bundle2PMVS程序,将生成结果转换为PMVS2的输入,然后使用PMVS2来得到更密集的点云。另外,读者们可能会对另外一个同样由Furukawa博士开发的实用工具——CMVS感兴趣,CMVS是一个场景聚类程序,在使用PMVS2前可以使用它来进行一些预处理。

 -------------------------------------------------------------------------------------------------------

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根目录下,然后输入下面的命令测试一下例子的图片:

./RunBundler.sh examples/ET

 

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值