2016-02-27 59 views
1

我正試圖在OpenCV中實現Flann索引。讓我告訴我的實施一步一步:沒有來源可用於cv :: flann :: Index :: knnSearch()

1)我從圖像提取SURF功能,並連接所有。然後保存描述符和flann索引,如下所示:

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

2)我從查詢圖像中提取SURF特徵。

3)I加載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

我認爲這是錯誤的Eclipse告訴你它找不到用於調試的源文件(例如,如果您正在逐步執行該程序)。這是因爲你只有OpenCV庫,而不是源代碼(或者至少在Eclipse中沒有引用它)。它與你寫的實際代碼無關。問題可能在於如何使用索引 - 是否還有其他錯誤消息?它在什麼時候實際上失敗了? – Karnivaurus

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

這工作得很好:)