本節主要學習orb_slam2中的雙目立體匹配演算法的實現過程
主要在frame.cc檔案中
主要過程:
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();
計算去畸變後邊界
主要對應函式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 雙目稀疏立體匹配學習
這部分主要在frame.cc檔案中 對應函式為 frame frame const cv mat imleft,const cv mat imright,const double tamp,orbextractor extractorleft,orbextractor extractorright,...
ORB SLAM2系統mono單目是如何初始化的?
我把頭檔案的資訊和原始檔整合到一起了,這是單目才會用到的複雜初始化,每乙個函式都需要很多的時間去學習,後面補充,現在只是注釋框架。初始化的主要思路就是用對極幾何和三角化求出rt矩陣,可以先參考視覺slam十四講裡面的內容學習,鏈結如下 對極幾何內容原始碼解讀 視覺slam十四講系列之第七講pose ...
ORB SLAM2原始碼閱讀記錄(1) 單目初始化
最近開始學習下orb slam2原始碼,邊閱讀邊記錄下自己的理解,首先來乙個大致初始化流程圖,閱讀從mono euroc.cc開始。第一幀剛來 未構造初始化器 則構造 如果是單目初始器 mpinitializer為空,即第一次進行初始化 並且特徵點數 100 得到用於初始化的第一幀 2.第二幀 當前...