帮酷LOGO
  • 显示原文与译文双语对照的内容
文章标签:图像  结构  str  SEQ  Sequences  structure-from-motion  Motion  Sequence  
Structure-from-Motion for MAV image sequences

  • 源代码名称:mavmap
  • 源代码网址:http://www.github.com/mavmap/mavmap
  • mavmap源代码文档
  • mavmap源代码下载
  • Git URL:
    git://www.github.com/mavmap/mavmap.git
  • Git Clone代码到本地:
    git clone http://www.github.com/mavmap/mavmap
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/mavmap/mavmap
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
  • ====== MAVMAP

    MAVMAP是一个structure-from-motion系统。

    系统采用一系列图像( 从任意数量的摄像机和照相机模型中获取) 作为输入,生成相机姿态和稀疏场景几何图像的3-D 重建。

    关于重建过程的内部信息的更多信息可以在下面找到。

    如果你发现这个项目有用,请考虑引用

    Schönberger, J. L., Fraundorfer, F., and Frahm, J.-M.:
    Structure-from-motion for MAV image sequence analysis with photogrammetric applications,
    Int. Arch. Photogramm. Remote Sens. Spatial Inf. Sci., XL-3, 305-312,
    doi:10.5194/isprsarchives-XL-3-305-2014, 2014.
    要求
    • 升压
    • Eigen3
    • ceres解算器
    • OpenCV

    已经确认使用以下版本( 2013-12-09 ):

    • boost==1.55.0
    • eigen==3。2.0
    • ceres-solver=={1.7.0.1.8.0 }
    • OpenCV== 2.4.7.0
    • Clang==LLVM版本 5.0 ( clang-500.2.79 ),gcc==4.6.3

    此外,它在 Ubuntu 12.04上完全可以使用系统包和 OpenCV> =2.4.

    目前,该系统只适用于 64bit 平台,但它也运行在 32bit 平台上,但性能降低,通过添加以下编译标志 EIGEN_DONT_ALIGN_STATICALLY

    安装
    • 安装ceres解算器:
     tar zxf ceres-solver-X.X.X.tar.gz
     cd ceres-solver-X.X.X
     mkdir build
     cd build
     cmake.. 
     make
     sudo make install
    • 编译 MAVMAP:
     cd mavmap
     mkdir build
     cd build
     cmake.. 
     make
    许可证

    免费供学术使用。有关商业许可的信息,请联系作者。

    Johannes L. Schönberger <johannes.schoenberger (at) tum.de>
    Friedrich Fraundorfer <friedrich.fraundorfer (at) tum.de>
    用法

    包括一个完全功能的映射例程,目的是重建图像序列,如无人机图像序列。

    图像数据格式

    这个例程在 src/mapper 中实现,可以通过 命令行 接口进行配置。 输入数据由一组图像组成,这些图像的属性在 imagedata.txt 文件中定义。 所有文件必须位于同一目录中,e.g.

    imagedata.txt
    image1.bmp
    image2.bmp
    image3.bmp
    image4.bmp
    image5.bmp
    [...]

    imagedata.txt 定义图像获取的顺序。 连续图像应该有重叠的效果。 每个图像都是在单独的一行中定义的,其中包含一些元数据和照相机模型,e.g.

    # COMMENT
    # BASENAME, ROLL, PITCH, YAW, LAT, LON, ALT, LOCAL_HEIGHT, TX, TY, TZ, CAM_IDX, CAM_MODEL, CAM_PARAMS[N]
    image1, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5, 1, PINHOLE, 100.000, 100.000, 368.000, 256.000
    image2, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5
    image3, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5
    image4, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5, 2, OPENCV, 100.000, 100.000, 368.000, 256.000, 0.1, 0.2, 0.01, 0.02
    image5, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5, 1
    image6, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5
    image7, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5
    image8, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5, 2
    image9, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5, 2
    image10, 1.1, -0.3, -1.0, 47.4, 9.2, 485.4, 2.8, 20.3, -0.4, -4.5, 2, OPENCV, 100.000, 100.000, 368.000, 256.000, 0.1, 0.2, 0.01, 0.02
    [...]
    • {BASENAME}: 没有文件扩展名的图像文件名。
    • {ROLL, PITCH, YAW}: 以弧度( 使用约定) 为单位的摄像机方向 R = R_x(roll) * R_y(pitch) * R_z(yaw) ) 在世界坐标系中。
    • {LAT, LON, ALT}: 从 比如 全球摄像机定位gps传感器。
    • {LOCAL_HEIGHT}: 地面上的局部高度从 比如 到邻近传感器。
    • {TX, TY, TZ}: 世界坐标系中的摄像机位置。
    • {CAM_IDX, CAM_MODEL, CAM_PARAMS[N]} 摄像机指标。摄像机模型和摄像机参数。 每个唯一相机必须获得唯一的相机索引。 假定相机模型等于所有下列图像,直到定义新索引的新摄像机模型为止。 在上述示例中,分别从第二摄像头和不同摄像机模型中的第二摄像头和图像 {4,8,9,10} 获取图像 {1,2,3,5,6,7}。 可用摄像机模型和它们各自的参数排序可以在 src/base3d/camera_models.h 中找到。

    除了图像 BASENAME,目前只作为输入作为输入的可选约束的相机姿态来自imu传感器。 值 {ROLL, PITCH, YAW, TX, TY, TZ} 将在输出数据文件 imagedataout.txt 中设置。

    可以很容易地在库的核心组件之上构建任意映像配置的映射器。 请参见下面的内部部分。

    控制点和地理注册

    控制点的定义提供以下两个功能:

    • 地理注册 w.r. t。固定控制点坐标系( 地面控制点)
    • 通过定义变量控制点估计特定点的估计

    要将 --use-control-points 设置为指向文件,必须启用并将 --control-point-data-path 设置为以下格式:

    ## FIXED_CONTROL_POINT_NAME, X, Y, Z
    IMAGE_IDX1, IX, IY
    IMAGE_IDX2, IX, IY
    ...
    # VARIABLE_CONTROL_POINT_NAME, X, Y, Z
    IMAGE_IDX1, IX, IY
    IMAGE_IDX2, IX, IY
    ...
    # VARIABLE_CONTROL_POINT_NAME, X, Y, Z
    IMAGE_IDX1, IX, IY
    IMAGE_IDX2, IX, IY
    ...
    ## FIXED_CONTROL_POINT_NAME, X, Y, Z
    IMAGE_IDX1, IX, IY
    IMAGE_IDX2, IX, IY
    • {FIXED_CONTROL_POINT_NAME,VARIABLE_CONTROL_POINT_NAME} :唯一控制点标识符。一个 # 指示变量和两个 #的固定控制点。
    • {X, Y, Z}: 控制点的位置,变量控制点使用dummy值。
    • {IMAGE_IDX}: 观察 imagedata.txt 图像中的0-based 指数。
    • {IX, IY}: 图像中的像素位置。
    内置内部组件

    MAVMAP是建立在以下核心组件之上的:

    • FeatureManager: 管理 2-D 图像特征点,3-D 场景点,相机姿势,照相机模型,2-D 特征对应和 3-D 点轨迹。

    • FeatureCache: 提取特征( 冲浪) 位置和描述符并将它们缓存在磁盘上,以便快速检索。 改变特征检测和提取参数的自动检测。

    • SequentialMapper为图像的顺序处理。场景和摄像机的分束。自动循环检测和合并提供工具。

    SequentialMapper 利用 FeatureCache 进行特征检索和 FeatureManager 存储,以存储完整的重构信息( 相机姿势,场景,特征位置 等等 ),以及快速的数据访问。 FeatureManager 是一个自包含类,没有任何外部依赖关系。

    src/mapper 例程用于重建顺序图像集,它的中每个图像都按顺序执行一次。 SequentialMapper的方法允许创建任意图像集合的映射例程。

    类中的数据结构专门为快速访问。方便使用和低内存占用而选择。 数据通常保证具有常量访问和插入时间。

    场景的整体结构和摄像机姿势存储在 FeatureManager 中,不需要任何附加信息和数据输出。

    管理器的核心功能是跟踪特征通信,它自动创建新的3-D 点,合并现有的轨迹,消除同一映像中相同 3-D 点的重复观察。

    std::unordered_map 容器的数据访问应该小心。 虽然 std::unordered_map[] 是最快的访问,但是如果键不存在,它会在地图中自动创建一个新的key-value 对。 它可以破坏自动跟踪列表功能。 因此,建议使用 std::unordered_map::at 从外部访问数据。

    SequentialMapper

    此类用于以下范例化进程链:

    • 通过估计基本矩阵找到良好的初始图像对和重建结构。 ( 请参见 process_initial )
    • 根据已经重建图像或者处理已经重建的图像,依次重建新的摄像机姿势并扩展现有的场景几何图形,以对已经重建的图像进行处理,从而扩展和改善场景几何图形。 本例基于 2 D-3D位姿估计,利用已经重建的3-D 世界点及它的相应图像的图像特征。 ( 请参见 process )
    • 调整本地或者全局分发包。 ( 请参见 adjust_bundle )
    • 检测已经重建场景中的循环。 ( 请参见 detect_loop )
    • 尝试合并具有重叠场景部件的不同顺序贴图器。 ( 请参见 merge )。

    范例用法:

    SequentialMapper mapper1(...);
    mapper1.process_initial(image1, image2);
    mapper1.process(image3, image2);
    mapper1.process(image3, image1);
    mapper1.process(image4, image3);
    mapper1.process(image5, image4);
    [...]
    mapper1.adjust_bundle(...);
    mapper1.process(image100, image4);
    mapper1.detect_loop(image100);
    mapper1.adjust_bundle(...);
    SequentialMapper mapper2(...);
    mapper2.process_initial(image1, image2);
    mapper2.process(image3, image2);
    [...]
    mapper1.merge(mapper2);

    此类始终保留以前提取的特征,因此建议按顺序处理图像以优化性能,以便根据最后一个图像处理下一个图像,例如 i.e.。

    SequentialMapper mapper(...);
    mapper.process_initial(image1, image2);
    mapper.process(image3, image2);
    mapper.process(image4, image3);
    mapper.process(image5, image4);
    mapper.process(image6, image4);
    mapper.process(image6, image5);
    [...]

    有关类用法的更多详细信息可以在头源文件中找到。

    包调整

    束调整是基于ceres解算器库的。

    在同一调整问题中组合任意相机模型是可能的。 求解器采用鲁棒Cauchy损失函数,代价函数以像素重投影误差为基础。 使用 3-D 世界( X ) 投影到 2-D 图像( X ) 点的以下约定:

    T = [R | t]
     [0 | 1]
    X' = T * X
    x = C(X')

    其中 T 是 4 x4矩阵,并将 3-D 点转换为摄像机坐标系统。 R 是 3字节转换矩阵,T 是 3 x1转换矢量。 R ( 在角度轴表示中) 和 T 存储在 FeatureManager 中。 在世界坐标系中的摄像机姿态可以通过从 T^-1 中提取 R't' 来计算。

    C(X) 表示相机模型,并将相机坐标系中的3-D 点投影到图像平面。 对于标准针孔摄像机模型,定义为:

    C(X) = f * X + c

    其中 f 是焦距,而 c 是主要点。

    bundle调整器优化了特性管理器的姿势和 3-D 点,换句话说,只使用很少的额外内存来构建包调整问题。

    求解器采用稀疏Schur算法求解方程,参数和剩余序采用Ceres自动排序程序。

    分束调整中的每个 3-D 点都保证在单独的图像中至少有两个观测,以避免在比较。 应该设置至少两个姿态以避免基准缺陷,这将导致排序缺失 Jacobians。



    文章标签:图像  str  Struct  结构  Motion  SEQ  Sequence  Sequences  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语