ORB SLAM2 雙目稀疏立體匹配學習

2022-08-27 06:18:08 字數 3008 閱讀 9681

這部分主要在frame.cc檔案中

對應函式為:

frame::frame(const cv::mat &imleft, const cv::mat &imright, const double ×tamp, orbextractor* extractorleft, orbextractor* extractorright, orbvocabulary* voc, cv::mat &k, cv::mat &distcoef, const float &bf, const float &thdepth) :mporbvocabulary(voc),mporbextractorleft(extractorleft),mporbextractorright(extractorright), mtimestamp(timestamp), mk(k.clone()),mdistcoef(distcoef.clone()), mbf(bf), mthdepth(thdepth), mpreferencekf(static_cast(null))

id自增

計算影象金字塔的引數

對左右影象提取orb特徵點, 使用雙線程進行提取

用opencv的矯正函式,內參對提取到的特徵點進行矯正

計算雙目見特徵點的匹配,只有匹配成功的特徵點才會計算深度,深度存放在mvdepth中;

計算去畸變後邊界

id自增

mnid=nnextid++;
計算影象金字塔的引數

mnscalelevels = mporbextractorleft->getlevels();

mfscalefactor = mporbextractorleft->getscalefactor();

mflogscalefactor = log(mfscalefactor);

mvscalefactors = mporbextractorleft->getscalefactors();

mvinvscalefactors = mporbextractorleft->getinversescalefactors();

mvlevelsigma2 = mporbextractorleft->getscalesigmasquares();

mvinvlevelsigma2 = mporbextractorleft->getinversescalesigmasquares();

對左右影象提取orb特徵點, 使用雙線程進行提取

thread threadleft(&frame::extractorb,this,0,imleft);

thread threadright(&frame::extractorb,this,1,imright);

threadleft.join();

threadright.join();

用opencv的矯正函式,內參對提取到的特徵點進行矯正

undisortkeypoints();
計算雙目見特徵點的匹配,只有匹配成功的特徵點才會計算深度,深度存放在mvdepth中;

computestereomatches();
計算去畸變後邊界

本部分介紹上部分中的第5不

主要對應函式frame::computestereomatches()

輸入:兩幀立體矯正後的影象對應的ob特徵點集

過程

行特徵點統計

粗匹配精確匹配sad.

亞畫素精度優化

最有視差值/深度選擇

刪除離群點( outliers)

輸出:稀疏特徵點視差圖/深度圖和匹配結果

視差公式

z:深度 d:視差(disparity)f:焦距 b:(baseline) 基線

\(z=\frac,d=u_l-u_r\)

亞畫素插值

// sub-pixel match (parabola fitting)

const float dist1 = vdists[l+bestincr-1];

const float dist2 = vdists[l+bestincr];

const float dist3 = vdists[l+bestincr+1];

const float deltar = (dist1-dist3)/(2.0f*(dist1+dist3-2.0f*dist2));

if(deltar1)

continue;

亞畫素插值方法:

亞畫素的誤差在乙個畫素以內,所以修正量大一1時鑑定為誤匹配。

最優視差值。深度選擇

刪除離群點(outliers)

// 快匹配相似度閾值判斷,快意話sad最小,不代表就是匹配的,比如光照變化,若紋理,無紋理都會造成誤匹配

//誤匹配判斷條件 norm_sad > 1.5*1.4*median

sort(vdistidx.begin(),vdistidx.end()); //對dist進行排序

const float median = vdistidx[vdistidx.size()/2].first; //根據中值計算閾值

const float thdist = 1.5f*1.4f*median;

for(int i=vdistidx.size()-1;i>=0;i--)

}

ORB SLAM2 雙目稀疏立體匹配演算法

本節主要學習orb slam2中的雙目立體匹配演算法的實現過程 主要在frame.cc檔案中 主要過程 id自增 mnid nnextid 計算影象金字塔的引數 mnscalelevels mporbextractorleft getlevels mfscalefactor mporbextract...

ORB SLAM2系統mono單目是如何初始化的?

我把頭檔案的資訊和原始檔整合到一起了,這是單目才會用到的複雜初始化,每乙個函式都需要很多的時間去學習,後面補充,現在只是注釋框架。初始化的主要思路就是用對極幾何和三角化求出rt矩陣,可以先參考視覺slam十四講裡面的內容學習,鏈結如下 對極幾何內容原始碼解讀 視覺slam十四講系列之第七講pose ...

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

最近開始學習下orb slam2原始碼,邊閱讀邊記錄下自己的理解,首先來乙個大致初始化流程圖,閱讀從mono euroc.cc開始。第一幀剛來 未構造初始化器 則構造 如果是單目初始器 mpinitializer為空,即第一次進行初始化 並且特徵點數 100 得到用於初始化的第一幀 2.第二幀 當前...