c – 如何使用opencv flann :: index?

前端之家收集整理的这篇文章主要介绍了c – 如何使用opencv flann :: index?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一些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");

我试图加载它并找到最近的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(),CV_32S);
cv::Mat dists(vfv_reg_quie.size(),CV_32F);

flann_index.knnSearch(sample,nresps,dists,cv::flann::SearchParams(64));

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

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

请帮忙

解决方法

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

我试过以下:

cv::Mat indexMat;
cv::flann::Index flann_index(
    indexMat,cvflann::FLANN_DIST_EUCLIDEAN
);

导致:

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

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

cv::Mat indexMat(samples.size(),CV_32FC1);
cv::flann::Index flann_index(
    indexMat,cvflann::FLANN_DIST_EUCLIDEAN
);

做窍门

猜你在找的C&C++相关文章