2017-03-08 10 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에 대한 가능성이 적절하게, 엄격하게 프로그래밍 질문이 아니라 다른 사이트에 속한 재미있다 :

이것은 우리가 3 점 포물선을 들어갈 수있는 방법에 대한 링크입니다 // CS. stackexchange.com/ – EdChum

+0

나는 당신이 옳았다 고 생각합니다. 통지 : 감사합니다. –

+0

아마도 원고를 설명하는 원고를 읽을 가치가 있습니다. 내 이해는 원고가 크기와 방향이 불변이지만, 설명자가 동일한 기능을 설명 하는지를 결정할 수있는 각도를 알아야합니다. – EdChum

답변

0

내 질문에 대한 답을 찾은 것 같습니다.

더 나은 정확도를 위해 피크 위치를 보간하기 위해 각 피크에 가장 가까운 3 개의 막대 그래프 값에 포물선이 맞습니다. 그래서 우리는 10 단계 값 대신 계속적인 값 범위를 얻을 수 있습니다. Curve fitting