视觉slam闭环检测之-DBoW2 -视觉词袋构建
需要准备的知识点:http://www.cnblogs.com/zjiaxing/p/5616653.html
http://www.cnblogs.com/zjiaxing/p/5616664.html
http://www.cnblogs.com/zjiaxing/p/5616670.html
http://www.cnblogs.com/zjiaxing/p/5616679.html
#include <iostream>
#include <vector> // DBoW2
#include "DBoW2.h" // defines Surf64Vocabulary and Surf64Database #include <DUtils/DUtils.h>
#include <DVision/DVision.h> // OpenCV
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/xfeatures2d/nonfree.hpp> using namespace DBoW2;
using namespace DUtils;
using namespace std; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void loadFeatures(vector<vector<vector<float> > > &features);
void changeStructure(const vector<float> &plain, vector<vector<float> > &out,
int L);
void testVocCreation(const vector<vector<vector<float> > > &features);
void testDatabase(const vector<vector<vector<float> > > &features); // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // number of training images
const int NIMAGES = ; // extended surf gives 128-dimensional vectors
const bool EXTENDED_SURF = false; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void wait()
{
cout << endl << "Press enter to continue" << endl;
getchar();
} // ---------------------------------------------------------------------------- int main()
{
vector<vector<vector<float> > > features;
loadFeatures(features);
testVocCreation(features);
wait(); testDatabase(features); return ;
} // ---------------------------------------------------------------------------- void loadFeatures(vector<vector<vector<float> > > &features)
{
features.clear();
features.reserve(NIMAGES);
cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(, , , EXTENDED_SURF);
cout << "Extracting SURF features..." << endl;
for(int i = ; i < NIMAGES; ++i)
{
stringstream ss;
ss << "images/image" << i << ".png";
cv::Mat image = cv::imread(ss.str(), );
cv::Mat mask;
vector<cv::KeyPoint> keypoints;
vector<float> descriptors; surf->detectAndCompute(image, mask, keypoints, descriptors); features.push_back(vector<vector<float> >());
changeStructure(descriptors, features.back(), surf->descriptorSize());
}
} // ---------------------------------------------------------------------------- void changeStructure(const vector<float> &plain, vector<vector<float> > &out,
int L)
{
out.resize(plain.size() / L);
unsigned int j = ;
for(unsigned int i = ; i < plain.size(); i += L, ++j)
{
out[j].resize(L);
std::copy(plain.begin() + i, plain.begin() + i + L, out[j].begin());
}
} // ---------------------------------------------------------------------------- void testVocCreation(const vector<vector<vector<float> > > &features)
{
// Creates a vocabulary from the training features, setting the branching
factor and the depth levels of the tree and the weighting and scoring
schemes * Creates k clusters from the given descriptors with some seeding algorithm. const int k = ;
const int L = ;
const WeightingType weight = TF_IDF;
const ScoringType score = L1_NORM; Surf64Vocabulary voc(k, L, weight, score); cout << "Creating a small " << k << "^" << L << " vocabulary..." << endl;
voc.create(features);
cout << "... done!" << endl; cout << "Vocabulary information: " << endl
<< voc << endl << endl; // lets do something with this vocabulary
cout << "Matching images against themselves (0 low, 1 high): " << endl;
BowVector v1, v2;
for(int i = ; i < NIMAGES; i++)
{
//Transforms a set of descriptores into a bow vector
voc.transform(features[i], v1);
for(int j = ; j < NIMAGES; j++)
{
voc.transform(features[j], v2); double score = voc.score(v1, v2);
cout << "Image " << i << " vs Image " << j << ": " << score << endl;
}
} // save the vocabulary to disk
cout << endl << "Saving vocabulary..." << endl;
voc.save("small_voc.yml.gz");
cout << "Done" << endl;
} // ---------------------------------------------------------------------------- void testDatabase(const vector<vector<vector<float> > > &features)
{
cout << "Creating a small database..." << endl; // load the vocabulary from disk
Surf64Vocabulary voc("small_voc.yml.gz"); Surf64Database db(voc, false, ); // false = do not use direct index
// (so ignore the last param)
// The direct index is useful if we want to retrieve the features that
// belong to some vocabulary node.
// db creates a copy of the vocabulary, we may get rid of "voc" now // add images to the database
for(int i = ; i < NIMAGES; i++)
{
db.add(features[i]);
} cout << "... done!" << endl; cout << "Database information: " << endl << db << endl; // and query the database
cout << "Querying the database: " << endl; QueryResults ret;
for(int i = ; i < NIMAGES; i++)
{
db.query(features[i], ret, ); // ret[0] is always the same image in this case, because we added it to the
// database. ret[1] is the second best match. cout << "Searching for Image " << i << ". " << ret << endl;
} cout << endl; // we can save the database. The created file includes the vocabulary
// and the entries added
cout << "Saving database..." << endl;
db.save("small_db.yml.gz");
cout << "... done!" << endl; // once saved, we can load it again
cout << "Retrieving database once again..." << endl;
Surf64Database db2("small_db.yml.gz");
cout << "... done! This is: " << endl << db2 << endl;
}
视觉slam闭环检测之-DBoW2 -视觉词袋构建的更多相关文章
- 《视觉SLAM十四讲》第2讲
目录 一 视觉SLAM中的传感器 二 经典视觉SLAM框架 三 SLAM问题的数学表述 注:原创不易,转载请务必注明原作者和出处,感谢支持! 本讲主要内容: (1) 视觉SLAM中的传感器 (2) 经 ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析
原文地址:http://www.cnblogs.com/zjiaxing/p/5548265.html 在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/d ...
- 视觉SLAM之词袋(bag of words) 模型与K-means聚类算法浅析(1)
在目前实际的视觉SLAM中,闭环检测多采用DBOW2模型https://github.com/dorian3d/DBoW2,而bag of words 又运用了数据挖掘的K-means聚类算法,笔者只 ...
- (转) SLAM系统的研究点介绍 与 Kinect视觉SLAM技术介绍
首页 视界智尚 算法技术 每日技术 来打我呀 注册 SLAM系统的研究点介绍 本文主要谈谈SLAM中的各个研究点,为研究生们(应该是博客的多数读者吧)作一个提纲挈领的摘要.然后,我 ...
- 视觉SLAM漫谈 (三): 研究点介绍
1. 前言 读者朋友们大家好!(很久很久)之前,我们为大家介绍了SLAM的基本概念和方法.相信大家对SLAM,应该有了基本的认识.在忙完一堆写论文.博士开题的事情之后,我准备回来继续填坑:为大家介绍S ...
- 视觉SLAM关键方法总结
点"计算机视觉life"关注,置顶更快接收消息! 最近在做基于激光信息的机器人行人跟踪发现如果单独利用激光信息很难完成机器人对行人的识别.跟踪等功能,因此考虑与视觉融合的方法,这样 ...
- 视觉SLAM的主要功能模块分析
视觉SLAM的主要功能模块分析 一.基本概念 SLAM (simultaneous localization and mapping),也称为CML (Concurrent Mapping and L ...
- 高翔《视觉SLAM十四讲》从理论到实践
目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...
- 视觉SLAM漫淡
视觉SLAM漫谈 1. 前言 开始做SLAM(机器人同时定位与建图)研究已经近一年了.从一年级开始对这个方向产生兴趣,到现在为止,也算是对这个领域有了大致的了解.然而越了解,越觉得这个方向难度很 ...
随机推荐
- 运用Unity实现依赖注入[有参构造注入]
上一篇章讲到关于使用Unity实现依赖注入的简单功能,针对有博友提出关于有参构造注入的问题; 本文同样通过一个实例来讲解如何实现此功能,文中一些分层讲解可以看上一文章(运用Unity实现依赖注入[结合 ...
- v-for设置键值 key
总是用 key 配合 v-for.在组件上_总是_必须用 key 配合 v-for,以便维护内部组件及其子树的状态. <ul> <li v-for="todo in tod ...
- "no talloc stackframe at ../source3/param/loadparm.c:4864, leaki
This problem related to the samba PAM module. You have 2 solution at all. Solution 1#: Remove it( as ...
- <译>Flink编程指南
Flink 的流数据 API 编程指南 Flink 的流数据处理程序是常规的程序 ,通过再流数据上,实现了各种转换 (比如 过滤, 更新中间状态, 定义窗口, 聚合).流数据可以来之多种数据源 (比如 ...
- Intellij idea 快键键
1.快速进入实现类: Command + Alt+B 2.全局查找: Shift + Shift 3.类继承关系: Ctrl + H 4.在继承层次上跳转则用 Command + B / Comman ...
- iOS-使用添加的花样字体
代码地址如下:http://www.demodashi.com/demo/11501.html 项目需求中, 有时候有些金额利率等这些不用系统默认字体展现, 而需要着重突出展示! 一.项目截图及效果截 ...
- JBoss类加载机制 ClassLoadingConfiguration
http://sylven.iteye.com/blog/577063 类仓库优先级从低到高 1.classpath.lib目录 2.由已部署的应用程序的所有类./server/{server_nam ...
- tomcat中的Manager App帐号password管理
tomcat根文件夹下的conf文件夹下有个tomcat-users.xml文件 填写内容例如以下 <? xml version='1.0' encoding='utf-8'? >< ...
- Linux下出现Read-only file system的解决办法
正常运行中的网站,忽然间出现session目录不可写,连接服务器一看,任何关于写硬盘的命令都不能用,提示Read-only file system,使用一条命令即可搞定此问题: mount -o re ...
- ORACLE建立物化视图
--使用 on commit 的方式建立物化视图 create materialized view emp_dept refresh on commit as select t.*,d.dname f ...