由于作业需求需要使用sift算子作图像拼接,本打算用CImg自己写一个sift,但由于参考robwhess的实现不仅代码实际上与robwhess的很相似(照着人家的轮子造轮子真是没意义),而且还有很多问题要改,处于时间考虑就暂时用robwhess的OpenCV版本的sift算子。由于第一次使用vs+opencv所以顺便记录一下配置过程,对opencv配置不感兴趣的可以直接跳过。关于sift算法的讲解会在CImg版本完善后一起放出,目前告诉你sift用于提取出尺度无关、光照无关、具有旋转不变性的局部特征点。
Visual Studio 2017+OpenCV-3.2.0配置
由于重装过系统所以重新下载的Visual Studio,所以VS更新到了2017版本,对OpenCV的2.x版本都不再支持,被迫使用了3.2.0的最新版本(最大的坏处在于3.x中nonfree的模块被移除了)。
下载安装
下载这两个东西的过程就不必再提了,OpenCV记得下载安装文件而不是压缩文件,压缩文件中没有build文件夹。
Windows环境变量配置
将${你的OpenCV解压路径}\opencv\build\x64\vc14\bin加入到系统变量Path中
Visual Studio配置
打开你需要使用OpenCV的项目,右击项目选择属性页打开。
在“VC++目录”中的“包含目录”一栏加入${你的OpenCV解压路径}\opencv\build\include;${你的OpenCV解压路径}\opencv\build\include\opencv;${你的OpenCV解压路径}\opencv\build\include\opencv2。
在"VC++目录"的“库目录”一栏加入${你的OpenCV解压路径}\opencv\build\x64\vc14\lib。
在“链接器”->“输入”的“附加依赖项”栏中加入之前库目录添加的那个lib文件夹下的两个lib文件,这里不需要加路径直接写文件名即可(OpenCV3.x省了很多lib,如果使用2.x这里有貌似38个lib要加)。
到这里OpenCV的配置就完成了,可以上网随便找一个简单例子跑一下看看,最简单的比如读取一张图片并显示5000ms。
robwhess-opensift配置
这里提一下,实际上OpenCV也是提供了SIFT和SURF算子的,但是在3.x的版本中这一块以及一些其他功能被移了出去,如果要用需要去github额外下载opencv_contrib,下载下来后用cmake把opencv下的sources重新编译一下再把opencv_contrib中的modules编译进去,这一块网上自己找教程吧,因为我一开始想这么做但是失败了。
如果是最新的robwhess的github上的sift,里面有用到linux系统的库函数,我懒得去研究windwos下怎么代替,所以找了旧版本的sift,也是在别人那里看到的,链接http://pan.baidu.com/share/li...。
把这里的文件下载下来直接加到自己的项目里就好,其中所有的opencv头文件在原代码里都是直接include实际上需要修改成<opencv\xxx>,然后运行一下看一看有什么问题看着提示改,这一块我怀疑每个人遇到的可能会不一样,我就提一下我去改动的地方。
关于cstdlib的noexcept的报错
robwhess是用C实现的sift,因为我打算用c++,所以要把所有.c文件改成.cpp文件
指针问题
c里void到其他类型的指针转换是不用显示声明的,但c++不行,所以所有calloc或malloc要在函数前面加上强制指针转换
CV_RGB和CvScalar的类型转换问题
本来CV_RGB是定义的宏实际调用的cvScalar的构造函数,所以你可以直接改成使用cvScalar的构造函数,同样有两个宏定义为CV_RGB的也可以直接改为cvScalar,不过要注意参数顺序是反过来的,CV_RGB的参数是r、g、b三个通道,但cvScalar是b、g、r
cvLine和cvEllipse函数未定义
OpenCV的3.x里似乎这两个画图的函数不在cxcore里了,include一下cv.h就可以正常使用这两个函数
cvRound,cvFloor,cvCeil宏无法找到
直接使用c++自己的round,floor,ceil函数替代即可
sift的使用
robwhess使用feature结构体存储的特征点,对于OpenCV的C版本图像的数据格式是IplImage,初始化图像以及一个feature的指针,调用sift_features()方法传入这两个数据,会返回特征点个数,使用imgfeatures.h中的draw_features、draw_oxfd_features、draw_lowe_features方法可以在图像中标注特征点,对于3.x版本使用cvarrToMat函数可以将IplImage数据格式的图像转为Mat格式,后者是C++中OpenCV存储图像的常见数据格式。draw_features的效果图如下
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。