网上已经有许多关于sift算法详细解释。本文适合于已经对sift算法有一定了解的读者,写本文的目的在于对Rob Hess的sift算法的源代码进行注释,从代码的角度对提升对sift算法的理解。闲话少说,进入正文。
首先从网址http://robwhess.github.io/opensift/上下载sift源代码。解压之后不能直接运行,因为作者是在linux下编译的,所以需要自己在windows下调试,具体过程网上搜一下都有,本文在此不赘述了。
查看文件中的match.c文件包含了sift算法匹配的整个过程。
extern int sift_features( IplImage* img, struct feature** feat );
这个函数包含整个sift算法的流程,函数返回值为特征点的数目,如果没有找到特征点则返回-1。img定义为输入图像,feat定义为指向结构体feature的指针。
int sift_features( IplImage* img, struct feature** feat )
{
return _sift_features( img,
feat,
SIFT_INTVLS,
SIFT_SIGMA,
SIFT_CONTR_THR,
SIFT_CURV_THR,
SIFT_IMG_DBL,
SIFT_DESCR_WIDTH,
SIFT_DESCR_HIST_BINS );
}
int _sift_features( IplImage* img, struct feature** feat, intintvls,
doublesigma, doublecontr_thr, intcurv_thr,
intimg_dbl,intdescr_width, intdescr_hist_bins)
{
IplImage* init_img;
IplImage***gauss_pyr, *** dog_pyr;
CvMemStorage*storage;
CvSeq* features;
intoctvs, i, n = 0;
/* checkarguments *///判断是否正确读入图像
if(