结合OPENSIFT源码详解SIFT算法

平台:win10 x64 +VS 2015专业版 +opencv-2.4.11 + gtk_-bundle_2.24.10_win32

参考博客:https://www.cnblogs.com/cql/archive/2013/05/23/3095749.html

区别:VS2015,opencv2.4.11, gtk_-bundle_2.24.10_win32版本不同,稍有差别

一、OPENSIFT编译运行

区别:Visual Studio 2015专业版的项目中稍作改动并编译通过。

1.1 VS 2015专业版配置VS项目

VS 2015专业版 +opencv-2.4.11下载及安装见我的另一篇博客:https://www.cnblogs.com/Alliswell-WP/p/VS2015_OpenCV.html

那篇博客安装的是opencv-3.4.1-vc14_vc15  ,而本平台需要安装opencv-2.4.11  (那篇博客附有云盘下载链接),安装方法雷同,

注意:添加环境变量哦

首先解压OPENSIFT.zip ->里边有(“说明.txt”—说明了目录下各个文件,“SIFT程序vs”—为VS2012项目版本,对源码进行部分修改注释,“robwhess-opensift-300bad1.zip”—

从http://robwhess.github.io/opensift/下载的OpenSIFT源码)->将“SIFT程序vs”文件夹重命名为“SIFT”,然后拷贝到VS的工程文件夹下(我的是:“D:\Working\VS2015Projects”文件夹下)

->进入SIFT文件夹后用VS2015打开SIFT.vcxproj -> 默认模板解决方案平台选择是:Debug和解决方案配置选择是:Win32,

这时直接点击本地Windows调试器会有一大堆错误,还需要进行下面的配置。

1.2 OpenCV配置

下载链接:https://pan.baidu.com/s/12_DTxM265ZYmg5EBeacjNQ 密码:kbl3
下载后为:opencv-2.4.11.exe

安装:双击该可执行文件后更改路径(我的是:D:\ProgramFiles\opencv2)后点击“Extract”即可完成安装

配置:1.添加环境变量(我的为:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin)

注意入坑1:环境变量要配置为x86的,而不能是x64的,这和vs2015平台选择的win32统一

2.VS2015中opencv的配置:在SIFT处单击鼠标右键,在弹出的快捷菜单中选择“属性”选项,进入SIFT的属性页

->(默认)配置处选择:Debug,平台选择:活动(Win32)

在“配置属性”点击“VC++目录“->“包含目录”点击编辑->在“包含目录”的对话框中将OpenCV的头文件路径(一共三个,在build文件夹下)添加进去->点击“确定“

  我的是:1.D:\ProgramFiles\opencv2\opencv\build\include  2.D:\ProgramFiles\opencv2\opencv\build\include\opencv  3.D:\ProgramFiles\opencv2\opencv\build\include\opencv2

  >“库目录”点击编辑->在“库目录”的对话框中将静态链接库路径(在\build\x64或者x86文件夹所在的路径,这和vs2015平台选择的win32统一,选择x86)

  我的是:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\lib添加进去->点击“确定“

在“配置属性”点击“链接器“->点击“输入”->-> 在“附加依赖项”点击编辑->把lib库的名称(lib库文件在\build\x86\vc14\lib下)添加进去->点击“确定“->点击“确定“

Debug配置下:
opencv_calib3d2411d.lib;opencv_contrib2411d.lib;opencv_core2411d.lib;opencv_features2d2411d.lib;opencv_flann2411d.lib;opencv_gpu2411d.lib;
opencv_highgui2411d.lib;opencv_imgproc2411d.lib;opencv_legacy2411d.lib;opencv_ml2411d.lib;opencv_objdetect2411d.lib;opencv_ts2411d.lib;opencv_video2411d.lib;

Release配置下(先不用配置):

opencv_contrib2411.lib;opencv_core2411.lib;opencv_features2d2411.lib;opencv_flann2411.lib;opencv_gpu2411.lib;opencv_highgui2411.lib;opencv_imgproc2411.lib;
opencv_legacy2411.lib;opencv_ml2411.lib;opencv_objdetect2411.lib;opencv_ts2411.lib;opencv_video2411.lib;

注意入坑2:本平台需要安装opencv 2.x ,不能安装opencv 3.x,因为依赖库有问题,opencv3.x集成为一个了

注意入坑3:系统环境变量opencv只能配置一个(我的为:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin),如果有opencv3.x或者opencv 2.x的x64的都会在VS中运行出错

如D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin和D:\ProgramFiles\opencv2\opencv\build\x64\vc12\bin就会报错:应用程序无法启动0xc000007b

1.3 GTK+配置
下载:http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/

我下载了2.24.10版本,下载后文件为:gtk_-bundle_2.24.10-20120208_win32.zip

 注意入坑4:官网下载:https://www.gtk.org/download/windows.php,  没有All-in-one bundle 版本,而要求下载msys2-x86_64-20180531.exe

而MSYS2 (Minimal SYStem 2) 是一个MSYS的独立改写版本,主要用于 shell 命令行开发环境。同时它也是一个在Cygwin (POSIX 兼容性层) 和

MinGW-w64(从”MinGW-生成”)基础上产生的,追求更好的互操作性的 Windows 软件。

解压至->->D:\ProgramFiles,并将文件夹重命名为:gtk_-bundle_2.24.10_win32  (简洁点,方便添加环境变量和库)

配置:1.添加环境变量(我的为:D:\ProgramFiles\gtk_-bundle_2.24.10_win32\bin)

->->按说明验证,Win+R输入cmd运行,在cmd中输入“pkg-config --cflags gtk+-2.0” ,会有一些输出,输入 “gtk-demo” ,会出现一个示例,演示GTK+的一些功能控件。

->->接下来就跟OpenCV一样,要在VS2012的项目中进行一番配置了。在CMD中输入运行“pkg-config --cflags --libs gtk+-2.0”,可以看到需要包含的目录和链接库。

  可以将这些输出导入txt文件中,运行“pkg-config --cflags --libs gtk+-2.0 > D:\ProgramFiles\gtk_-bundle_2.24.10_win32\gtk.txt”,打开D:\ProgramFiles\gtk_-bundle_2.24.10_win32\gtk.txt,

内容如下:-mms-bitfields -ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/gtk-2.0

-ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/lib/gtk-2.0/include -ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/atk-1.0 -I

D:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/cairo -ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/gdk-pixbuf-2.0 -I

D:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/pango-1.0 -ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/glib-2.0 -I

D:/ProgramFiles/gtk_-bundle_2.24.10_win32/lib/glib-2.0/include -ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/include -I

D:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/freetype2 -ID:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/libpng14

-LD:/ProgramFiles/gtk_-bundle_2.24.10_win32/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -l

pangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl

然后根据这个来添加配置。在VS项目属性的“VC++目录”->“包含目录”中添加/GTK/include/gtk-2.0 到 /GTK/include/libpng14的这些路径,注意要用带盘符的完整路径,那个-mms-bitfields不用管它。

-L后面的D:/ProgramFiles/gtk_-bundle_2.24.10_win32/lib要添加在“库目录”中。

再后面的-l是链接库的名字,把这一串”gtk-win32-2.0.lib;gdk-win32-2.0.lib;atk-1.0.lib;gio-2.0.lib;pangowin32-1.0.lib;gdi32.lib;pangocairo-1.0.lib;gdk_pixbuf-2.0.lib;

pango-1.0.lib;cairo.lib;gobject-2.0.lib;gmodule-2.0.lib;gthread-2.0.lib;glib-2.0.lib;intl.lib;”添加进配置属性->链接器->输入->”附加依赖项“ 中就行了。

注意入坑5:报错gdk_screen_get_width被display_big_img调用,原因:直接复制D:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/gtk-2.0错误,因为里边是“/”,而win系统下路径是"\"

  所以,“包含目录”“库目录”下的路径都是"\"

注意入坑6:只能下载win32的,而不能是win64的,这和vs2015平台选择的win32统一

GTK+ win64的下载链接http://ftp.gnome.org/pub/gnome/binaries/win64/gtk+/2.22/

注意入坑7:报错找不到gdk.h或gtk.h>,原因:直接复制D:/ProgramFiles/gtk_-bundle_2.24.10_win32/include/gtk-2.0错误,因为里边是“/”,而win系统下路径是"\"

  所以,“包含目录”“库目录”下的路径都是"\",

而和utils.c下#include <gdk/gdk.h>和#include <gtk/gtk.h>无关,改成#include <gtk-2.0/gdk/gdk.h>和#include <gtk-2.0/gtk/gtk.h>错误依旧

1.4代码修改

  1.报错:“M_PI”未声明:发生在imgfeatures.c中。

  解决方案:在imgfeatures.h中加入 #define M_PI        3.14159265358979323846

  2.报错:无法找到头文件dirent.h。

  解决方案:在网上百度搜索:dirent.h - dirent API for Microsoft Visual Studio,然后下载文件,我是在码云上下载的(链接:https://gitee.com/lomox/beanstalkd-win/blob/master/dirent.h,

  解压后进入文件夹拷贝dirent.h),放在include文件夹(我的是:D:\Working\VS2015Projects\SIFT\include)下

  3.运行本地windows调试器后报错:无法启动应用程序,因为计算机中丢失msvcp120d.dll,关闭sift.exe后返回值为 -1073741515 (0xc0000135) '未找到依赖 dll'。

  原因:微软的Visual Studio最终用户许可协议是禁止发布调试版(名字后面有D)的DLL的,msvcp120d.dll和msvcr120d.dll是VS2013版本中的调试库文件,存在于路径:

  “\Microsoft Visual Studio 12.0\VC\redist\x86\Microsoft.VC120.CRT”中,VS2015版中只有msvcp140d.dll和msvcr140d.dll,但是OpenCV2.4.xx用的库版本最高为VC12,

  该库并没有升级VC14,我们需要用到VS2013的调试库文件,所以会造成msvcp120d.dll和msvcr120d.dll的缺失。

  解决方案:网上的方法是下载msvcp120d.dll和msvcr120d.dll到系统路径:C:\Windows\System32或C:\Windows\SysWOW64。但是我认为这样做不可取,随意添加到系统路径中容易与

  其他软件的安装发生冲突。我们可以将其放到OpenCV库路径中:“\OpenCV\opencv\build\x86\vc12\bin”。这样当我们不使用opencv时也不会调用这两个库文件,比较安全。
  下载链接:链接:https://pan.baidu.com/s/1nvN3atF 密码:11ak

  我下载的为:msvcp120d%E7%AD%89.rar,解压后拷贝至“\opencv\build\x86\vc12\bin”目录(我的是:D:\ProgramFiles\opencv2\opencv\build\x86\vc12\bin)下   ,重新运行本地windows调试器

上一篇:树和二叉树->遍历


下一篇:Docker 基础技术之 Linux cgroups 详解