之前我们有讲过DBoW3库的编译与安装,这篇我们来谈谈DBoW3库的使用。
在这之前建议先看看视觉词袋与DBoW库的原理,这个博主写的不错:
https://blog.youkuaiyun.com/qq_24893115/article/details/52629248
一、使用词典
我们知道离线视觉词典实际就是将特征描述子集合聚类。
训练离线词典:
//输入特征描述子集合
std::vector<cv::Mat>& v_features;
const int k = 7;
const int L = 5;
const DBoW3::WeightingType weight = DBoW3::TF_IDF;
const DBoW3::ScoringType score = DBoW3::L1_NORM;
DBoW3::Vocabulary voc(k, L, weight, score);
voc.create(v_features);
当然如果我们已经有了离线词典文件就可以直接加载(这也是我们常用的方法):
DBoW3::Vocabulary voc("small_voc.yml.gz");
//或下面的方法
voc.load("small_voc.yml.gz");
有了词典对象,就可以对新的图像计算词袋向量(BowVector)了:
DBoW3::BowVector b1, b2;
cv::Mat d1, d2; //已得到的图像特征描述子
voc.transform(d1, b1);
voc.transform(d2, b2);
有了图像的词袋向量就可以计算这两张图像之间的相似度了:
//结果为0到1,越大相似度越高
double score = voc.score(b1, b2);
二、使用索引数据库
我们使用这个库是用来做回环检测的,通过计