经典算法SIFT实现即代码解释:以下便是sift源码库编译后的效果图:为了给有兴趣实现sift算法的朋友提供个参考,特整理此文如下。
要了解什么是sift算法,请参考:九、图像特征提取与匹配之SIFT算法。
ok,咱们下面,就来利用Rob Hess维护的sift 库来实现sift算法:首先,请下载Rob Hess维护的sift 库:/hess/code/sift/下载Rob Hess的这个压缩包后,如果直接解压缩,直接编译,那么会出现下面的错误提示:编译提示:error C1083: Cannot open include file: 'cxcore.h': No such file or directory,找不到这个头文件。
这个错误,是因为你还没有安装opencv,因为:cxcore.h和cv.h是开源的OPEN CV头文件,不是VC++的默认安装文件,所以你还得下载OpenCV并进行安装。
然后,可以在OpenCV文件夹下找到你所需要的头文件了。
据网友称,截止2010年4月4日,还没有在VC6.0下成功使用opencv2.0的案例。
所以,如果你是VC6.0的用户请下载opencv1.0版本。
vs的话,opencv2.0,1.0任意下载。
以下,咱们就以vc6.0为平台举例,下载并安装opencv1.0版本、gsl等。
当然,你也可以用vs编译,同样下载opencv(具体版本不受限制)、gsl等。
请按以下步骤操作:一、下载opencv1.0/projects/opencvlibrary/files/opencv-win/1.0/OpenCV_1.0.exe/download二、安装opencv1.0,配置Windows环境变量1、安装注意:假如你是将OpenCV安装到C:/Program Files/OpenCV(如果你安装的时候选择不是安装在C盘,则下面所有对应的C盘都改为你所安装在的那个“X盘”,即可),在安装时选择"将/OpenCV/bin加入系统变量",打上“勾”。
(Add/OpenCV/bin to the systerm PATH。
这一步确认选上了之后,下面的检查环境变量的步骤,便可免去)2、检查环境变量。
为了确保上述步骤中,加入了系统变量,在安装opencv1.0成功后,还得检查C:/Program Files/OpenCV/bin是否已经被加入到环境变量PATH,如果没有,请加入。
3、最后是配置Visual C++ 6.0。
全局设置菜单Tools->Options->Directories:先设置lib路径,选择Library files,在下方填入路径:C:/Program Files/OpenCV/lib然后选择include files,在下方填入路径(参考下图):C:/Program Files/OpenCV/cxcore/includeC:/Program Files/OpenCV/cv/includeC:/Program Files/OpenCV/cvaux/includeC:/Program Files/OpenCV/ml/includeC:/Program Files/OpenCV/otherlibs/highguiC:/Program Files/OpenCV/otherlibs/cvcam/include最后选择source files,在下方填入路径:C:/Program Files/OpenCV/cv/srcC:/Program Files/OpenCV/cxcore/srcC:/Program Files/OpenCV/cvaux/srcC:/Program Files/OpenCV/otherlibs/highguiC:/Program Files/OpenCV/otherlibs/cvcam/src/windows项目设置每创建一个将要使用OpenCV的VC Project,都需要给它指定需要的lib。
菜单:Project->Settings,然后将Setting for选为All Configurations,然后选择右边的link标签,在Object/library modules附加上:cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib当然,你不需要这么多lib,你可以只添加你需要的lib(见下图)三、下载gsl,gsl也是一个库,也需要下载:/projects/gnuwin32/files/gsl/1.8/gsl-1.8.exe/download。
在编译时候GSL也是和OpenCV一样要把头文件和lib的路径指定好。
四、配置gsl将C:/WinGsl/bin中的WinGsl.dll和WinGslD.dll复制到C:/VC6.0/Bin;将整个Gsl目录复制到C:/VC6.0/Bin下;lib目录下的所有.lib文件全部复制到C:/VC6.0/Lib下。
然后,在tools-options-directories中,将C:/WinGsl下的lib,gsl分别加入到库文件和头文件的搜索路径中。
以下是可能会出现的错误情况处理:I、OpenCV安装后“没有找到cxcore100.dll”的错误处理在安装时选择“将/OpenCV/bin加入系统变量”(Add/OpenCV/bin to the systerm PATH)。
但该选项并不一定能成功添加到系统变量,如果编写的程序在运行时出现“没有找到cxcore100.dll,因为这个应用程序未能启动。
重新安装应用程序可能会修复此问题。
”的错误。
手动在我的电脑->属性->高级->环境变量->系统变量->path添加c:/program files/opencv/bin;添加完成后需要重启计算机。
II、vc6.0下配置了一下,可是编译程序时遇到如下一个错误:Linking... LINK : fatal error LNK1104: cannot open file"odbccp32.libcxcore.lib"可能是:在工程设置的时候添加连接库时没加空格或.来把两个文件名(odbccp32.lib cxcore.lib)分开。
注意每一次操作后,记得保存。
若经过以上所有的步骤之后,如果还不能正常编译,那就是还要稍微修改下你下载的Rob Hess代码。
ok,日后,若有空,再好好详细剖析下此sift的源码。
最后,祝你编译顺利。
完。
SIFT代码详解:这是一个很强大的算法,主要用于图像配准和物体识别等领域,但是其计算量相比也比较大,性价比比较高的算法包括PCA-SIFT和SURF其中OpenCV提供了SURF算法,但是为了方便理解。
这里给出了Rob Hess所实现的SIFT算法的实现以及注释,结合我自己的理解,如果,您有关于SIFT算法不理解的地方咱们可以一起交流一下。
或者您认为不详细的地方提出来。
SIFT算法的主要实现在sift.c这个文件,其主要流程为:(1)首先创建初始图像,即通过将图像转换为32位的灰度图,然后将图像使用三次插值来方大,之后通过高斯模糊处理(2)在此基础上进行高斯金字塔的构建以及高斯差分金字塔的构建(3)对图像进行极值点检测(4)计算特征向量的尺度(5)调整图像大小(6)计算特征的方向(7)计算描述子,其中包括计算二维方向直方图并转换直方图为特征描述子首先给出sift算法的整体框架代码:输入参数:img为输入图像;feat为所要提取的特征指针;intvl指的是高斯金字塔和差分金字塔的层数;sigma指的是图像初始化过程中高斯模糊所使用的参数;contr_thr是归一化之后的去除不稳定特征的阈值;curv_thr指的是去除边缘的特征的主曲率阈值;img_dbl是是否将图像放大为之前的两倍;descr_with用来计算特征描述子的方向直方图的宽度;descr_hist_bins是直方图中的条数[cpp]view plaincopy1.int _sift_features( IplImage* img, struct feature** feat, int intvls,2.double sigma, double contr_thr, int curv_thr,3.int img_dbl, int descr_width, int descr_hist_bins )4.{5. IplImage* init_img;6. IplImage*** gauss_pyr, *** dog_pyr;7. CvMemStorage* storage;8. CvSeq* features;9.int octvs, i, n = 0;10.11./* check arguments */12.if( ! img )13. fatal_error( "NULL pointer error, %s, line %d", __FILE__, __LINE__ );14.15.if( ! feat )16. fatal_error( "NULL pointer error, %s, line %d", __FILE__, __LINE__ );17.18./* build scale space pyramid; smallest dimension of top level is ~4 pixels */19./* 构建高斯尺度空间金字塔,顶层最小的为4像素 */20. init_img = create_init_img( img, img_dbl, sigma );21. octvs = log( double MIN( init_img->width, init_img->height ) ) / log(2.0) - 2;22.//构建高斯金字塔和高斯差分金字塔23. gauss_pyr = build_gauss_pyr( init_img, octvs, intvls, sigma );24. dog_pyr = build_dog_pyr( gauss_pyr, octvs, intvls );25.26. storage = cvCreateMemStorage( 0 );27.28.//尺度空间极值点检测29. features = scale_space_extrema( dog_pyr, octvs, intvls, contr_thr,30. curv_thr, storage );31.32.//画出去除低对比度的极值点33.//draw_extrempoint(img , features);34.35.36.37.38.//计算特征向量的尺度39. calc_feature_scales( features, sigma, intvls );40.if( img_dbl )41. adjust_for_img_dbl( features );42.//计算特征的方向43. calc_feature_oris( features, gauss_pyr );44.//计算描述子,包括计算二维方向直方图和转换其为特征描述子45. compute_descriptors( features, gauss_pyr, descr_width, descr_hist_bins );46.47./* sort features by decreasing scale and move from CvSeq to array */48. cvSeqSort( features, (CvCmpFunc)feature_cmp, NULL );49. n = features->total;50. *feat = static_cast<feature *>( calloc( n, sizeof(struct feature) ) );51. *feat = static_cast<feature *>( cvCvtSeqToArray( features, *feat, CV_WHOLE_SEQ ) );52.53.54.55.56.for( i = 0; i < n; i++ )57. {58. free( (*feat)[i].feature_data );59. (*feat)[i].feature_data = NULL;60. }61.62. cvReleaseMemStorage( &storage );63. cvReleaseImage( &init_img );64. release_pyr( &gauss_pyr, octvs, intvls + 3 );65. release_pyr( &dog_pyr, octvs, intvls + 2 );66.return n;67.}(1)初始化图像输入参数:这里不需要解释了该函数主要用来初始化图像,转换图像为32位灰度图以及进行高斯模糊。