1

我正在尝试在 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+。

请帮我...

4

1 回答 1

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);

这很好用:)

于 2016-03-02T09:14:45.900 回答