VisualStudio2017+OpenCV3.2+robwhess-opensift配置

因为做业需求须要使用sift算子做图像拼接,本打算用CImg本身写一个sift,但因为参考robwhess的实现不只代码实际上与robwhess的很类似(照着人家的轮子造轮子真是没意义),并且还有不少问题要改,处于时间考虑就暂时用robwhess的OpenCV版本的sift算子。因为第一次使用vs+opencv因此顺便记录一下配置过程,对opencv配置不感兴趣的能够直接跳过。关于sift算法的讲解会在CImg版本完善后一块儿放出,目前告诉你sift用于提取出尺度无关、光照无关、具备旋转不变性的局部特征点。linux

Visual Studio 2017+OpenCV-3.2.0配置

因为重装过系统因此从新下载的Visual Studio,因此VS更新到了2017版本,对OpenCV的2.x版本都再也不支持,被迫使用了3.2.0的最新版本(最大的坏处在于3.x中nonfree的模块被移除了)。c++

下载安装

下载这两个东西的过程就没必要再提了,OpenCV记得下载安装文件而不是压缩文件,压缩文件中没有build文件夹。git

Windows环境变量配置

将${你的OpenCV解压路径}\opencv\build\x64\vc14\bin加入到系统变量Path中github

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。
图片描述ui

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>,而后运行一下看一看有什么问题看着提示改,这一块我怀疑每一个人遇到的可能会不同,我就提一下我去改动的地方。spa

关于cstdlib的noexcept的报错

robwhess是用C实现的sift,由于我打算用c++,因此要把全部.c文件改为.cpp文件指针

指针问题

c里void到其余类型的指针转换是不用显示声明的,但c++不行,因此全部calloc或malloc要在函数前面加上强制指针转换blog

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的效果图以下图片描述

相关文章
相关标签/搜索