SIFT特征描述符实现

时间:2015-03-10 09:18:26

标签: c++ opencv computer-vision sift

根据Lowe关于原始SIFT算法的论文,从16 x 16窗口计算出由4 x 4方向直方图组成的特征描述符。描述符的比例仅用于选择图像的高斯模糊等级。

看看OpenCV实现,似乎并非如此。在calcSIFTDescriptor中,有以下代码来计算直方图:

for( k = 0; k < len; k++ )
{
  // histogram update
}

其中len是使用的样本数。根据Lowe的算法,这应该总是256(16 x 16),应该是什么?在OpenCV实现中,len取决于描述符的规模。

有人可以澄清这个吗?

由于

1 个答案:

答案 0 :(得分:0)

您不是在查看构建直方图的代码,而是查看探索给定像素邻域的代码来计算渐变方向和范数。

相关代码如下:源文件:

for( k = 0; k < len; k++ )
{
  int bin = cvRound((n/360.f)*Ori[k]);
  if( bin >= n )
    bin -= n;
  if( bin < 0 )
    bin += n;
  temphist[bin] += W[k]*Mag[k];
}

在这段摘录中,行cvRound(...)是计算16-bin直方图中目标bin的行。

通常,在SIFT中,您应首先通过重新创建4x4像素的4x4块网格来重新采样特征点邻域。 您显示的代码用于计算渐变统计信息,而无需重新采样图像。 此处的变量半径将考虑尺度空间中的图像位置。