2013-05-01 49 views
2

我一直在智能手機上的Android應用程序,其中2張圖片可以比較(一個在SD卡上,一個從相機)。我在有限的關鍵點上使用FREAK描述符(根據響應篩選出500個最好的關鍵點)。當我嘗試將它與BRUTEFORCE_SL2匹配時,它會返回0個匹配項。Bruteforce匹配與FREAK描述符一起工作嗎?

這是因爲FREAK和Bruteforce在一起工作不好嗎?或者我在代碼中做錯了什麼?

匹配情況與

MatOfDMatch matches = new MatOfDMatch(); 

      matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_SL2); 
      matcher.match(descriptors,descriptors1,matches); 
      MatOfDMatch goedematches = new MatOfDMatch(); 

      double max_dist = 0; 
      double min_dist = 100; 
      //if (descriptors.cols() == descriptors1.cols()) 
      //{ 
      for(int i = 0; i < descriptors.rows(); i++) 
      { double dist = matches.toArray()[i].distance; 
       if(dist < min_dist) min_dist = dist; 
       if(dist > max_dist) max_dist = dist; 
      } 
      // should only draw good matches 
      for(int i = 0; i < descriptors.rows(); i++) 
      { MatOfDMatch temp = new MatOfDMatch(); 
       if(matches.toArray()[i].distance < 3*min_dist) 
       { temp.fromArray(matches.toArray()[i]); 
        goedematches.push_back(temp); 
        }   
      // } 
      } 

      Log.d("LOG!", "Number of good matches= " + goedematches.size()); 

當我只是做了

matcher.match(descriptors,descriptors1,matches); 

Log.d("LOG!", "Number of good matches= " + matches.size()); 

宣讀了比賽,我得到約450即使我拿的圖片甚至不像我的形象。

回答

2

首先,FREAK創建二進制描述符。因此,你應該使用漢明距離代替歐幾里得一個(這在這裏是沒有意義的)的:

matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 

的漢明距離將實際數着不同於一個描述符與其它位的數量。

然後,重要的是要知道,只有匹配找到最好對應每個描述你descriptors有。因此,如果您獲得的比賽數量少於預期,則需要查看之前的步驟(特徵檢測和描述符提取)。

編輯:即使圖像可能完全不同,您將得到每個描述符的最佳匹配(即使這種匹配實際上是錯誤的)。文檔中的示例代碼通過測試距離是否大於3*min_dist來過濾較差的匹配。但是這不會消除錯誤的比賽!考慮有兩個完全不同的圖像;該算法會爲它們找到可能的匹配,儘管實際上這些匹配都是錯誤的......如果您確實想保持「正確」匹配,您將不得不使用更高級的過濾技術(但這是另一個問題)。

最後一件事我想提一提(用於匹配的理解)是matcher.match()不是對稱的:

matcher.match(descriptors,descriptors1,matches); 

會發現,在descriptors每個描述符,在descriptors1最好的對應關係。反過來可能是不正確的(你可以試着說服自己)。

這裏是我的意思是「不對稱」更詳細的例子:假設你有像A描述符Ai和你匹配的圖像A圖像0​​。您將獲得Bi,這將是BAi的最佳通信。

現在,如果您將圖片B與圖片A相匹配,您將獲得ABi的最佳對應關係。但可能存在Aj,與Ai不同,它與BiAj更相似。

在這種情況下,匹配AB匹配BA將給對應Bi <-> Aj這顯然是不一樣的會給對應Ai <-> Bi

+0

你最後一句話是什麼意思?謝謝你的信息,我會試試漢明並檢查我的結果 – user1393500 2013-05-01 18:11:31

+0

我編輯了我的答案。我希望現在更清楚。 – JonesV 2013-05-01 19:31:55

+0

是的,我一直在嘗試漢明,但goedematches.size()給出了奇怪的結果。與原始圖像沒有任何關係的圖像比與原始圖像幾乎相同的圖像更好地匹配。 – user1393500 2013-05-01 23:48:52

相關問題