前言
倒排索引,在寻找重定位候选关键帧时起到非常重要的作用,它是一种非常高效的方法,可以有效地避免进行暴力匹配。倒排索引是词袋模型中一个非常重要的概念也可以称为逆向索引。
定义
以单词为索引基础,储存有单词出现的所有图像的ID及对应的权重。 倒排索引的优势是可以快速查询某个单词出现在哪些图像中,进而得到那些图像中有多少个共同的单词。这对判断图像的相似性非常有效。
具体形式
// Inverted file // 倒排索引,mvInvertedFile[i]表示包含了第i个word id的所有关键帧 std::vector<list<KeyFrame*> > mvInvertedFile;
更新倒排索引的情况
1.关键帧数据库添加新的图像时。
/* 数据库有新的关键帧,根据关键帧的词袋向量,更新数据库的倒排索引 pKF 新添加到数据库的关键帧 */ void KeyFrameDatabase::add(KeyFrame *pKF) { // 线程锁 unique_lock<mutex> lock(mMutex); // 将该关键帧词袋向量里每一个单词更新倒排索引 for(DBoW2::BowVector::const_iterator vit= pKF->mBowVec.begin(), vend=pKF->mBowVec.end(); vit!=vend; vit++) mvInvertedFile[vit->first].push_back(pKF); }
2.删除关键帧数据库的某个关键帧时。
/* 关键帧被删除后,更新数据库的倒排索引 pKF 删除的关键帧 */ void KeyFrameDatabase::erase(KeyFrame* pKF) { // 线程锁,保护共享数据 unique_lock<mutex> lock(mMutex); // Erase elements in the Inverse File for the entry // 每一个KeyFrame包含多个words,遍历mvInvertedFile中的这些words,然后在word中删除该KeyFrame for(DBoW2::BowVector::const_iterator vit=pKF->mBowVec.begin(), vend=pKF->mBowVec.end(); vit!=vend; vit++) { // List of keyframes that share the word // 取出包含该单词的所有关键帧列表 list<KeyFrame*> &lKFs = mvInvertedFile[vit->first]; // 如果包含待删除的关键帧,则把该关键帧从列表里删除 for(list<KeyFrame*>::iterator lit=lKFs.begin(), lend= lKFs.end(); lit!=lend; lit++) { if(pKF==*lit) { lKFs.erase(lit); break; } } } }
结束语
以上就是我学习到的内容,如果对您有帮助请多多支持我,如果哪里有问题欢迎大家在评论区积极讨论,我看到会及时回复。