opencv – SIFT描述符背后的概念

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

在SIFT中:

>我们找到了一个关键点
>我们在关键点周围采用16 x 16像素.
>将16 x 16块分成16个4 x 4块
>为每个4 x 4块计算8 bin直方图
>因此,我们为此关键点获得4 x 4 x 8 = 128维SIFT描述符.

我的困惑:

>让我们说,我的图像有50个关键点.
>我收到的此图像的SIFT描述符(即Mat描述符)有128列和1行…..为什么???
>我有一个关键点有128列和1行,那么如果我得到50个关键点那么它不应该是50行和128个colmuns矩阵吗?

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

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));
    }
}
点赞