【问题标题】:how to use opencv flann, especially set distance algorithms?如何使用opencv flann,尤其是设置距离算法?
【发布时间】:2013-03-30 00:16:57
【问题描述】:

我正在使用 opencv 2.4.4 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));

我可以在 nreps 和 dist 中得到 KNN 结果,nresps 是 N 个邻居的索引,dist 是距离。

但我不知道如何在 opencv flann 中设置不同的距离算法(ChiSquare、Euclidean 等)。

我检查了 flann.cpp,似乎 set_distance() 函数已被弃用。

【问题讨论】:

    标签: opencv knn


    【解决方案1】:

    我注意到很少有人熟悉openCV,文档也很少。 我终于通过使用 opencvflann 而不是 flann 来避免命名空间冲突。在查看了 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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2013-06-10
      • 1970-01-01
      • 2020-08-23
      • 2019-08-13
      相关资源
      最近更新 更多