這部分主要在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.第二幀 當前...