#include “DBoW3/DBoW3.h”
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/features2d/features2d.hpp>
#include < iostream>
#include < vector>
#include < string>
using namespace cv;
using namespace std;
/***************************************************
- 本节演示了如何根据data/目录下的十张图训练字典
- ************************************************/
int main( int argc, char** argv ) {
// read the image
cout<<“reading images… “<<endl;
vector< Mat> images;
for ( int i=0; i<10; i++ )
{
string path = “./data/”+to_string(i+1)+”.png”;
images.push_back( imread(path) );
}
// 检测 ORB 特征点
cout<<"detecting ORB features … "<<endl;
Ptr< Feature2D > detector = ORB::create();
vector< Mat> descriptors;
for ( Mat& image:images )
{
vector< KeyPoint> keypoints;
Mat descriptor;
detector->detectAndCompute( image, Mat(), keypoints, descriptor );detectAndCompute()函数同时计算出关键点和描述子
descriptors.push_back( descriptor );
}
//
// create vocabulary
cout<<"creating vocabulary … "<<endl;
DBoW3::Vocabulary vocab;使用字典类,实际中可以指定节点的分支数k和深度d
vocab.create( descriptors );根据描述子创建字典
cout<<"vocabulary info: "<<vocab<<endl;
vocab.save( “vocabulary.yml.gz” );将字典保存为.yml文件
cout<<“done”<<endl;
//
return 0;
}