根据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
取决于描述符的规模。
有人可以澄清这个吗?
由于
答案 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块网格来重新采样特征点邻域。 您显示的代码用于计算渐变统计信息,而无需重新采样图像。 此处的变量半径将考虑尺度空间中的图像位置。