簡體   English   中英

OpenCV實施中的SIFT方向

[英]SIFT orientations in OpenCV implementation

在SIFT的OpenCV實現中,關鍵點的度數(角度)(從180到-180),代表這些關鍵點的計算方向。 由於SIFT使用直方圖中的10度倉來分配關鍵點的主導方向,我們如何獲得該角度范圍? 值不應該以10度為步長嗎?

是因為直方圖平滑嗎?

這是為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);
                        }
                    }

我認為我找到了問題的答案。

拋物線擬合最接近每個峰的3個直方圖值,以內插峰位置以獲得更好的精度。 這就是為什么我們可以獲得連續的值范圍而不是10個步進值的原因。

這是我們如何將拋物線擬合到3點的鏈接: 曲線擬合

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM