2013-04-08 22 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)); 

而且我可以得到nresps和DIST的KNN結果,與nresps的N個相鄰的索引和DIST的距離。

但我不知道如何在opencv flann中設置不同的距離算法(ChiSquare,Euclidean等)。

我檢查了flann.cpp,看起來set_distance()函數是不推薦的。

回答

3

我注意到很少有人熟悉openCV,並且很少有文檔。 我最終通過使用opencvflann而不是flann來避免命名空間衝突。在檢查opencv源代碼後,我發現「dist.h」是一個有用的文件,用於查找如何設置不同的KNN距離類型。

在我的代碼中,我使用manhattan distance,指的是opencv源代碼中的dist.h。

//// 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));