我试图在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 +。
请帮帮我......
答案 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);
这很好用:))