天天看点

Bundler 用户指南

copyright 2008-2009 Noah Snavely ([email protected])        
any problems : please e-mail [email protected]      
什么是Bundler?      
Bundler是主要用于无序图片(源于搜索引擎的图片)收集的运动估计结构的系统。Bundler以一组图片、图片特征、图像之间的匹配关系作为输入,以此重建相机的3D位置和场景的稀疏结构。系统使用递增的方式重建场景,每次处理几幅图片,使用了Lourakis and Argyros的Sparse Bundler Adjustment数据包的改进版本作为优化方式(主要用迭代的方法来减少在投影中可能存在的误差)。本Blog的前几个文章介绍了两种在Windows环境下安装Bundler的方法。(在CYGWIN平台上使用Bundler,VS2010下Bundler的使用)      
Bundler软件包中都有什么?      
和Bundler的二进制代码在一起的是Bundler的可执行文件(bin/bundler)和一些其他可用的脚本和可执行文件(bin/directory)。此外,在目录examples/directory下有图片集和例子的结果。还有David M.Mount和Sunil Arya的ANN(approximate nearest neighbors)库,用来搜索无符号向量。      
一个实用的功能将输出的Bundle文件(.out)转换成Dr. Yasutaka Furukawa's开发的PMVS多视点立体系统所利用的文件Bundle2PMVS文件也被包含在程序中。有一个被称作RadialUndistort的能产生不失真的文件也被包含在程序中。      
最后还有能读取EXIF的jhead程序也被包含在程序中。(相关解释可以查看本Blog中的利用照片携带的EXIF来估计焦距等信息)。      
在开始使用Bundler之前      
本Blog的前几个文章介绍了两种在Windows环境下安装Bundler的方法。(在CYGWIN平台上使用Bundler,VS2010下Bundler的使用)      
首先可以下载Bundler文件:http://phototour.cs.washington.edu/bundler/,并将下载的文件解压在某一路径之下(BASE_PATH),可能还需要ImageMagick(http://www.imagemagick.org/)将jpg转换成pgm,以便能使用SIFT(http://www.cs.ubc.ca/~lowe/keypoints/),将SIFT文件拷贝到路径BASE_PATH/bin之下(确保是'sift',或在Windows平台上选择 'siftWin32.exe' ). RunBundler.sh的产生依赖于Bash编译器和Prel编辑器。最简单的使用方法是用cygwin。最后将BASE_PATH/lib/libANN_char.so中的ANN共享库拷贝到LD_LIBRARY_PATH (or add BASE_PATH/lib to LD_LIBRARY_PATH).      
运行Bundler      
最简单的运行Bundler的方法是使用Bash Shell脚本 RunBundler.sh 简单地在带有一系列JPEG格式图片的文件路径之下执行脚本,它会自动地完成所有从运动恢复结构的所有操作。像上文提到的那样,需要先编辑脚本并确定BASE_PATH变量的值。(还需要编辑Perl脚本BASE_PATH/bin/extract_focal.pl中的BASE_PATH变量和Bash脚本 BASE_PATH/bin/ToSift.sh)。      
Bundler的执行是这一系列重建场景操作的最后一步。RunBundler.sh帮我们处理了所有的操作,但知道如何去做是十分必要的。主要的初始化操作是产生特征点和图片集的成对特征点的匹配。虽然特征值检测可以用任意算法,但是由于Bundler设计时是围绕SIFT展开的,所以建议使用SIFT。估计焦距的过程也应该被指定。重建操作可以分为以下四步:      
1. 利用脚本‘extract_focal.pl’创建图像列表,同时提取了焦距信息,并存储在文件列表之中。      
2. 为每幅图像创建SIFT特征信息。      
3. 针对每对图像做特征匹配,将计算出的匹配存储在文件‘matchs.init.txt’中。      
4. 在特定的选项之下运行Bundler。      
执行RunBundler.sh脚本是执行上述操作的最简单方法。为了简化1-3步骤,很多可用的脚本和程序都调用这个软件。      
Bundler自身最典型的调用方法如下:      
   > bundler list.txt --options_file options.txt      
第一项是将被重建的图片列表,下面是给出指定选项操作的选项文件。RunBundler.sh能创建相应的选项文件并工作在多个场合之中。通用操作在后续中描述。      
输出文件格式与场景表达      
Bundler生成的文件名‘bundle_*.out’。使用默认的指令,Bundler生成的文件名为‘bundle_<n>.out’,在每组图片被寄存之后,它包含了当前场景的状态(n = 当前寄存相机的数目)。所有可能的图片都被寄存之后,Bundler 输出最后的文件‘bundle.out’.另外,‘ply’文件包含了在每次循环之后的重建的相机与重建的点。这些ply文件中可以利用“scanalyze”mesh viewer(http://graphics.stanford.edu/software/scanalyze/)或Meshlab(http://meshlab.sourceforge.net/)。      
bundle 文件中包含了估计的场景和相机的几何结构:      
# Bundle file v0.3
    <num_cameras> <num_points>   [two integers]
    <camera1>
    <camera2>
       ...
    <cameraN>
    <point1>
    <point2>
       ...
    <pointM>      
每个相机项目<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]      
相机出现的次序与图片列表相一致。      
每个点的表示都有如下的形式:      
<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 以 list 的长度为起始(i.e., the number of cameras the point is visible in).这个列表是以四元的形式表述的:<camera> <key> <x> <y>。这里的<camera>表示相机的引索值,<key>表示的是在相应的相机中SIFT的引索值,<x>、<y>是相应关键点的位置坐标。所有的引索值都是从0开始的。像素点的位置是用浮点型表示,坐标原点在图像的中心。x轴向右增加,y轴向上增加。因此(-w/2, -h/2)表示的是图像的左下角,(w/2, h/2)表示的是图像空间的右上角。      
我们使用了一个针孔相机模型,我们估计的参数有:焦距f,两个射线失真系数k1、k2,旋转矩阵R,平移t。将3D点投影在相机(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失真:      
r(p) = 1.0 + k1 * || p ||^2 + k2 * || p ||^4.      
这个表达式给出了在像素点上的投影,图片的原点在图像的中心(in addition, in the camera coordinate system, the positive z-axis points backwards, so the camera is looking down the negative z-axis, as in OpenGL).      
最后,上面描述的这些等式的观测方向为:R' * [0 0 -1]'  (i.e., the third row of -R or third column of -R')      
(where ' indicates the transpose of a matrix or vector).      
相机的3D位置可以表述成:-R' * t.      
命令行选项      
Bundler有一组内部参数,所以这里有大量的命令行选项。通过实验测试已经获得了一组参数,能够应对大多数的图片收集过程,所以利用默认的参数也是可靠的(使用RunBundler.sh脚本)。使用'--options_file <file>'的选项也是很可靠的,它告诉Bundler去从文件之中读取一组选项列表。由RunBundler.sh创建的默认选项文件表示如下:      
--match_table matches.init.txt
     [specifies the file where the match files are stored]匹配关系的存储位置

  --output bundle.out
     [specifies the name of the final output reconstruction]输出的文件名

  --output_all bundle_
     [specifies that all intermediate reconstructions should be重建的中间结果的文件名
      output to files with prefix "bundle_"]

  --output_dir bundle
     [the directory all output files should be written to, typically输出文件的所在路径
      called "bundle"]

  --variable_focal_length
     [directs bundler to optimize for an independent focal length for每幅图片独立焦距值的最优解
      each image]

  --use_focal_estimate
     [directs bundler to use the estimated focal lengths obtained from在EXIF文件中获得的估计焦距值
      the Exif tags for each image]

  --constrain_focal
     [constrain the focal length of each camera to be close to the增加了焦距的限制
      initial focal length estimate (from Exif tags).  This option
      adds penalty terms to the bundle adjustment objective function]

  --constrain_focal_weight 0.0001
     [weight on the penalty terms for the focal length constraints (a
      small weight is typically sufficient)]

  --estimate_distortion
     [directs bundler to estimate radial distortion parameters for指定radial失真系数
      each image]

  --run_bundle
     [run structure from motion (as opposed to other operations on
      existing reconstructions)]      
其他选型:      
除了默认的选项,下列的选型也十分重要,包括:      
--init_pair1 <image_idx1>
  --init_pair2 <image_idx2>
     [Specifies which images to use as the initial pair.  Very useful指定初始的图像对
      when the automatically chosen pair results in a bad
      reconstruction.]

  --sift_binary <sift>
     [The location of the SIFT binary on your installation, e.g.,指定SIFT的位置
     '/usr/bin/sift' or '/cygdrive/c/usr/bin/siftWin32.exe'.]

  --add_images <add_list>
     [Given an existing reconstruction specified with the --bundle添加新的图片
      option, attempts to add the images listed in the file <add_list>
      to the reconstruction, writing the results to the file
      'bundle.added.out'.  The new list of images is written to
      'list.added.txt'.  Use the 'extract_focal.pl' script to generate
      the file <add_list> from a directory of JPEGs, but note that the
      correct path to these images must be included -- which may
      require editing the add list file.  Do not include the
      '--run_bundle' option when adding new images.  If the SIFT key
      files have not yet been generated for the new images, bundler
      will try to extract features, but this requires that the
      --sift_binary option be set.]

  --options_file <options_file>
     [Read in a list of options from the specified file.]从特定的文件读取项目表。

  --help
     [Print out the complete list of command-line options.]打印完整的选项目录      
Thanks to Manolis Lourakis and Antonis Argyros for their sparse bundle adjustment package, to David Lowe for SIFT , to David M. Mount and Sunil Arya for their approximate nearest neighborslibrary, and to Matthias Wandel for his excellent 'jhead' program.

Special thanks as well to Kathleen Tuite and Sebastian Koch for testing this distribution.




      

References

[1] Noah Snavely, Steven M. Seitz, and Richard Szeliski.  Photo
    Tourism: Exploring Photo Collections in 3D.  SIGGRAPH Conf. Proc.,
    2006.

[2] Noah Snavely, Steven M. Seitz, Richard Szeliski.  Modeling the
    World from Internet Photo Collections. International Journal of
    Computer Vision (to appear), 2007.

[3] M.I.A. Lourakis and A.A. Argyros.  The Design and Implementation
    of a Generic Sparse Bundle Adjustment Software Package Based on
    the Levenberg-Marquardt Algorithm.  Tech.  Rep. 340, Inst. of
    Computer Science-FORTH, Heraklion, Crete, Greece. Available from
    http://www.ics.forth.gr/~lourakis/sba.      

继续阅读