说明:添加了opencv_contrib模块,可以使用SIFT算法;vs2015对应vc14,vs2017对应vc15
1软件配置:
(1)Vs2017企业版
(2)Opencv4.1.0 (最好下载exe那个版本,其实就是个压缩包)
https://opencv.org/releases/
(3)Opencv_Contrib4.1.0 (版本要和Opencv4.1.0保证一致)
https://github.com/opencv/opencv_contrib/releases/tag/4.1.0
(4)Cmake3.14.0
https://cmake.org/download/
2文件夹设置:
安装路径选择的是D:\OpenCV,有子文件夹opencv41(放置下载的opencv4.1.0解压缩后的文件)和opencv_contrib41(放置opencv_contrib4.1.0的解压缩文件)
在D:\OpenCV\opencv41路径下新建文件夹newbuild,用于存储后面用cmake编译的文件。有了newbuild之后,其实opencv4.1.0自带的build就没用了。
3.cmake上的操作
(1)打开cmake-gui.exe,where is the source code: D:/OpenCV/opencv41/sources
Where to build binaries: D:/OpenCV/opencv41/newbuild(刚才新建的文件夹)
(2)点击configure,出现选择vs2017,x64。然后经过长达十几分钟的等待(具体等待时间取决于外网下载的速度)。Configure之后,勾选BUILD_OPENCV_WORLD,BUILD_EXAMPLES,OPENCV_ENABLE_NONFREE三个小方框,在opencv_modules_path后面选择路径D:/OpenCV/opencv_contrib41/modules(这个是在安装opencv_contrib4.1.0部分),然后重新点击configure。如果这次configure之后所有行都变成白色(即不再是红色)可以跳入下一步,否则继续点击configure,知道所有行变红(变红说明下载失败)。注意:通常有ippcv_2019_win_inte64_20180723_general,opencv+ffmpeg.dll,opencv_ffmpeg_64.dll经常下载失败。
(3)没有红色行之后,点击generate,generate之后(最后两行出现configuring done,generating done),点击右边的open Project在vs2017中打开该项目。至此cmake任务结束。
4. 配置环境变量
打开我的电脑-属性-高级系统设置-环境变量。在‘系统变量’中选择‘Path’,双击开始编辑环境变量,新建,D:\OpenCV\opencv41\newbuild\install\x64\vc15\bin。环境变量设置完成。
5.vs2017上的操作
(1)设置Debug,x64.在解决方案管理器中,选择解决方案‘OpenCV’,右键,生成解决方案。等待十几分钟等解决方案生成完毕,在CMakeTargets下选择INSTALL,右键,仅用于项目-仅生成INSTALL。
(2)Release,x64.在解决方案管理器中,选择解决方案‘OpenCV’,右键,生成解决方案。等待十几分钟等解决方案生成完毕,在CMakeTargets下选择INSTALL,右键,仅用于项目-仅生成INSTALL。
(3)文件-新建-项目,在属性管理器中,选择Debug|x64,属性。
VC++目录-可执行文件目录:D:\OpenCV\opencv41\newbuild\install\x64\vc15\bin
VC++目录-包含目录:D:\OpenCV\opencv41\newbuild\install\include
D:\OpenCV\opencv41\newbuild\install\include\opencv2
VC++-库目录:D:\OpenCV\opencv41\newbuild\install\x64\vc15\lib
链接器-输入-附加依赖项:opencv_world410d.lib
opencv_img_hash410d.lib(一般需要的就是opencv_world410d.lib,我看到D:\OpenCV\opencv41\newbuild\install\x64\vc15\lib目录下有个opencv_img_hash410d.lib就也加上去了,应该不加也行)
至此,配置完成。重启vs2017即可。
6.测试文件(加载图片,提取SIFT特征点,并显示在图片上)
#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\xfeatures2d\nonfree.hpp>
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
int main()
{
std::cout << "Hello World!\n";
cv::Mat imageL = cv::imread("E:\\TEST\\DSC00013.png");
//提取特征点方法
//SIFT
cv::Ptr<cv::xfeatures2d::SIFT> sift = cv::xfeatures2d::SIFT::create();
//ORB
//cv::Ptr<cv::ORB> orb = cv::ORB::create();
//SURF
/*cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create();*/
//特征点
std::vector<cv::KeyPoint> keyPointL, keyPointR;
//单独提取特征点
sift->detect(imageL, keyPointL);
//画特征点
cv::Mat keyPointImageL;
drawKeypoints(imageL, keyPointL, keyPointImageL, cv::Scalar::all(-1), DrawMatchesFlags::DEFAULT);
//显示窗口
cv::namedWindow("KeyPoints of imageL");
//显示特征点
cv::imshow("KeyPoints of imageL", keyPointImageL);
cv::waitKey(0);
return 0;
}
如下为最终图,这些彩色的小圈圈就是证明