DBoW和KeyFrameDatabase使用记录

本文详细记录了DBoW的模板定义、字典初始化、图像描述子转换以及关键帧数据库KeyFrameDatabase的重要成员变量和初始化过程。介绍了DBoW的BowVector和FeatureVector计算相似度得分的方法,以及训练字典的过程,包括k-means聚类和idf权重设置。此外,还探讨了DBoW中抽象类的多态性。KeyFrameDatabase用于闭环检测和重定位候选帧的查找,其维护了一个WordId与关键帧指针的映射关系。
摘要由CSDN通过智能技术生成

这篇博客旨在记录一下DBoW和KeyFrameDatabase的小细节,以防后面再忘掉。18年初的时候参考ORB slam做重定位和闭环检测挖过DBoW里的代码,没想到过了一年多很多代码细节就记不清了。这次干脆记下来吧。

一、DBoW

1、模板定义
template<class TDescriptor, class F>
/// Generic Vocabulary
class TemplatedVocabulary
{
       
}
2、模板应用

ORB slam中定义了ORB描述子类型的字典

typedef DBoW2::TemplatedVocabulary<DBoW2::FORB::TDescriptor, DBoW2::FORB> ORBVocabulary;

其中TDescriptorcv::MatFORB是为ORB描述子定义的类,其中包含了计算描述子之间汉明距离以及计算描述子平均值的方法。

3、字典初始化

默认为10叉5层树状结构,L1_NROM距离和TF_IDF,加载txt字典时设置为6层。所说的6层是指除去根节点后中间节点及叶子节点占用的层数。

m_nodes包含了所有的节点,m_words只包含了叶子节点即最后的单词,m_words是一个vector<Node*>数据,索引对应word的id,内容对应m_nodes中对应项的地址。

4、图像描述子向BowVector和FeatureVector转换
class BowVector: public std::map<WordId, WordValue>
{
    
    //WordId是字典中word的id,不是nodeid
    //WordValue是TF_IDF值
}
class FeatureVector: public std::map<NodeId, std::vector<unsigned int> >
{
      
    //NodeId是levelup指定的那一层的对应的node的id
    //vector<unsigned int>是一个feature在当前KeyFrame中的索引
}

BowVector实际上是图像的一种降维表达,一幅图像可以表示为 v = { ( w 0 , η 0 ) , ( w 1 , η 1 ) , . . . , ( w i , η i ) , . . . } v = \{(w_0,\eta_0),(w_1,\eta_1),...,(w_i,\eta_i),...\} v={ (w0,η0),(w1,η1),...,(wi,ηi),...}。其中 w i w_i wi是WordId, η i \eta_i ηi是单词 w i w_i wi的权重。 η i \eta_i

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
DBow3是一个基于OpenCV的开源库,用于实现图像特征描述和匹配。它是DBoW2的升级版本,支持OpenCV 4.2及以上版本。 DBow3主要用于图像检索和SLAM(Simultaneous Localization and Mapping)等领域。它提供了一种快速、高效的方法来计算图像的特征描述,并且可以进行图像之间的匹配。 使用DBow3需要以下步骤: 1. 安装OpenCV 4.2或更高版本,并确保正确配置了OpenCV的环境变量。 2. 下载DBow3的源代码,并将其添加到你的项目中。 3. 在你的代码中,包含DBow3的头文件: ```cpp #include <DBoW3/DBoW3.h> ``` 4. 创建一个DBow3的对象,用于计算图像的特征描述: ```cpp DBoW3::Vocabulary vocab; ``` 5. 加载预训练好的词袋模型文件,用于构建词典: ```cpp vocab.load("path_to_vocabulary_file"); ``` 6. 对输入的图像进行特征提取和描述: ```cpp cv::Mat image = cv::imread("path_to_image_file"); cv::Mat descriptors; // 使用OpenCV提供的特征提取方法,如ORB、SIFT等 cv::Ptr<cv::Feature2D> detector = cv::ORB::create(); detector->detectAndCompute(image, cv::noArray(), keypoints, descriptors); ``` 7. 使用DBow3计算图像的词袋表示: ```cpp DBoW3::BowVector bowVec; vocab.transform(descriptors, bowVec); ``` 8. 进行图像之间的匹配或检索: ```cpp DBoW3::QueryResults results; vocab.query(bowVec, results, 5); // 返回与输入图像最相似的前5个图像的索引和得分 ``` 以上是使用DBow3进行图像特征描述和匹配的基本步骤。你可以根据具体的需求进行进一步的调整和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值