没有可用于cv :: flann :: Index :: knnSearch()的源代码

时间:2016-02-27 13:15:08

标签: opencv sift surf descriptor flann

我试图在OpenCV中实现Flann Index。让我逐步讲述我的实施:

1)我从图像中提取了SURF特征并将其连接起来。然后像这样保存描述符和flann索引:

FileStorage fs("descriptors.yml", FileStorage::WRITE);
write(fs, "descriptors", descriptors);
flann_index_saved.save("tmp_twitter.fln");

2)我从查询图像中提取了SURF特征。

3)我加载了这样的flann索引:

FileStorage fsRead(yamlFile, FileStorage::READ);
Mat indexMat(Size(64, sampleSize), CV_32FC1);
fsRead["descriptors"] >> indexMat;
Index flann_index_loaded;
flann_index_loaded.load(indexMat, indexFilePath);

4)为了匹配,我使用了knnSearch:

Mat queryDesc, indicesResult, distsResults;
fIndex.knnSearch(queryDesc, indicesResult, distsResults, 1);

但没有任何反应。只有"没有可用的来源......"异常发生。我想我无法在OpenCV中实现Flann。

我使用的是Ubuntu 12.04,OpenCV 2.4.10,Eclipse CDT +。

请帮帮我......

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。让我回答我自己的问题:)

1)我从火车图像中提取了SURF特征并将其连接起来。然后像这样保存描述符和flann索引:

 Index flannIndex;
 Mat indexDescriptors;
 IndexParams indexParams;
 indexParams = *new KMeansIndexParams();
 flannIndex = *new Index(indexDescriptors, indexParams);
 FileStorage fs(descriptorName, FileStorage::WRITE);
 write(fs, "descriptors", indexDescriptors);
 flannIndex.save(indexName);

2)我从查询图像中提取了SURF特征。

3)我加载了这样的flann索引:

 Index flannIndexSaved;
 IndexParams indexParamsSaved;
 Mat indexMat;
 indexMat = Mat(Size(64, sampleSize), CV_32F);
 FileStorage fs(yamlFile, FileStorage::READ);
 fs["descriptors"] >> indexMat;
 indexParamsSaved = *new SavedIndexParams(indexFilePath);
 flannIndexSaved = *new Index(indexMat, indexParamsSaved);

4)为了匹配,我使用了knnSearch:

 Mat queryDesc, indicesResult, distsResults;
 flannIndexSaved.knnSearch(queryDesc, indicesResult, distsResults, 1);

这很好用:))