ORB-SLAM2里使用词袋模型来做重定向与回环检测,使用的是第三方库DBoW2。
首先,有一个离线词袋ORBvoc.txt文件(ORB-SLAM2作者提供了一个他们训练好的词典),一般这个称之为词典,为了快速查询,以空间换时间建立了一个d层的K叉树来保存词典,树的叶子节点包含了每个单词及在词典里的权重。
词典的加载
//在System对象的初始化中
mpVocabulary = new ORBVocabulary();
if (has_suffix(strVocFile, ".txt"))
bVocLoad = mpVocabulary->loadFromTextFile(strVocFile);
else if(has_suffix(strVocFile, ".bin"))
bVocLoad = mpVocabulary->loadFromBinaryFile(strVocFile);
计算单张图像的词包
/**
* @brief Bag of Words Representation
*
* 计算词包mBowVec和mFeatVec,其中mFeatVec记录了属于第i个node(在第4层)的ni个描述子
* @see CreateInitialMapMonocular() TrackReferenceKeyFrame() Relocalization()
*/
void Frame::ComputeBoW()
{
if(mBowVec.empty())
{
vector<cv::Mat> vCurrentDesc = Converter::toDescriptorVector(mDescriptors);
mpORBvocabulary->transform(vCurrentDesc,mBowVec,mFeatVec,4);
}
}
词包mBowVec和mFeatVec
//KeyFrame.h中有
//BoW
DBoW2::BowVector mBowVec; ///< Vector of words to