我正在尝试在OpenCV中实现Flann索引。让我逐步介绍一下我的实现:

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)我从火车图像中提取了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);

这很好用:)

关于opencv - 没有可用于cv::flann::Index::knnSearch()的源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35670249/

10-11 17:27