openMVG----sfm

sfm模块处理SfM相关数据的存储和解决SfM问题的方法(相机位姿估计,结构三角重构,捆集调整)

一个通用的SfM数据容器

SfM_Data类包含了SfM的相关数据

  • 一系列View
    • the used images
  • 一系列相机外参
    • the camera poses
  • 一系列相机内参
    • the camera internal projection parameters
  • 点云,即结构
    • the collection of landmark (3D points associated with 2d view observations)
struct SfM_Data
{
  /// Considered views
  Views views;
  /// Considered poses (indexed by view.id_pose)
  Poses poses;
  /// Considered camera intrinsics (indexed by view.id_cam)
  Intrinsics intrinsics;
  /// Structure (3D points with their 2D observations)
  Landmarks structure;
  
  // ...
}

View concept

包含和图像相关的信息:

  • image filename
  • id_view (must be unique)
  • id_pose
  • id_intrinsic
  • image size
    因为采用了id_*,所以可以共享位置和内参很方便
    该类型是抽象的。可以在此基础上自定义新的类型

Camera Poses concept

存储全局的Ri,Ti

Camera Intrinsic concept

该类型是抽象的。可以在此基础上自定义新的类型。可共享

Structure/Landmarks concept

3D点云

SfM_Data cleaning

去除外点的通用接口:

  • 给定的像素残差
  • 沿着track的最小角度

Triangulation

  • 一般方法(blind):
    • Triangulate tracks using all observations,
    • Inlier/Outlier classification is done with a cheirality test,
  • A robust method:
    • Triangulate tracks using a RANSAC scheme,
    • Check cheirality and a pixel residual error.

Non linear refinement, Bundle Adjustment

openMVG提供通用的BA框架,可以对以下参数进行改进或保持不变:

  • internal orientation parameters (intrinsics: camera projection model),
  • external orientation parameters (extrinsics: camera poses),
  • structure (3D points).
SfM_Data sfm_data;
// initialize the data
// ...

const double dResidual_before = RMSE(sfm_data);

// Bundle adjustement over all the parameters:
std::shared_ptr<Bundle_Adjustment> ba_object = std::make_shared<Bundle_Adjustment_Ceres>();
ba_object->Adjust(sfm_data);

const double dResidual_after = RMSE(sfm_data);

你可能感兴趣的:(openMVG)