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