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);