2017-03-08 4 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

:// CS。 stackexchange.com/ – EdChum

+0

私はあなたが正しいと思います。通知のためにありがとうございます。 –

+0

それはおそらく、記述子を記述するオリジナルの論文を読む価値があります。私の理解は、記述子はスケールと向きが不変であるが、記述子が同じフィーチャを記述しているかどうかを判断できるような角度を知っている – EdChum

答えて

0

私は私の質問に対する答えを見つけたと思います。

ピーク位置を補間するために、各ピークに最も近い3つのヒストグラム値に放物線が当てはめられ、精度が向上します。そのため、10ステップの値ではなく、連続した値の範囲を得ることができます。

これは、我々は3ポイントに放物線を合うことができる方法のリンクです:この質問は、それは、HTTPのために、おそらく適切に、面白い厳密にプログラミングの質問ではありませんし、別のサイトに属している間 Curve fitting

関連する問題