關鍵幀數據庫經過預先訓練好的詞典,維護一個向量std::vector<list<KeyFrame*> > mvInvertedFile; 該向量中mvInvertedFile[i]表示包含了第i個WordId的全部關鍵幀;數據庫
咱們須要知道關鍵幀對應的vBowVec向量是一個map:spa
std::map<WordId, WordValue> // WordId以及單詞值,WordId是惟一的,和一個特徵綁定
KeyFrameDatabase::KeyFrameDatabase (const ORBVocabulary &voc): mpVoc(&voc) { mvInvertedFile.resize(voc.size()); // number of words }
該類的主要做用是在迴環檢測和重定位中,根據詞袋模型的特徵匹配度,找到閉環候選幀和重定位候選幀,二者之間的區別在於,須要參考關鍵幀去尋找閉環候選幀,而重定位則參考普通幀。code
主要步驟是:blog
1. 找出與當前幀pKF有公共單詞的全部關鍵幀pKFi,不包括與當前幀相連的關鍵幀;class
2. 統計全部閉環候選幀中與pKF具備共同單詞最多的單詞數,只考慮共有單詞數大於0.8*maxCommonWords以及匹配得分大於給定的minScore的關鍵幀,存入lScoreAndMatch;map
3. 對於第二步中篩選出來的pKFi,每個都要抽取出自身的共視(共享地圖點最多的前10幀)關鍵幀分爲一組,計算該組總體得分(與pKF比較的),記爲bestAccScore;地圖
全部組得分大於0.75*bestAccScore的,均看成閉環候選幀。統計
若想改變閉環檢測候選幀的參數,根據場景鑑定閉環的閾值,能夠在這裏修改參數。數據