2013-02-24 9 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); 

В приведенном выше коде, кажется, что обучение происходит (т.е. кД-дерево строится) на вызов функции поезда(). Но вот загвоздка, если мы посмотрим внутри функции поезда():

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

Оба этих операции (создание учебных дескрипторов и Flann индекса, я уже сделал перед вызовом поезда()). Итак, когда именно построено kd-дерево?

ответ

3

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

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

Кодекса

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

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

2

От the documentation обучение (т. Е. В вашем cae builidng kd-tree) выполняется каждый раз перед сопоставлением. Класс cv::DescriptorMatcher вызывает метод обучения automaticall при необходимости.

+0

Yup. Вот что говорит документация. Но, как я уже упоминал в вопросе, функция поезда не делает ничего, кроме демпинга дескрипторов обучения в соответствующую структуру данных внутри класса. Поэтому я не мог проследить, где собственно kd-дерево. – magarwal