下面的代码是在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究竟是什么时候建成的呢?
是啊。那就是文档所说的。但正如我在问题中提到,火车功能并没有真正做多倾销培训描述到类中的相关数据结构的任何其他。所以我无法追踪kd-tree的实际构建位置。 – magarwal 2013-03-04 12:54:23