如何使用opencv flann :: Index?

USe*_*eTi 11 c++ opencv knn

我在opencv flann :: Index中遇到一些问题 -

我正在创建索引

    Mat samples = Mat::zeros(vfv_net_quie.size(),24,CV_32F);
        for (int i =0; i < vfv_net_quie.size();i++)
        {
           for (int j = 0;j<24;j++)
           {
              samples.at<float>(i,j)=(float)vfv_net_quie[i].vfv[j];
           }
        }
    cv::flann::Index flann_index(
            samples,
            cv::flann::KDTreeIndexParams(4),
            cvflann::FLANN_DIST_EUCLIDEAN
               );
    flann_index.save("c:\\index.fln");
Run Code Online (Sandbox Code Playgroud)

我试图加载它并找到最近的neiborhoods

cv::flann::Index flann_index(Mat(),
    cv::flann::SavedIndexParams("c:\\index.fln"),
    cvflann::FLANN_DIST_EUCLIDEAN
    );

cv::Mat resps(vfv_reg_quie.size(), K, CV_32F);
cv::Mat nresps(vfv_reg_quie.size(), K, CV_32S);
cv::Mat dists(vfv_reg_quie.size(), K, CV_32F);

flann_index.knnSearch(sample,nresps,dists,K,cv::flann::SearchParams(64));
Run Code Online (Sandbox Code Playgroud)

并且在miniflann.cpp中有访问冲突

((IndexType*)index)->knnSearch(_query, _indices, _dists, knn,
                          (const ::cvflann::SearchParams&)get_params(params));
Run Code Online (Sandbox Code Playgroud)

请帮忙

Ben*_*Ben 12

您不应该将flann文件加载到a Mat(),因为它是存储索引的位置.它是在调用构造函数后销毁的临时对象.这就是为什么当你打电话时索引没有指向任何有用的原因knnSearch().

我试过以下:

cv::Mat indexMat;
cv::flann::Index flann_index(
    indexMat,
    cv::flann::SavedIndexParams("c:\\index.fln"),
    cvflann::FLANN_DIST_EUCLIDEAN
);
Run Code Online (Sandbox Code Playgroud)

导致:

Reading FLANN index error: the saved data size (100, 64) or type (5) is different from the passed one (0, 0), 0
Run Code Online (Sandbox Code Playgroud)

这意味着,矩阵必须用正确的维度进行初始化(对我来说似乎非常愚蠢,因为我不一定知道,我的索引中存储了多少元素).

cv::Mat indexMat(samples.size(), CV_32FC1);
cv::flann::Index flann_index(
    indexMat,
    cv::flann::SavedIndexParams("c:\\index.fln"),
    cvflann::FLANN_DIST_EUCLIDEAN
);
Run Code Online (Sandbox Code Playgroud)

诀窍.

  • 需要注意的一点是,您需要提供实际的原始数据集,而不仅仅是具有正确尺寸的Mat.在OpenCV文档中不是很清楚,但在[flann文档]的第3.3.4节中提到了这一点(http://www.cs.ubc.ca/~mariusm/uploads/FLANN/flann_manual-1.6.pdf) (4认同)