繁体   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