На каком этапе обучение проходит в FlannBasedMatcher в OpenCV?

Следующий код на C ++, и я использую OpenCV для моего эксперимента. Предположим, я использую kd-tree (FlannBasedMatcher) следующим образом:

//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-дерево) при вызове функции train (). Но здесь есть одна загвоздка, если мы посмотрим внутрь функции train ():

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

Обе эти операции (настройку обучающих дескрипторов и флангового индекса я уже проделал до вызова train ()). Так когда же будет построено kd-дерево?

1

Решение

Когда код вызывает FlannBasedMatcher :: train (), индекс FlannBasedMatcher будет построен

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

Код

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

заключается в проверке того, был ли индекс FlannBasedMatcher уже построен ранее. Если индекс был создан ранее, функция train () пропустит процесс построения индекса, чтобы сэкономить время.

3

Другие решения

От документация, обучение (т. е. в вашем случае построения kd-дерева) проводится каждый раз перед сопоставлением.
cv::DescriptorMatcherКласс вызывает метод обучения автоматически при необходимости.

2