ORB SLAM2原始碼閱讀記錄(1) 單目初始化

2021-10-06 15:29:49 字數 1685 閱讀 9528

最近開始學習下orb_slam2原始碼,邊閱讀邊記錄下自己的理解,首先來乙個大致初始化流程圖,閱讀從mono_euroc.cc開始。

第一幀剛來

,未構造初始化器

,則構造 (

如果是單目初始器

mpinitializer為空,

即第一次進行初始化

,並且特徵點數

>100

,得到用於初始化的第一幀:)

2.第二幀(當前幀),如果當前(第二幀)幀特徵點太少,刪除之前構造的初始器,將

mpinitializer

置空,返回需要重新初始化(如果當前幀特徵點數大於

100,則得到用於單目初始化的第二幀:) 3.

否則,第二幀特徵點數大於

100,就開始找匹配,在

minitialframe

與mcurrentframe

中找匹配的特徵點對 4.

檢查如果初始化的兩幀之間的匹配點太少,小於

100,則重新初始化 5.

初始化開始in

itializer::initialize

函式,根據匹配點,通過

h模型或

f模型進行單目初始化,得到兩幀間相對位姿、初始

:mvinip3d

,初始化地圖

5.mpinitializer->initialize (mcurrentframe, mvinimatches, rcw, tcw, mvinip3d, vbtriangulated)

根據當前幀和匹配點對,啟動執行緒平行計算基本矩陣和單應矩陣,計算分數比,根據給出評價函式打分的方式自動選擇求解運動的方法。

reconstructh

函式或reconstructf函式

5.1.

刪除那些無法進行三角化的匹配點;

5.2.

將初始化的第一幀作為世界座標系,因此第一幀變換矩陣為單位矩陣,當前幀的位姿:由世界系到當前幀的變換矩陣;

5.3.tracking::createinitialmapmonocular

函式,將三角化得到的3d點

mvinip3d

包裝成,初始化地圖,將地圖點和關鍵幀加入地圖

map中;

5.3.createinitialmapmonocular();

將三角化得到的3d點

mvinip3d

包裝成,將3d

點包裝成

型別存入

keyframe

和map

中 1).

將初始幀,當前幀建立均為關鍵幀

2).向地圖中新增初始和當前關鍵幀

3).建立地圖點並與關鍵幀關聯。將

3d點包裝成

地圖點 4).

更新關鍵幀間的連線關係(以共視地圖點的數量作為權重)

5).ba

優化,對這兩幀姿態進行全域性優化重投影誤差(lm)

6).需要更新區域性地圖,區域性關鍵幀和區域性地圖點;並且更新

lastframe

,lastkeyframe

,以及當前幀的

referencekf

歡迎交流和學習,如有理解不對的地方請指出。

ORBSLAM2原始碼閱讀(1) 概論

最近一直在沉迷明日方舟好久沒更新部落格了,好在這遊戲理智少,而且想著自己不能再頹廢下去,痛定思痛,決定開始開這個坑。orbslam2應該會是目前能開的最大的坑了吧,我盡量做完 咕咕 如果看到有什麼錯誤的地方或者感覺需要改進的地方請務必和我說,大家一起努力嘛 關於整個orbslam的流程,請參考這個部...

orb slam2原始碼解讀(一) Frame類

orb slam2是slam界中乙個非常優秀且著名的專案,關於該項目的解讀網上資料較少,大都是對演算法的整體構架和演算法思路進行解讀,本系列部落格將會帶你一點一滴地解讀orb slam2的源 在兼顧演算法講解的同時,更著重與 的結構與實現細節。這次就先從frame類講起。公有成員變數 orb特徵點詞...

ORB SLAM2 定位模式

void load const string filename,systemsetting mysystemsetting,keyframedatabase mpkeyframedatabase 別忘了新增標頭檔案和命名空間中的類宣告。同樣,需要在map.cc檔案中修改load 函式。laod 函式...