《SIFT算法实现C语言》由会员分享,可在线阅读,更多相关《SIFT算法实现C语言(34页珍藏版)》请在金锄头文库上搜索。
1、经典算法 SIFT 实现即代码解释:以下便是 sift 源码库编译后的效果图: 为了给有兴趣实现 sift 算法的朋友提供个参考,特整理此文如下。要了解什么是 sift 算法,请参考: 九、图像特征提取与匹配之 SIFT 算法。ok,咱们下面,就来利用 Rob Hess 维护的 sift 库来实现 sift 算法:首先,请下载 Rob Hess 维护的 sift 库:http:/blogs.oregonstate.edu/hess/code/sift/下载 Rob Hess 的这个压缩包后,如果直接解压缩,直接编译,那么会出现下面的错误提示:编译提示:error C1083: Cannot o
2、pen 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 任意下载。以
3、下,咱们就以 vc6.0 为平台举例,下载并安装 opencv1.0 版本、gsl 等。当然,你也可以用 vs 编译,同样下载 opencv(具体版本不受限制) 、gsl 等。请按以下步骤操作:一、下载 opencv1.0http:/ opencv1.0,配置 Windows 环境变量1、安装注意:假如你是将 OpenCV 安装到 C:/Program Files/OpenCV(如果你安装的时候选择不是安装在 C 盘,则下面所有对应的 C 盘都改为你所安装在的那个“X 盘”,即可) ,在安装时选择 将/OpenCV/bin 加入系统变量,打上“勾”。(Add/OpenCV/bin to the
4、 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,在下方填入路径 (参考下图)
5、: 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:/Progra
6、m 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 附加
7、上:cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib当然,你不需要这么多 lib,你可以只添加你需要的 lib(见下图) 三、下载 gsl,gsl 也是一个库,也需要下载:http:/ 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 下。然后,在 t
8、oolsoptionsdirectories 中,将 C:/WinGsl 下的 lib,gsl 分别加入到库文件和头文件的搜索路径中。以下是可能会出现的错误情况处理:I、OpenCV 安装后“ 没有找到 cxcore100.dll”的错误处理在安装时选择“ 将/OpenCV/bin 加入系统变量” (Add/OpenCV/bin to the systerm PATH) 。 但该选项并不一定能成功添加到系统变量,如果编写的程序在运行时出现“没有找到 cxcore100.dll,因为这个应用程序未能启动。重新安装应用程序可能会修复此问题。 ”的错误。手动在我的电脑-属性- 高级- 环境变量-系统
9、变量-path 添加 c:/program files/opencv/bin;添加完成后需要重启计算机。II、vc6.0 下配置了一下,可是编译程序时遇到如下一个错误: Linking. LINK : fatal error LNK1104: cannot open fileodbccp32.libcxcore.lib 可能是:在工程设置的时候添加连接库时没加空格或.来把两个文件名(odbccp32.lib cxcore.lib)分开。注意每一次操作后,记得保存。若经过以上所有的步骤之后,如果还不能正常编译,那就是还要稍微修改下你下载的 Rob Hess 代码。ok,日后,若有空,再好好详细剖
10、析下此 sift 的源码。最后,祝你编译顺利。 完。SIFT 代码详解:这是一个很强大的算法,主要用于图像配准和物体识别等领域,但是其计算量相比也比较大,性价比比较高的算法包括 PCA-SIFT 和 SURF 其中 OpenCV 提供了 SURF算法,但是为了方便理解。这里给出了 Rob Hess 所实现的 SIFT 算法的实现以及注释,结合我自己的理解,如果,您有关于 SIFT 算法不理解的地方咱们可以一起交流一下。或者您认为不详细的地方提出来。SIFT 算法的主要实现在 sift.c 这个文件,其主要流程为:(1)首先创建初始图像,即通过将图像转换为 32 位的灰度图,然后将图像使用三次插
11、值来方大,之后通过高斯模糊处理(2)在此基础上进行高斯金字塔的构建以及高斯差分金字塔的构建(3)对图像进行极值点检测(4)计算特征向量的尺度(5)调整图像大小(6)计算特征的方向(7)计算描述子,其中包括计算二维方向直方图并转换直方图为特征描述子首先给出 sift 算法的整体框架代码:输入参数:img 为输入图像;feat 为所要提取的特征指针;intvl 指的是高斯金字塔和差分金字塔的层数;sigma 指的是图像初始化过程中高斯模糊所使用的参数;contr_thr 是归一化之后的去除不稳定特征的阈值;curv_thr 指的是去除边缘的特征的主曲率阈值;img_dbl 是是否将图像放大为之前的
12、两倍;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,
13、 * 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. /* buil
14、d 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_i
15、mg, 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. ca