Следующий код находится в 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);
В приведенном выше коде, кажется, что обучение происходит (т.е. кД-дерево строится) на вызов функции поезда(). Но вот загвоздка, если мы посмотрим внутри функции поезда():
void FlannBasedMatcher::train()
{
if(flannIndex.empty() || mergedDescriptors.size() < addedDescCount)
{
mergedDescriptors.set(trainDescCollection);
flannIndex = new flann::Index(mergedDescriptors.getDescriptors(), *indexParams);
}
}
Оба этих операции (создание учебных дескрипторов и Flann индекса, я уже сделал перед вызовом поезда()). Итак, когда именно построено kd-дерево?
Yup. Вот что говорит документация. Но, как я уже упоминал в вопросе, функция поезда не делает ничего, кроме демпинга дескрипторов обучения в соответствующую структуру данных внутри класса. Поэтому я не мог проследить, где собственно kd-дерево. – magarwal