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