2017-03-08 101 views
0

在SIFT的OpenCV實現中,關鍵點具有度數(範圍從180到-180)的角度(角度),表示這些關鍵點的計算方向。由於SIFT使用直方圖中的10度分區來分配關鍵點的主導方向,我們如何能夠獲得這個角度範圍?不應該在10度的步驟?OpenCV實現中的SIFT方向

這是因爲直方圖平滑嗎?

這是keypoint.angle被賦值的代碼,你能幫我理解我們如何得到這個值嗎?

float omax = calcOrientationHist(gauss_pyr[o*(nOctaveLayers+3) + layer], 
                Point(c1, r1), 
                cvRound(SIFT_ORI_RADIUS * scl_octv), 
                SIFT_ORI_SIG_FCTR * scl_octv, 
                hist, n); 
        float mag_thr = (float)(omax * SIFT_ORI_PEAK_RATIO); 
        for(int j = 0; j < n; j++) 
        { 
         int l = j > 0 ? j - 1 : n - 1; 
         int r2 = j < n-1 ? j + 1 : 0; 

         if(hist[j] > hist[l] && hist[j] > hist[r2] && hist[j] >= mag_thr) 
         { 
          float bin = j + 0.5f * (hist[l]-hist[r2])/(hist[l] - 2*hist[j] + hist[r2]); 
          bin = bin < 0 ? n + bin : bin >= n ? bin - n : bin; 
          kpt.angle = 360.f - (float)((360.f/n) * bin); 
          if(std::abs(kpt.angle - 360.f) < FLT_EPSILON) 
           kpt.angle = 0.f; 
          keypoints.push_back(kpt); 
         } 
        } 
+0

雖然這個問題很有趣它不是嚴格意義上的編程問題,屬於在其他網站上,可能適合針對http:// CS。 stackexchange.com/ – EdChum

+0

我認爲你是對的,謝謝你的通知:) –

+0

它可能值得閱讀描述描述符的原始文件,我的理解是描述符是規模和方向不變的,但你仍然需要知道角度,以便您可以確定描述符是否描述了相同的特徵 – EdChum

回答

0

我想我找到了我的問題的答案。

拋物線擬合到最接近每個峯值的3個直方圖值以插入峯值位置以獲得更好的準確性。這就是爲什麼我們可以獲得連續的值範圍而不是10個步驟值。

這是我們如何適應拋物線3點鏈接: Curve fitting