2014-03-05 205 views
0

這是比較SURF描述符的函數,我在O​​penCV示例的find_obj.cpp中找到。我基本上無法理解這是如何計算描述符之間的歐幾里得距離。OpenCV SURF描述符匹配

是一次計算每個第i個描述符還是整個圖像?

我知道這是一個基本問題,但我真的很感激你的迴應。 謝謝。

double 
compareSURFDescriptors(const float* d1, const float* d2, double best, int length) 
{ 
    double total_cost = 0; 
    assert(length % 4 == 0); 
    for(int i = 0; i < length; i += 4) 
    { 
     double t0 = d1[i ] - d2[i ]; 
     double t1 = d1[i+1] - d2[i+1]; 
     double t2 = d1[i+2] - d2[i+2]; 
     double t3 = d1[i+3] - d2[i+3]; 
     total_cost += t0*t0 + t1*t1 + t2*t2 + t3*t3; 
     if(total_cost > best) 
      break; 
    } 
    return total_cost; 
} 

回答

0

對於每第i個描述符在圖像1從該圖像2.

0

到每個第j個描述符的解釋主要是基於文獻(Bay et al. 2004)

比方說,我們有一個圖像與檢測到的關鍵點。爲了爲關鍵點計算描述符,在其周圍定義一個正方形區域(根據紙張使用尺寸爲20s的窗口,其中s是檢測關鍵點的尺度)。然後將該區域劃分爲4X4 = 16個方形子區域(見圖)。對於這些子區域中的每一個,計算描述符4的值,得到i=[1:16]的4-dim矢量vi=[a1i,a2i,a3i,a4i](參見該論文或here以理解這些值是什麼)。因此,描述符的最終矢量一個接一個地累加這16個4-dim矢量的值。因此,描述符導致一個具有16 * 4 = 64-dim向量。總結:每個關鍵點都由一個64向量來描述。該矢量中的每4個值描述關鍵點附近的16個子區域中的一個。 (這也可以是128的擴展版本SURF-128)

enter image description here

所以,如果在整體C++代碼看,該函數的輸入是從物體只是一個描述符(一個關鍵點) (d1)和圖像中的一個描述符(d2)。基本上,比較是在2個64-dim矢量之間進行的(或者在擴展版本的情況下是128個)。斷言矢量的長度應該是4的倍數,證實這些描述符是由一個接一個附加的4-dim矢量形成的。

爲了識別對象的關鍵點是否與圖像的關鍵點相似,可以比較它們周圍的相同子區域。出於這個原因,每4個值進行比較(他們的差異/距離計算),總成本增加(根據他們的不同)。如果總成本大於閾值(最好),那麼沒有理由繼續進行比較,這些點不相似!

我希望這可以幫助,我沒有更多地迷惑你!

相關問題