【问题标题】:SIFT orientations in OpenCV implementationOpenCV 实施中的 SIFT 方向
【发布时间】:2017-07-28 18:31:14
【问题描述】:

在 SIFT 的 OpenCV 实现中,关键点的(角度)以度为单位(范围从 180 到 -180),表示这些关键点的计算方向。由于 SIFT 使用直方图中的 10 度 bin 分配关键点的主要方向,我们如何获得这个角度范围?这些值不应该以 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);
                        }
                    }

【问题讨论】:

  • 虽然这个问题很有趣,但它并不是严格意义上的编程问题,属于另一个站点,可能适合cs.stackexchange.com
  • 我认为你是对的,谢谢你的通知:)
  • 可能值得阅读描述描述符的原始论文,我的理解是描述符是比例和方向不变的,但您仍然需要知道角度,以便您可以确定描述符是否是描述相同的特征
  • 根据我的知识和直觉:描述符是针对“标准化”关键点计算的,因此首先确定关键点的方向,然后为关键点邻域计算描述符,就像图像看起来一样已旋转,因此新关键点的方向为 0 度。因此,如果描述符包含有关 10 度步长的梯度信息,并且您想知道图像中的实际梯度方向,则必须“添加”关键点本身的方向。
  • 你能准确地回答你的问题吗?是不是就像“关键点的角度像 13 度,如果只评估 10 度的步长,这怎么可能?” - 如果是这种情况(我不知道),我猜在方向箱之间可能会有某种插值来近似更好的最大值。也许类似的方法,如“亚像素精度插值”(例如,将样条拟合到某个邻域并搜索局部最优值)。

标签: c++ opencv orientation matching sift


【解决方案1】:

我想我找到了问题的答案。

抛物线拟合最接近每个峰的 3 个直方图值,以对峰位置进行插值以获得更好的准确性。这就是为什么我们可以获得连续的值范围而不是 10 个步长值。

这是我们如何将抛物线拟合到 3 点的链接: Curve fitting

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多