2013-05-03 100 views
0

因此,我正在使用FAST檢測器和FREAK描述符進行應用。當涉及到匹配時,我想使用BRUTEFORCE_HAMMING匹配,但我沒有得到預期的結果(給出了與原始圖像無關的更多匹配,然後圖像看起來相似)匹配FREAK描述符的最佳方法是什麼?

我試過下面的代碼

MatOfDMatch matches = new MatOfDMatch(); 

     matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING); 
     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 <= 2*min_dist) 
      { temp.fromArray(matches.toArray()[i]); 
       goedematches.push_back(temp); 
       }   
     // } 
     } 

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

但它給出了「壞」的結果。所以我的問題是,有沒有其他方法與FREAK描述符進行匹配? (我使用的OpenCV庫2.4.4和Java包裝,所以沒有C代碼)

回答

1

一旦你有你的描述符,蠻力的方法會給你最接近的對應,你可以找到它,因爲它試圖匹配將第一圖像上的描述符與第二圖像的所有描述符進行比較。

所以答案是否定的:用FREAK描述符,你可以得到的最好結果(w.r.t海明距離)是你用暴力匹配得到的結果。

(這就是說,你應該得到了很多好的和壞的比賽中,當圖像是相似的。你有沒有試過畫比賽?嘗試將比賽之間畫線不使用過濾步驟

+0

我知道如何獲得兩個圖像的關鍵點,但不知道如何連接它們。任何想法如何做到這一點? – user1393500 2013-05-04 13:31:24

+0

在矩陣中彼此相鄰繪製兩個圖像,並在點之間繪製線條(cv :: line)。 – JonesV 2013-05-04 16:02:50

0

如果它是你正在檢查的圖像的雙重性,我建議你使用BRISK算法,漢明距離爲10。我在我的application中使用這個,我開發了一個tool這將幫助您找到所需的最佳算法。也許你可以升級我用匹配類型設計的工具。

0

您可能會收到糟糕的結果,因爲FREAK本身不是旋轉和比例不變的。 嘗試在這些關鍵點周圍使用BRISK關鍵點檢測和FREAK描述符。

如果將描述符設置爲null,JavaCV允許您使用BRISK關鍵點檢測。