opencv在3.0版本后sift等一些非免费开源的方法和函数被放到到了opencv_contrib库里,所以直接用opencv调用sift相关函数是无法加载的,需要自己Cmake源代码生成包含opencv_contrib的库;
首先准备如下:
1、下载vs2015,链接:https://pan.baidu.com/s/1c28f8ze,提取码:52dj;秘钥在网上找,然后安装;
2、下载qt5.8;官网需要注册,网盘链接:链接: https://pan.baidu.com/s/1jICDilg 密码: x9fm;安装;
3、下载qt-vs工具;网盘链接:链接: https://pan.baidu.com/s/1c2piQfI 密码: t64d;安装后,在vs里设置qt路径,如何安装查看前面博客;
4、下载opencv3.2,可以在github上下载,这里网盘链接:链接: https://pan.baidu.com/s/1skVLwKl 密码: 3r8q;安装;
5、下载opencv_contrib,也可以在GitHub上下载,另网盘:链接: https://pan.baidu.com/s/1gftgyjx 密码: rdem;解压放到opencv文件夹里;
6、下载Cmake,这个也可以在官网下载,另网盘链接:链接: https://pan.baidu.com/s/1nvJY7X3 密码: 3uv3;安装;
然后cmake opencv的源代码:
1、打开Cmake,选择opencv安装文件里的sources文件夹;
2、选择要build的文件夹;如下图:
3、点击Generate,后如下图,finish后等待Cmake;
4、完了后,找到“OPENCV_EXTRA_MODUALS_PATH”,设置其参数值为opencv_contrib源码包中的modules目录;如下:
5、点击configure.成功后显示configuring done,然后点击Generate;
6、都configure后,在你build的文件里会生成相应的文件,找到OpenCV.sln文件双击,用vs2015进行编译或者直接点击Cmake的open project按钮;
7、vs2015编译参考博客:http://blog.youkuaiyun.com/cosmispower/article/details/60601151;
最后编译好了,的lib在目标文件夹里的install文件里;qt5.8编译时候.pro文件添加如下,目录和include根据自己目录添加路径:
INCLUDEPATH+=D:/opencv320/install/include
INCLUDEPATH+=D:/opencv320/install/include/opencv
INCLUDEPATH+=D:/opencv320/install/include/opencv2
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_aruco320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_bgsegm320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_bioinspired320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_calib3d320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_ccalib320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_core320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_datasets320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_dnn320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_dpm320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_face320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_features2d320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_flann320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_fuzzy320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_highgui320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_imgcodecs320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_imgproc320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_line_descriptor320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_ml320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_objdetect320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_optflow320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_phase_unwrapping320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_photo320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_plot320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_reg320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_rgbd320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_saliency320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_shape320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_stereo320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_stitching320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_structured_light320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_superres320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_surface_matching320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_text320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_tracking320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_video320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_videoio320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_videostab320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_xfeatures2d320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_ximgproc320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_xobjdetect320d
unix|win32: LIBS += -L$$PWD/../../opencv320/install/x64/vc14/lib/ -lopencv_xphoto320d
INCLUDEPATH += $$PWD/../../opencv320/install/x64/vc14
DEPENDPATH += $$PWD/../../opencv320/install/x64/vc14
qt编译的时候会异常跳出,vs2015编译的时候会报错缺少***dll;这时候把build对应编译的目录bin文件下的dll全部复制到c盘系统文件C:\Windows\System32,和C:\Windows\SysWOW64里面;再次编译程序就ok了;附sift测试代码qt mainwindow.cpp代码:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <opencv\cv.h>
#include<opencv/highgui.h>
#include <opencv2/opencv.hpp> //头文件
#include <opencv2/xfeatures2d.hpp>
using namespace cv; //包含cv命名空间
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// //声明IplImage指针
// IplImage *pImg;
// //载入图片
// pImg = cvLoadImage("D:/1.jpg");
// //创建窗口
// cvNamedWindow("Image",1);
// //显示图像
// cvShowImage("Image",pImg);
// //等待按键
// cvWaitKey(-1);
// //销毁窗口
// cvDestroyWindow("Image");
// //释放图像
// cvReleaseImage(&pImg);
//Create SIFT class pointer
Ptr<Feature2D> f2d = xfeatures2d::SIFT::create();
//读入图片
Mat img_1 = imread("D:/source.png");
Mat img_2 = imread("D:/mubiao.jpg");
//Detect the keypoints
vector<KeyPoint> keypoints_1, keypoints_2;
f2d->detect(img_1, keypoints_1);
f2d->detect(img_2, keypoints_2);
//Calculate descriptors (feature vectors)
Mat descriptors_1, descriptors_2;
f2d->compute(img_1, keypoints_1, descriptors_1);
f2d->compute(img_2, keypoints_2, descriptors_2);
//Matching descriptor vector using BFMatcher
BFMatcher matcher;
vector<DMatch> matches;
matcher.match(descriptors_1, descriptors_2, matches);
//绘制匹配出的关键点
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);
// imshow("match图", img_matches);
// //等待任意按键按下
// waitKey(0);
imshow("match",img_matches);
waitKey(0);
}
MainWindow::~MainWindow()
{
delete ui;
}
效果如下: