2014-10-30 37 views
0

我在descriptor_extractor_matcher.cpp示例中使用以下代碼來計算img1(Mat descriptors01)的描述符,將其寫入我的磁盤並將其加載回去(Mat descriptors1) 。 (用於關鍵點相同的步驟,但代碼相當大同小異...)當從文件中加載數據時,opencv的descriptor_extractor_matcher的不同匹配結果

Ptr<DescriptorExtractor> descriptorExtractor = DescriptorExtractor::create(argv[2]); 

...

Mat descriptors01; 
descriptorExtractor->compute(img1, keypoints1, descriptors01); // compute descriptors 

FileStorage storage("test.yml", FileStorage::WRITE);    //save it to disc 
storage << "blub" << descriptors01; 
storage.release(); 

Mat descriptors1; 
FileStorage storage1("test.yml", FileStorage::READ);   // load it again 
storage1["blub"] >> descriptors1; 
storage1.release(); 

的關鍵點&描述符圖像2被計算並使用,無需保存和加載。

我只對圖像1使用加載的數據(關鍵點&描述符)進行匹配,所以對於描述符:descriptors1。 A)使用上面的代碼進行計算,存儲和加載;或者使用以上代碼進行計算,存儲和加載;
B)僅使用加載的數據(不計算,再存放起來)

的匹配我得到不同的結果,因爲你可以在圖片中看到的關鍵點藏漢作爲匹配的描述符。我希望沒有什麼區別......我在這裏錯過了什麼?我必須比較2張圖片,並且無法將圖片與存儲的一組關鍵點進行比較,並且它們是描述符?

當然我使用[detectorType] [的descriptorType] [matcherType] [matcherFilterType] [圖像1] [圖像2] [ransacReprojThreshold],順便說一句相同的值;)

非常感謝!

UPDATE

看來問題是取決於描述符。使用加載的描述符適用於SIFT和SURF,但不適用於ORB和其他。圖像:結果與對情況A不同的描述符和B:

enter image description here

+0

直觀地看到3個可能性:1:你的加載和保存不起作用。 2:你的保存和加載確實有效,但是你失去了一些浮點精度,所以你的描述符會有所不同。3:匹配器可能使用一些RANSAC,它不是確定性的,因此結果會有所不同。我最喜歡的是#2,我的建議是保存/加載關鍵點並再次計算描述符。如果可行的話,還有兩種可能性:A:失去精度或者像那樣。 B:關鍵點得到錯誤的描述符(來自另一個關鍵點)。 – Micka 2014-10-30 16:34:03

+0

你好!看起來設置是okey,因爲它適用於某些描述符(至少對於SURF)。但如果我去BRIEF,ORB或其他描述符有區別... – alti 2014-11-04 10:43:02

回答

0

嘗試重複A或B單獨地和看看結果正出來是相同的。我懷疑他們不會這樣說,因爲#1你感興趣的物體質地不好,會導致描述不佳。 #2兩幅圖像之間的視點變化非常大,即使是像SIFT這樣的最好的描述符也會導致不可重複性問題。

現在,如何解決這個可重複性問題的一部分,#1在描述符的範數上使用某個閾值,以便只有非常強的特徵用於匹配。 #2與RANSAC一起使用極線約束來濾除錯誤的匹配。我附上兩張圖片來顯示過濾器如何嚴重影響對應關係。 enter image description here 使用SURF查找兩幅圖像之間的對應關係(紅 - 青色圖中的兩幅圖像) enter image description here 使用RANSAC使用極線約束對圖像進行濾波後。

歡迎對此問題進行評論和進一步討論。 :-)

+0

嗨,感謝您的迴應!我在上面添加了一些新的測試結果,並使用了另一組圖像。您可以看到保存和加載工作,例如SURF,但不適用於ORB。同樣的一些其他描述符...任何想法爲什麼? – alti 2014-11-04 10:31:35

相關問題