SIFT描述符背后的概念

时间:2014-04-15 14:28:16

标签: opencv sift

我已经阅读了一些关于SIFT的文献,并观看了一些视频。我理解SIFT背后的大多数概念,但有一件令我困惑的事情是关于SIFT描述符。

在SIFT中:

  • 我们找到了一个关键点
  • 我们在关键点周围拍摄16 x 16像素。
  • 16 x 16块划分为16个4 x 4
  • 计算每个8 bin
  • 4 x 4直方图
  • 因此,我们为此关键点获取 4 x 4 x 8 = 128 维度SIFT描述符。

image

我的困惑:

  • 让我们说,我的图像有50个关键点。
  • 我收到的此图片的SIFT描述符(即Mat描述符)有128 columns1 row .....为什么???
  • 我获得了128 columns1 row一个关键点,那么如果我得到50个关键点,那么它不应该是50 rows128 colmuns矩阵吗?

1 个答案:

答案 0 :(得分:2)

opencv的2.4.8源代码表示你应该得到128个描述符矩阵,其中n是关键点的数量。您可以看到 calcDescriptors()通过重新生成 descriptors 行为每个关键点创建描述符。

static void calcDescriptors(const vector<Mat>& gpyr, const vector<KeyPoint>& keypoints,
                            Mat& descriptors, int nOctaveLayers, int firstOctave )
{
    int d = SIFT_DESCR_WIDTH, n = SIFT_DESCR_HIST_BINS;

    for( size_t i = 0; i < keypoints.size(); i++ )
    {
        // [...]
        // some unrelevant code 

        calcSIFTDescriptor(img, ptf, angle, size*0.5f, d, n, descriptors.ptr<float>((int)i));
    }
}