[英]SIFT feature descriptor implementation
根据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
取决于描述符的大小。
有人可以澄清一下吗?
谢谢
您不是在查看构建直方图的代码,而是在探索给定像素的邻域以计算梯度方向和范数的代码。
相关代码在源文件中:
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格直方图中的目标格的行。
通常,在SIFT中,您应该首先通过重新创建4x4像素的4x4块的网格来重新采样特征点邻域。 您显示的代码用于计算梯度统计信息,而无需重新采样图像。 此处,可变半径要考虑图像在比例空间中的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.