4

私はopencv 2.4.4フランを使用しています。

そして私は参照します: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));

そして、nreps と dist で KNN の結果を得ることができました。nreps は N 個の近傍のインデックス、dist は距離です。

しかし、opencv flann で異なる距離アルゴリズム (ChiSquare、Euclidean など) を設定する方法がわかりません。

flann.cpp を確認したところ、set_distance() 関数が廃止されたようです。

4

1 に答える 1

4

openCV に精通している人はほとんどおらず、ドキュメントもほとんどありません。最後に、flann の代わりに opencvflann を使用して名前空間の競合を回避しました。opencv のソース コードを確認したところ、"dist.h" がさまざまな KNN 距離タイプの設定方法を見つけるのに役立つファイルであることがわかりました。

私のコードでは、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));
于 2013-06-05T18:58:56.917 に答える