重建引擎使用與原理全指南)
計算機(jī)視覺科研【免費下載鏈接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.項目地址https://gitcode.com/gh_mirrors/op/openMVG點擊查看免費下載OpenMVGOpen Multiple View Geometry是一個面向三維計算機(jī)視覺與運動恢復(fù)結(jié)構(gòu)Structure from Motion的開源 C 庫。本文圍繞其openMVG_main_SfM --sfm_engine GLOBAL全局重建引擎完整講解它的算法思想、命令行參數(shù)、源碼實現(xiàn)與實戰(zhàn)建議幫助你基于一份sfm_data.json和預(yù)計算的幾何匹配結(jié)果一次性求解所有相機(jī)的全局位姿與場景三維點云。讀完本文你將掌握全局 SfM 與增量 SfM 的本質(zhì)區(qū)別、openMVG_main_SfM全部必選/可選參數(shù)的語義與默認(rèn)值以及如何通過特征提取與匹配參數(shù)調(diào)優(yōu)來保證全局重建的穩(wěn)定性。一、背景為什么需要全局 SfMOpenMVG 的 SfM 求解階段提供了兩條主線管線參見 SfM 總覽文檔增量 SfMIncremental基于 [ACSfM]_ACCV 2012逐張?zhí)砑訄D像到重建中全局 SfMGlobal基于 [GlobalACSfM]_ICCV 2013即本文主題。多視圖 SfM 的目標(biāo)是在一個公共的三維坐標(biāo)系中估計每張圖像的位姿位置與朝向以及場景的三維點云。增量方法逐張注冊相機(jī)誤差會沿著重建鏈累積產(chǎn)生漂移drift而全局方法一次性融合所有圖像對之間的相對運動把殘差誤差均勻地分散到整個相機(jī)網(wǎng)絡(luò)中從原理上避免了增量鏈?zhǔn)嚼鄯e的漂移問題。全局 SfM 的算法基礎(chǔ)是一篇 ICCV 2013 論文Global Fusion of Relative Motions for Robust, Accurate and Scalable Structure from Motion其核心思想是先用兩視圖幾何估計圖像對之間的相對運動再把所有相對運動在全局尺度上“融合”同時完成異常相對運動的剔除。二、全局 SfM 算法流程原文檔給出了完整的偽代碼這里逐行展開說明結(jié)合源碼實現(xiàn)佐證Require: internal camera calibration (possibly from EXIF data) Require: pairwise geometry consistent point correspondences Ensure: 3D point cloud Ensure: camera poses compute relative pairwise rotations detect and remove false relative pairwise rotations - using composition error of triplet of relative rotations compute the global rotation - using a dense least square and approximated rotations compute relative translations - using triplet of views for stability and colinear motion support compute the global translation - integration of the relative translation directions using a l-∞ method. final structure and motion - link tracks validated per triplets and compute global structure by triangulation, - refine estimated parameter in a 2 step Bundle Adjustment - refine structure and translations - refine structure and camera parameters (rotations, translations).把這 7 個步驟映射到 OpenMVG 源碼中就是GlobalSfMReconstructionEngine_RelativeMotions::Process()位于 sfm_global_engine_relative_motions.cpp的執(zhí)行順序保留最大雙連通子圖graph::CleanGraph_KeepLargestBiEdge_Nodes剔除匹配圖中的孤立節(jié)點保證后續(xù)平均化在圖連通的前提下進(jìn)行計算相對旋轉(zhuǎn)Compute_Relative_Rotations通過Relative_Pose_Engine為位姿圖的每條邊估計相對位姿并抽取其中的旋轉(zhuǎn)分量sfm_global_engine_relative_motions.cpp旋轉(zhuǎn)平均化Compute_Global_Rotations先做三元組旋轉(zhuǎn)推理剔除組合誤差過大的邊再用 L1 或 L2 旋轉(zhuǎn)平均化求解全局旋轉(zhuǎn)sfm_global_engine_relative_motions.cpp相對平移計算Compute_Global_Translations調(diào)用GlobalSfM_Translation_AveragingSolver利用三元組視圖求取相對平移以保證穩(wěn)定性并支持共線運動約束sfm_global_engine_relative_motions.cpp全局平移集成通過 L1 / L2 / SoftL1l-∞ 風(fēng)格等平移平均化方法把相對平移方向統(tǒng)一到全局坐標(biāo)系初始結(jié)構(gòu)計算Compute_Initial_Structure從三元組驗證過的匹配構(gòu)建 tracks再進(jìn)行三角化得到初始三維點云sfm_global_engine_relative_motions.cpp兩步 Bundle AdjustmentAdjust先固定內(nèi)參和旋轉(zhuǎn)、只優(yōu)化結(jié)構(gòu)與平移再放開旋轉(zhuǎn)/平移可選放開內(nèi)參進(jìn)行整體精化最后剔除離群點并做一次收尾 BAsfm_global_engine_relative_motions.cpp。其中“三元組旋轉(zhuǎn)推理”對應(yīng)源碼中的TRIPLET_ROTATION_INFERENCE_COMPOSITION_ERROR模式GlobalSfM_rotation_averaging.hpp對每個三元組 (i, j, k) 檢驗R_ij * R_jk * R_ki與單位矩陣的偏離角度超過 5° 的組合誤差邊會被剔除GlobalSfM_rotation_averaging.cpp。三、運行前提輸入數(shù)據(jù)準(zhǔn)備原文檔明確說明了兩條關(guān)鍵前提管線輸入一條sfm_data.json文件 一份預(yù)計算的匹配結(jié)果match 目錄內(nèi)參要求管線只會處理已知近似焦距的圖像intrinsic id無效未知內(nèi)參的圖像會被直接忽略。因此完整的全局 SfM 流程是 OpenMVG 四步管線見 SfM 總覽文檔中的最后一步圖像列表openMVG_main_SfMInit_ImageListing生成sfm_data.json參見 SfMInit_ImageListing 文檔特征提取openMVG_main_ComputeFeatures提取 SIFT 等區(qū)域特征參見 ComputeFeatures 文檔匹配計算openMVG_main_ComputeMatches計算兩兩匹配并做幾何過濾參見 ComputeMatches 文檔SfM 求解openMVG_main_SfM --sfm_engine GLOBAL。四、命令行用法與參數(shù)詳解原文檔給出的標(biāo)準(zhǔn)調(diào)用命令$ openMVG_main_SfM --engine GLOBAL -i Dataset/matches/sfm_data.json -m Dataset/matches/ -o Dataset/out_Global_Reconstruction/注意--engine是文檔寫法實際源碼中對應(yīng)的是-s|--sfm_engine詳見下文“參數(shù)與源碼對應(yīng)關(guān)系”。4.1 必選參數(shù)參數(shù)含義[-i\|--input_file]一個 SfM_Data 場景文件sfm_data.json或二進(jìn)制sfm_data.bin[-m\|--matchdir]幾何匹配結(jié)果的存放目錄match_dir[-o\|--outdir]輸出數(shù)據(jù)存放目錄output_dir從 main_SfM.cpp 可以看到這三個參數(shù)的注冊代碼cmd.add( make_option(i, filename_sfm_data, input_file) ); cmd.add( make_option(m, directory_match, match_dir) ); cmd.add( make_option(o, directory_output, output_dir) );源碼還會在啟動時做多項校驗輸出目錄不存在則自動創(chuàng)建main_SfM.cpp-m目錄下需要存在image_describer.json以確定區(qū)域類型main_SfM.cpp匹配文件按matches.f.txt / matches.f.bin / matches.e.txt / matches.e.bin的順序自動探測main_SfM.cpp。4.2 可選參數(shù)旋轉(zhuǎn)平均化[-r|--rotationAveraging]取值算法默認(rèn)1L1 旋轉(zhuǎn)平均化 [Chatterjee]否2L2 旋轉(zhuǎn)平均化 [Martinec]是默認(rèn)源碼中的枚舉定義在 GlobalSfM_rotation_averaging.hppenum ERotationAveragingMethod { ROTATION_AVERAGING_L1 1, ROTATION_AVERAGING_L2 2 };L2默認(rèn)調(diào)用rotation_averaging::l2::L2RotationAveraging求解稠密最小二乘問題隨后再做一次非線性精化L2RotationAveraging_RefineGlobalSfM_rotation_averaging.cpp。該實現(xiàn)基于 Daniel Martinec 的工作見 rotation_averaging_l2.hpp 與 rotation_averaging_l2.cpp。L1調(diào)用rotation_averaging::l1::GlobalRotationsRobust基于 Avishek Chatterjee 與 Venu Madhav Govindu 的論文Efficient and Robust Large-Scale Rotation Averaging2013對異常相對旋轉(zhuǎn)更魯棒見 rotation_averaging_l1.cpp 與 rotation_averaging_l1.hpp。4.3 可選參數(shù)平移平均化[-t|--translationAveraging]取值算法默認(rèn)1L1 平移平均化 [GlobalACSfM]否文檔標(biāo)注 default見下2L2 平移平均化弦距離平方和最小化[Kyle2014]否3SoftL1 最小化 [GlobalACSfM]是默認(rèn)源碼枚舉定義在 GlobalSfM_translation_averaging.hppenum ETranslationAveragingMethod { TRANSLATION_AVERAGING_L1 1, TRANSLATION_AVERAGING_L2_DISTANCE_CHORDAL 2, TRANSLATION_AVERAGING_SOFTL1 3, TRANSLATION_LIGT 4 };L2弦距離基于 Kyle Wilson 與 Noah Snavely 的工作最小化相對平移方向的弦距離平方和見 translation_averaging_solver_l2_chordal.cpp 與 translation_averaging_solver.hpp。SoftL1默認(rèn)以 SoftL1 損失函數(shù)集成相對平移向量組bearing / n-uplets并支持d_l1_loss_threshold閾值控制魯棒性translation_averaging_solver.hpp。額外取值 4LiGT源碼還支持TRANSLATION_LIGT 4即Linear Global Translation約束求解但該算法受專利保護(hù)必須在編譯時開啟USE_PATENTED_LIGTCMake 選項才會生效否則運行時會直接報錯退出main_SfM.cpp。原文檔對取值 1 與 3 都標(biāo)注了 “default”最終統(tǒng)一說明為[GlobalACSfM]默認(rèn)設(shè)置是-r 2 -t 3這與 main_SfM.cpp 中的源碼默認(rèn)值完全一致int rotation_averaging_method int (ROTATION_AVERAGING_L2); int translation_averaging_method int (TRANSLATION_AVERAGING_SOFTL1);4.4 可選參數(shù)內(nèi)參精化[-f|--refineIntrinsics]該參數(shù)精確控制 Bundle Adjustment 階段哪些內(nèi)參被視為常量、哪些被視為變量并且可以用|運算符自由組合取值含義ADJUST_ALL精化所有已有參數(shù)默認(rèn)NONE內(nèi)參保持恒定不參與精化ADJUST_FOCAL_LENGTH只精化焦距ADJUST_PRINCIPAL_POINT只精化主點位置ADJUST_DISTORTION只精化畸變系數(shù)如果有組合示例原文檔完整內(nèi)容ADJUST_FOCAL_LENGTH|ADJUST_PRINCIPAL_POINT→ 精化焦距與主點位置ADJUST_FOCAL_LENGTH|ADJUST_DISTORTION→ 精化焦距與畸變系數(shù)如果有ADJUST_PRINCIPAL_POINT|ADJUST_DISTORTION→ 精化主點位置與畸變系數(shù)如果有。在 main_SfM.cpp 中注冊為cmd.add( make_option(f, sIntrinsic_refinement_options, refine_intrinsic_config) );傳入的字符串會經(jīng)cameras::StringTo_Intrinsic_Parameter_Type解析為Intrinsic_Parameter_Type位掩碼main_SfM.cpp因此支持用|組合多個精化目標(biāo)。該選項的實際生效位置在引擎的Adjust()中僅當(dāng)精化選項不等于NONE時第三輪 BA 才會放開內(nèi)參sfm_global_engine_relative_motions.cpp。4.5 其他相關(guān)參數(shù)源碼補充雖然原文檔聚焦 Global 引擎但openMVG_main_SfM是四引擎共用的入口INCREMENTAL / INCREMENTALV2 / GLOBAL / STELLAR見 main_SfM.cpp運行 Global 時也接受以下通用選項[-s|--sfm_engine]引擎類型字符串必須為GLOBAL大小寫敏感非法值會報錯退出main_SfM.cpp[-M|--match_file]直接指定匹配文件名matches.f.txt或matches.f.bin不指定時按默認(rèn)名自動探測main_SfM.cpp[-e|--refine_extrinsic_config]外參精化選項ADJUST_ALL/NONE默認(rèn)ADJUST_ALLmain_SfM.cpp[-P|--prior_usage]啟用運動先驗如 GPS 位置默認(rèn)關(guān)閉main_SfM.cpp。五、源碼級原理引擎內(nèi)部到底做了什么5.1 引擎類結(jié)構(gòu)全局引擎類是GlobalSfMReconstructionEngine_RelativeMotions繼承自ReconstructionEngine對外只暴露四個配置入口sfm_global_engine_relative_motions.hppvoid SetFeaturesProvider(Features_Provider * provider); void SetMatchesProvider(Matches_Provider * provider); void SetRotationAveragingMethod(ERotationAveragingMethod eRotationAveragingMethod); void SetTranslationAveragingMethod(ETranslationAveragingMethod eTranslation_averaging_method_);引擎構(gòu)造函數(shù)內(nèi)部的默認(rèn)方法與命令行默認(rèn)值不同引擎層默認(rèn)ROTATION_AVERAGING_L2TRANSLATION_AVERAGING_L1sfm_global_engine_relative_motions.cpp命令行層默認(rèn)-t 3SoftL1。也就是說如果你通過源碼 API 直接使用該引擎而不是命令行入口平移平均化默認(rèn)是 L1這一點容易被忽略。5.2 兩步實際三輪Bundle Adjustment原文檔說“2 step Bundle Adjustment”但從源碼看Adjust()實際執(zhí)行了三輪遞進(jìn)精化sfm_global_engine_relative_motions.cpp精化結(jié)構(gòu)與平移內(nèi)參保持恒定Intrinsic_Parameter_Type::NONE、旋轉(zhuǎn)保持恒定Extrinsic_Parameter_Type::ADJUST_TRANSLATION、只放開結(jié)構(gòu)與平移精化結(jié)構(gòu) 旋轉(zhuǎn) 平移內(nèi)參仍恒定外參全部放開ADJUST_ALL可選精化內(nèi)參 外參 結(jié)構(gòu)僅當(dāng)-f不等于NONE時執(zhí)行此時-f指定的內(nèi)參子集也參與優(yōu)化。每輪 BA 的中間結(jié)果都會以 PLY 形式落盤structure_00_refine_T_Xi.ply、structure_01_refine_RT_Xi.ply、structure_02_refine_KRT_Xi.ply便于觀察每一輪精化的效果。5.3 離群點剔除與收尾清理BA 之后還有兩道過濾sfm_global_engine_relative_motions.cppRemoveOutliers_PixelResidualError(sfm_data_, 4.0)按像素重投影殘差剔除閾值 4.0 像素RemoveOutliers_AngleError(sfm_data_, 2.0)按觀測光線夾角誤差剔除閾值 2.0°。隨后eraseUnstablePosesAndObservations會刪除觀測過少的位姿與軌道默認(rèn)要求每個位姿至少 12 個三維點、每條 track 至少 3 個觀測sfm_global_engine_relative_motions.cpp。由于剔除后解空間更干凈最后還會再執(zhí)行一次完整的 BA收尾structure_04_outlier_removed.ply。5.4 輸出產(chǎn)物引擎成功結(jié)束后main()會導(dǎo)出main_SfM.cppsfm_data.bin完整重建結(jié)果視圖、內(nèi)參、外參、結(jié)構(gòu)cloud_and_poses.ply三維點云 相機(jī)位姿的可視化文件SfMReconstruction_Report.html重建統(tǒng)計報告視圖數(shù)、內(nèi)參數(shù)、位姿數(shù)、track 數(shù)等見 sfm_global_engine_relative_motions.cpp。此外引擎運行過程還會在輸出目錄生成一系列中間產(chǎn)物包括global_relative_rotation_view_graph/global_relative_rotation_pose_graph的 Graphviz 圖sfm_global_engine_relative_motions.cpp、cameraPath_translation_averaging.ply、initial_structure.ply等方便排查重建失敗的具體階段。整體管線還配有集成測試 global_SfM_test.cpp 可參考驗證。六、實戰(zhàn)建議保證全局 SfM 成功的關(guān)鍵原文檔的 Tips 部分給出了兩條直接可用的調(diào)優(yōu)建議全局 SfM 依賴稠密的圖像網(wǎng)絡(luò)每張圖需要與足夠多的其他圖像形成匹配因此需要檢測更多的Regions points區(qū)域特征點來保證較高的匹配概率。請使用openMVG_main_ComputeFeatures的-p HIGH選項openMVG_main_ComputeMatches的-r .8選項。6.1 特征提取-p HIGHopenMVG_main_ComputeFeatures支持特征提取預(yù)設(shè)級別見 main_ComputeFeatures.cpp 與 ComputeFeatures 文檔$ openMVG_main_ComputeFeatures -i Dataset/matches/sfm_data.json -o Dataset/matches/ -m SIFT -p HIGHHIGH預(yù)設(shè)會顯著增加每張圖像的特征點數(shù)量提升兩兩匹配的覆蓋密度——這是全局平均化算法得以工作的前提。相反如果匹配圖過于稀疏連通度不足Process()第一步保留最大雙連通子圖后可能得到空集引擎會直接失敗sfm_global_engine_relative_motions.cpp。6.2 匹配計算-r .8openMVG_main_ComputeMatches的-r|--ratio參數(shù)控制描述子匹配的距離比閾值見 main_ComputeMatches.cpp 與 ComputeMatches 文檔$ openMVG_main_ComputeMatches -i Dataset/matches/sfm_data.json -o Dataset/matches/ -r .8將比值閾值放寬到 0.8比默認(rèn)更寬松可以保留更多候選匹配對從而讓更多圖像對進(jìn)入相對運動估計間接提高全局圖網(wǎng)絡(luò)的稠密度。放寬閾值引入的少量誤匹配會由后續(xù)的幾何過濾本質(zhì)矩陣/基礎(chǔ)矩陣/單應(yīng)矩陣的魯棒估計以及全局管線中的三元組推理5° 組合誤差剔除來兜底。6.3 使用現(xiàn)成腳本快速跑通全流程如果你不想手動串聯(lián)四個步驟OpenMVG 在構(gòu)建目錄中會導(dǎo)出SfM_GlobalPipeline.py模板見 SfM_GlobalPipeline.py.in。在構(gòu)建目錄下直接運行$ cd openMVG_Build/software/SfM/ $ python SfM_GlobalPipeline.py [full path image directory] [resulting directory]該腳本內(nèi)部會依次調(diào)用openMVG_main_SfMInit_ImageListing、openMVG_main_ComputeFeatures-p HIGH參見 SfM_StructurePipeline.py.in、openMVG_main_ComputeMatches與openMVG_main_SfM是最快體驗全局重建的途徑。6.4 推薦的數(shù)據(jù)目錄組織結(jié)合 SfM 總覽文檔 的建議強烈推薦使用三目錄結(jié)構(gòu)images原始圖像序列matches存放sfm_data.json、image_describer.json、特征、描述子與匹配文件outReconstruction存放 SfM 結(jié)果與處理日志。這能讓-i、-m、-o三個參數(shù)各司其職也便于在不同引擎Incremental / Global之間復(fù)用同一份特征與匹配結(jié)果做對比實驗。七、總結(jié)全局 SfM 是 OpenMVG 兩條主 SfM 管線之一它以“融合相對運動”替代“逐張注冊”從根本上緩解了增量方法在長序列上的漂移問題。其核心鏈路——三元組旋轉(zhuǎn)推理 → L1/L2 旋轉(zhuǎn)平均化 → 三元組相對平移 → L1/L2/SoftL1 平移平均化 → 三角化 → 多輪 Bundle Adjustment——在 GlobalSfM_rotation_averaging.hpp、GlobalSfM_translation_averaging.hpp 與 sfm_global_engine_relative_motions.cpp 中均有完整實現(xiàn)可供研讀。實戰(zhàn)中記住三條要點即可穩(wěn)定復(fù)現(xiàn)輸入確保sfm_data.json中的圖像都有已知近似焦距否則相應(yīng)圖像會被忽略圖網(wǎng)絡(luò)用-p HIGH提特征、-r .8算匹配保證稠密的圖像匹配網(wǎng)絡(luò)參數(shù)默認(rèn)-r 2 -t 3L2 旋轉(zhuǎn)平均化 SoftL1 平移平均化即可獲得良好效果若匹配噪聲大可嘗試 L1 旋轉(zhuǎn)平均化需要精化內(nèi)參時用-f按位組合ADJUST_FOCAL_LENGTH、ADJUST_PRINCIPAL_POINT、ADJUST_DISTORTION。如需進(jìn)一步了解增量管線的對比實現(xiàn)可閱讀 IncrementalSfM 文檔 以及 main_SfM.cpp 中INCREMENTAL分支的代碼。贊分享計算機(jī)視覺科研【免費下載鏈接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.項目地址https://gitcode.com/gh_mirrors/op/openMVG點擊查看免費下載相關(guān)推薦OpenCV contrib 的 Structure From MotionSFM模塊基于 Libmv 輕量版的多視圖三維重建實戰(zhàn)指南OpenCV contrib 的 Structure From MotionSFM模塊基于 Libmv 輕量版的多視圖三維重建實戰(zhàn)指南 導(dǎo)讀 本文圍繞 o計算機(jī)視覺圖像處理深度學(xué)習(xí)機(jī)器學(xué)習(xí)opencv_contrib 中 Structure From MotionSFM模塊的編譯安裝指南Eigen、GLog、GFlags 與 Ceres Solver 依賴配置詳解opencv_contrib 中 Structure From MotionSFM模塊的編譯安裝指南Eigen、GLog、GFlags 與 Ceres S計算機(jī)視覺圖像處理機(jī)器學(xué)習(xí)COLMAP完全指南從圖像到3D模型的革命性Structure-from-Motion平臺COLMAP完全指南從圖像到3D模型的革命性Structure from Motion平臺 你還在為3D重建流程復(fù)雜而煩惱還在因參數(shù)配置不當(dāng)導(dǎo)致重建失敗本計算機(jī)視覺圖形學(xué)圖像處理上一篇EfiGuard與HVCI的兼容性分析HyperGuard環(huán)境下的限制與對策下一篇PingFangSC字體中文Web排版的開源解決方案與最佳實踐創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考