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