2013-06-25 78 views
1

我正在使用VLIFTAT實現SIFT來計算兩組圖像上的SIFT描述符:查詢和數據庫圖像。給定一組查詢,我想從描述符的大數據庫中獲取最接近的描述符,爲此我使用vl_ubcmatch。vl_ubcmatch中參數的順序是什麼?

將vl_ubcmatch語法設置爲MATCHES = vl_ubcmatch(DESCR1, DESCR2)如果我先輸入查詢描述符,並將數據庫描述符作爲第二個參數或其他方式輸入,我會得到不同的結果。

哪個是正確的語法?

1)MATCHES = vl_ubcmatch(QUERY_DESCR,DATABASE_DESCR)

2)MATCHES = vl_ubcmatch(DATABASE_DESCR,QUERY_DESCR)

回答

0

MATCHES = vl_ubcmatch(DESCR1, DESCR2)DESCR2DESCR1搜索最接近的描述每個描述符,它如果匹配通過測試增加了輸出(詳細內容見deltheil的答案)。 所以我認爲MATCHES = vl_ubcmatch(QUERY_DESCR,DATABASE_DESCR)是你想要的變體。

1

我得到不同的結果,如果我輸入查詢描述符第一和數據庫描述符作爲第二個參數或周圍的其他方法。

這是因爲該方法使用比率測試 [1]在幕後算法,即最接近鄰居的距離進行比較,以使得第二最近的鄰居的。

vl_feat實現默認使用的1.5閾值如下:

if(thresh * (float) best < (float) second_best) { 
    /* accept the match */ 
} 

這比試驗不是對稱的,這就是爲什麼當你交換的輸入,你可以獲取該組比賽之間的差異。

如果你不舒服,你可以使用OpenCV庫Chapter 9這表明一個務實地對稱化的匹配如下參考計算機視覺編程:

從這些[匹配]套,我們現在將提取兩個集合中符合 的匹配。這是對稱匹配方案強加的, 對於要接受的匹配對,兩個點必須是另一個的最佳匹配 特徵。

[1]參見D.Lowe的論文中的7.1 Keypoint Matching