2013-02-24 67 views
1

下面的代码是在C++中,我使用OpenCV进行实验。假设我通过以下方式使用kd树(FlannBasedMatcher):在哪个阶段的培训正好发生在FlannBasedMatcher OpenCV中?

//these are inputs to the code snippet below. 
//They are filled with suitable values 
Mat& queryDescriptors; 
vector<Training> &trainCollection; 
vector< vector<DMatch> >& matches; 
int knn; 

//setting flann parameters 
const Ptr<flann::IndexParams>& indexParams=new flann::KDTreeIndexParams(4); 
const Ptr<flann::SearchParams>& searchParams=new flann::SearchParams(64); 
FlannBasedMatcher matcher(indexParams, searchParams); 

for (int i = 0; i < trainCollection.size();i++){ 
    Training train = trainCollection.at(i); 
    Mat trainDescriptors(train.trainDescriptors); 
    trainDescriptorCollection.push_back(trainDescriptors); 
} 
matcher.add(trainDescriptorCollection); 
matcher.train(); 

//Now, we may do knnMatch (or anyother matching) 
matcher.knnMatch(queryDescriptors,matches,knn); 

在它看来,培训地点在上面的代码(即kd树建)上调用列车()函数。但这里是收集,如果我们看火车()函数中:

void FlannBasedMatcher::train() 
{ 
    if(flannIndex.empty() || mergedDescriptors.size() < addedDescCount) 
    { 
     mergedDescriptors.set(trainDescCollection); 
     flannIndex = new flann::Index(mergedDescriptors.getDescriptors(), *indexParams); 
    } 
} 

这两种操作(设置培训描述符和FLANN指数,我已经打电话火车之前完成())。那么kd-tree究竟是什么时候建成的呢?

回答

3

当代码调用FlannBasedMatcher ::火车(),FlannBasedMatcher指数将

flannIndex = new flann::Index(mergedDescriptors.getDescriptors(), *indexParams); 

代码

if(flannIndex.empty() || mergedDescriptors.size() < addedDescCount) 

是检查FlannBasedMatcher的指数是否已经被建成如果索引是以前构建的,train()函数将跳过构建索引的过程以节省时间。

2

the documentation,训练(即,在您的CAE builidng KD树)是匹配之前完成每一次。 需要时cv::DescriptorMatcher类调​​用训练方法automaticall。

+0

是啊。那就是文档所说的。但正如我在问题中提到,火车功能并没有真正做多倾销培训描述到类中的相关数据结构的任何其他。所以我无法追踪kd-tree的实际构建位置。 – magarwal 2013-03-04 12:54:23