我已经阅读了一些关于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));
}
}