opencv - 如何使用opencv flann,尤其是设置距离算法?

标签 opencv knn

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

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

但我不知道如何在 opencv flann 中设置不同的距离算法(卡方、欧几里德等)。

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

最佳答案

我注意到很少有人熟悉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));

关于opencv - 如何使用opencv flann,尤其是设置距离算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15870237/

相关文章:

python - opencv imwrite中的色度子采样

python - 如何将 OpenCV 图像与颜色进行比较

python - 属性错误: 'module' object has no attribute 'm1'

matlab - 使用非齐次隐马尔可夫模型预测降雨量

r - kNN - r 中有很多关系

c++ - 将 Lab 值转换为 opencv 中的 RGB 值

OpenCV 检测带有噪声的部分圆

image-processing - 正方形检测、图像处理

machine-learning - 当 k=4 时 KNN 选择类标签

python - 尝试用 python 实现 KNN 算法时出现 TypeError