openMVG源碼學習(四)main_GlobalSFM
之前的連結:
openMVG源碼學習(一)main_SfMInit_ImageListing.
openMVG源碼學習(二)main_ComputeFeatures
openMVG源碼學習(三)main_ComputeMatches.
代碼前的準備
删除cmd相關
更改代碼書寫習慣。。。
前言少序,直接開始。
論文支援
Global Fusion of Relative Motions for Robust, Accurate and Scalable Structure from Motion
輸入輸出說明
std::string sSfM_Data_Filename{"../img_list_output/sfm_data.json"};
//sfm_data.json路徑
std::string sMatchesDir{"../feature_output"},
//幾何比對的路徑
sMatchFilename{"matches.f.bin"};
//比對的檔案名
std::string sOutDir{"../sfm_output"};
//輸出路徑
int iRotationAveragingMethod = int (ROTATION_AVERAGING_L2);
//參數:設定旋轉平均法
int iTranslationAveragingMethod = int (TRANSLATION_AVERAGING_SOFTL1);
//參數:設定轉換平均法
std::string sIntrinsic_refinement_options = "ADJUST_ALL";
//參數: 内在參數,用于控制哪一個錄影機參數必須被視為保持不變的變量以進行非線性細化的類型
//NONE 固有參數将被視為固定參數
//ADJUST_FOCAL_LENGTH 焦距将被視為細化的變量
//ADJUST_PRINCIPAL_POINT 将主點視為細化變量
//ADJUST_DISTORTION 畸變參數将被視為細化的變量
//ADJUST_ALL 所有參數将被視為細化變量
代碼邏輯
參數初始化
iRotationAveragingMethod
if (iRotationAveragingMethod < ROTATION_AVERAGING_L1 ||
iRotationAveragingMethod > ROTATION_AVERAGING_L2 )
//判定iRotationAveragingMethod可用
intrinsic_refinement_options
const cameras::Intrinsic_Parameter_Type intrinsic_refinement_options =
cameras::StringTo_Intrinsic_Parameter_Type(sIntrinsic_refinement_options);
//設定相機内參矩陣參數并判定(判定略)
sfm_data讀取
SfM_Data sfm_data;
if (!Load(sfm_data, sSfM_Data_Filename, ESfM_Data(VIEWS|INTRINSICS)))
sImage_describer從圖像描述符檔案初始化區域類型(用于圖像區域提取)
using namespace openMVG::features;
const std::string sImage_describer = stlplus::create_filespec
(sMatchesDir, "image_describer", "json");
std::unique_ptr<Regions> regions_type = Init_region_type_from_file(sImage_describer);
feats_provider特征讀取
std::shared_ptr<Features_Provider> feats_provider = std::make_shared<Features_Provider>();
if (!feats_provider->load(sfm_data, sMatchesDir, regions_type))
matches_provider比對讀取
std::shared_ptr<Matches_Provider> matches_provider = std::make_shared<Matches_Provider>();
if (
!(matches_provider->load(sfm_data, sMatchFilename) ||
matches_provider->load(sfm_data, stlplus::create_filespec(sMatchesDir, "matches.e.txt")) ||
matches_provider->load(sfm_data, stlplus::create_filespec(sMatchesDir, "matches.e.bin")))
)
輸出檔案夾判定
全局SfM重建過程
sfmEngine建立(sfmdata,輸出路徑,輸出路徑+Reconstruction_Report.html)
GlobalSfMReconstructionEngine_RelativeMotions sfmEngine(
sfm_data,
sOutDir,
stlplus::create_filespec(sOutDir, "Reconstruction_Report.html"));
配置特征與比對feats_provider,matches_provider
sfmEngine.SetFeaturesProvider(feats_provider.get());
sfmEngine.SetMatchesProvider(matches_provider.get());
配置重建參數intrinsic_refinement_options
sfmEngine.Set_Intrinsics_Refinement_Type(intrinsic_refinement_options);
配置運動平均方法iRotationAveragingMethod,intrinsic_refinement_options
sfmEngine.SetRotationAveragingMethod(
ERotationAveragingMethod(iRotationAveragingMethod));
sfmEngine.SetTranslationAveragingMethod(
ETranslationAveragingMethod(iTranslationAveragingMethod));
BA開始
if (sfmEngine.Process()) //進行計算的函數
{
std::cout << std::endl << " Total Ac-Global-Sfm took (s): " << timer.elapsed() << std::endl;
//輸出報告
std::cout << "...Generating SfM_Report.html" << std::endl;
Generate_SfM_Report(sfmEngine.Get_SfM_Data(),
stlplus::create_filespec(sOutDir, "SfMReconstruction_Report.html"));
//導出計算場景(資料和可視化結果)
std::cout << "...Export SfM_Data to disk." << std::endl;
Save(sfmEngine.Get_SfM_Data(),
stlplus::create_filespec(sOutDir, "sfm_data", ".bin"),
ESfM_Data(ALL));
Save(sfmEngine.Get_SfM_Data(),
stlplus::create_filespec(sOutDir, "cloud_and_poses", ".ply"),
ESfM_Data(ALL));
//ESfM_Data說明
//VIEWS = 1,
//EXTRINSICS = 2,
//INTRINSICS = 4,
//STRUCTURE = 8,
//CONTROL_POINTS = 16,
//ALL = VIEWS | EXTRINSICS | INTRINSICS | STRUCTURE | CONTROL_POINTS
return EXIT_SUCCESS;
}