ORB SLAM2 關鍵問題之初始化

2021-10-06 05:56:25 字數 3139 閱讀 2770

初始化在tracking執行緒的track()函式中完成.

void tracking::stereoinitialization()

步驟:1 特徵點數大於500才開始初始化, 構建初始關鍵幀,並設定pose為單位陣, 並將初始關鍵幀新增到map中.

//整個函式只有在當前幀的特徵點超過500的時候才會進行

if(mcurrentframe.n>

500)

}3 直接看**

// step :在區域性地圖中新增該初始關鍵幀

>

insertkeyframe

(pkfini)

;//當前幀變上一幀

mlastframe =

frame

(mcurrentframe)

;mnlastkeyframeid=mcurrentframe.mnid;

// 上一關鍵幀的id

mplastkeyframe = pkfini;

mvplocalkeyframes.

push_back

(pkfini)

;>()

;// 設定參考關鍵幀

mpreferencekf = pkfini;

mcurrentframe.mpreferencekf = pkfini;

4 還有幾個不懂的地方

mpmap-

>

;// ???????????

mpmap-

>mvpkeyframeorigins.

push_back

(pkfini)

;mpmapdrawer-

>

setcurrentcamerapose

(mcurrentframe.mtcw)

;接下來到了最複雜的單目初始化.

void tracking::monocularinitialization()

1 單目初始化需要連續兩幀特徵點數大於100才會進行, 對於第一幀,首先構建frame,

minitialframe = frame(mcurrentframe);

mlastframe = frame(mcurrentframe);

mlastframe的作用:

將當前幀所有特徵點的座標儲存在 mvbprevmatched ,

mvbprevmatched.resize(mcurrentframe.mvkeysun.size());

// 儲存初始化第一幀的全部特徵點的座標

for(size_t i=0; i構建初始化器 以及 初始化 mvinimatches 容器的元素為-1, 接著就跳出,等待下一幀.

// 構建初始化器

mpinitializer = new initializer(mcurrentframe,1.0,200);

// -1 表示沒有任何匹配。這裡面儲存的是匹配的點的id

fill(mvinimatches.begin(),mvinimatches.end(),-1);

return;

連續的第二幀特徵點數大於100, 則首先進行兩幀的匹配 -

//針對單目初始化的時候,進行特徵點的匹配

// 匹配的結果放在 mvinimatches 匹配成功為f2中匹配點的序號 不成功為-1

// mvbprevmatched: 則儲存對應f2匹配點的座標

int nmatches = matcher.

searchforinitialization

(minitialframe,mcurrentframe,mvbprevmatched,mvinimatches,

100)

;

匹配的個數 nmatches 必須要大於100 , 否則本次初始化失敗, 匹配的細節總結在 orb-slam2 關鍵問題之特徵匹配

進行初始化, 初始化的主函式是 initialize(), 稍後仔細的分析, 它通過h矩陣和f矩陣求解出運動, 並恢復出匹配點的3d座標.

// 通過h矩陣或f矩陣恢復的運動   並三角化特徵點  

cv::

mat rcw;

// current camera rotation

cv::

mat tcw;

// current camera translation

vector<

bool

> vbtriangulated;

// triangulated correspondences (mvinimatches)

if(mpinitializer-

>

initialize

(mcurrentframe, mvinimatches, rcw, tcw, mvinip3d, vbtriangulated)

)}

// set frame poses

// 將初始化的第一幀作為世界座標系,因此第一幀變換矩陣為單位矩陣

minitialframe.

setpose

(cv:

:mat:

:eye(4

,4,cv_32f)

);

cv::

mat tcw = cv:

:mat:

:eye(4

,4,cv_32f)

;rcw.

copyto

(tcw.

rowrange(0

,3).

colrange(0

,3))

;tcw.

copyto

(tcw.

rowrange(0

,3).

col(3)

);mcurrentframe.

setpose

(tcw)

;// initialize函式會得到mvinip3d,

// mvinip3d是cv::point3f型別的乙個容器,是個存放3d點的臨時變數,

createinitialmapmonocular()

;

ORB SLAM2 關鍵問題之特徵匹配

在單目初始化中用來尋找初始化兩幀匹配的函式.int orbmatcher searchforinitialization frame f1,frame f2,vectorcv point2f vbprevmatched,vector vnmatches12,int windowsize 引數 vbp...

ORB SLAM2安裝問題總結

rosbuild building package orb slam master rosbuild error from directory check opt ros kinetic share ros core rosbuild bin check same directories.py ho...

ORB SLAM2中遇到問題

報錯 error while loading shared libraries libpangolin.so cannot open shared object file no such file or directory 解決 大致的問題是出在,通過原始碼包進行安裝時,如果不指定 prefix會將...