2013-04-08 3 views
4

Я использую opencv 2.4.4 flann.Как использовать opencv flann, особенно заданные алгоритмы расстояния?

и я имею в виду: http://docs.opencv.org/2.4.4/modules/flann/doc/flann_fast_approximate_nearest_neighbor_search.html

сделать Knn.

У меня есть матрица (8000 * 32) flann_m. Имеется 8000 данных, каждый из которых имеет 32 функции.

Я написал такой код:

flann::Index flann_index(flann_m, flann::LinearIndexParams()); 
    flann_index.save("flann_index.fln"); 

    Mat resps(ROW,K,CV_32F); 
    Mat nresps(ROW,K,CV_16S); 
    Mat dist(ROW,K,CV_32F); 

    flann_index.knnSearch(flann_m,nresps,dist,K,flann::SearchParams(64)); 

И я мог бы получить результаты Knn в nresps и дист с nresps индексы N соседей, и DIST расстояния.

Но я не знаю, как установить алгоритм разного расстояния (ChiSquare, Euclidean и т. Д.) В opencv flann.

Я проверил flann.cpp, и кажется, что функция set_distance() деперементирована.

ответ

3

Я заметил, что мало кто знаком с openCV, и есть несколько документов. Я, наконец, избегаю конфликтов пространства имен, используя opencvflann вместо flann. И после проверки исходного кода opencv я обнаружил, что «dist.h» - полезный файл, чтобы найти, как устанавливать разные типы расстояний KNN.

В моем коде я использую manhattan distance, ссылаясь на dist.h в исходном коде opencv.

//// do indexing 
    Matrix<float> samplesMatrix((float*)flann_m.data, flann_m.rows, flann_m.cols); 
    //Index<cvflann::ChiSquareDistance<float>> flann_index(samplesMatrix, cvflann::LinearIndexParams()); 
    Index<cvflann::L1<float>> flann_index(samplesMatrix, cvflann::LinearIndexParams()); 
    flann_index.buildIndex(); 

    cv::Mat1i ind(flann_m.rows, K); 
    CV_Assert(ind.isContinuous()); 
    cvflann::Matrix<int> nresps((int*) ind.data, ind.rows, ind.cols); 
    cvflann::Matrix<float> dist(new float[flann_m.rows*K], flann_m.rows, K); 

    flann_index.knnSearch(samplesMatrix,nresps,dist,K,SearchParams(64)); 
Смежные вопросы