2012-02-28 121 views
1

我必須爲我的masterthesis實現一個android的標誌檢測算法。 我目前在NDK中使用openCV android庫,並已經設法使用SURF檢測這些關鍵點的關鍵點和設置描述符。openCV Android:knnMatcher只返回1個描述符的匹配

我下一步是使用找到2個最近的每一個關鍵點匹配knnMatch,後來我要把這裏遠離與這些第二(的距離比相比,最好的KNN搭配不是十分區分比賽二是過低) 這裏是我的代碼的一部分:

private static List<DMatch> knn(Mat queryDescriptors, Mat trainDescriptors) { 
    List<List<DMatch>> matches = new ArrayList<List<DMatch>>(); 
    List<DMatch> retMatches = new ArrayList<DMatch>(); 
    DescriptorMatcher matcher = DescriptorMatcher 
      .create(DescriptorMatcher.BRUTEFORCE); 
    matcher.knnMatch(queryDescriptors, trainDescriptors, matches, 2); 

我在這裏的問題是,當我有例如500所描述爲查詢標誌和400對列車標誌,KNN返回500場比賽,但每一個是爲同一個關鍵點。通常,它會爲每個描述符返回2個最佳匹配,因此有500個不同的描述符,現在它們返回500次匹配一個描述符和相同描述符的最佳匹配。

所以,當我畫這些KNN比賽中,有1條線,繪製500次,始終不變的關鍵點

當我嘗試簡單的匹配,誰只是返回最佳匹配之間,我得到更多的線。 我已經測試了這個圖像與自身的比較。 Knn返回這一行,在這種情況下,一場簡單的比賽吸引了所有500場比賽,這些場合都是正確的。

我找不到這個類似的問題已被治療的任何帖子,有沒有人有這個問題,或知道我在這裏做錯了什麼?

Thanx提前。

回答

2

下一次當您面對OpenCV中的錯誤時,請檢查它是否已在OpenCV bug tracker處提交,如果未找到,請提交新錯誤。 你所面臨的是JNI包裝器到C++匹配器中的一個錯誤,該修復已經被委託給OpenCV中繼。 但是你可以把它在本地的OpenCV的-2.3.1的副本,這是代碼只需一行:

  1. 開放org.opencv.utils.Converters :: Mat_to_vector_vector_DMatch(襯墊M,名單> lldm)在OpenCV中-2.3.1的Android庫項目(Converters.java)
  2. 招行List<DMatch> ldm = new ArrayList<DMatch>();兩線向下,使其循環for (Mat mi : mats)
  3. 重建的OpenCV-2.3.1項目的1號線和自己在Eclipse
  4. 確保現在匹配器返回正確的結果
+0

謝謝!這工作,我仍然沒有找到正確的比賽,但knnMatches的行爲現在是正常的。 我從來沒有找到openCV錯誤跟蹤器,而搜索這個問題(谷歌,..),但現在我一定會檢查這個問題發生時! 謝謝! – piepie 2012-03-05 14:12:17