准备:
1. opencv最新的版本是3.10,可以到官网下载http://opencv.org/。官网下载提取后会得到两个文件夹:build和sources。我们需要用到的是sources,用CMake重新编译sources里的内容,再添加contrib库。build里的内容是官网已经编译好的,有其他博客是讲利用build安装的,而这里我们并未用到。opencv也可从GitHub下载https://github.com/opencv/opencv,这是源码,相当于前述的sources文件夹。
2. CMake是用来编译源码的,官网下载https://cmake.org/。我使用的是。使用CMake除了要opencv编译源码,还有一个原因是:opencv3.1版本只能调试x64,不能调试x86。也就是说要在32位环境下调试,需要自己用CMake重新编译源码。
3. contrib库。官网上的opencv3.1包含的是稳定的核心库,而一些不稳定的放到了contrib中。GitHub下载https://github.com/opencv/opencv_contrib。解压后,我们用到的是modules文件夹。
4. 看见文件里有解压包时,不要轻易打开。
开始:
1. 文件夹路径,这个随自己设置就行。我将准备内容里的东西都放在了D:\BUILD(以下都用#\代替)里,新建一个myopencv文件夹,来装经CMake编译后的内容,会得到如下图的形式:
2. 在CMake编译opencv源码时,需要下载几个文件,但一般很难下载而导致编译失败,所以直接将其拷到文件夹中。链接:http://pan.baidu.com/s/1c18V9Ck 密码:bt7z。将downloads里三个文件夹中的文件拷贝到#\opencv\sources\3rdparty\ffmpeg下,会得到如下图的形式:
将ippicv_win文件夹拷贝到#\opencv\sources\3rdparty\ippicv下,同时修改downloader.cmake,以记事本形式打开,删掉末尾的“_icv_downloader()”
3. 在#\CMake\bin下打开cmake-gui.exe。在where is the source code输入 #\opencv\sources,在where to build the binaries输入 #\myopencv。会得到如下图的形式:
然后点击Configure,会出现编译器选择对话框
选择Visual Studio 14 2015,这个编译之后opencv3.1就能在x86(win32)环境下调试了。Visual Studio 14 2015 Win64对应的是x64。然后就是等待出现Configuring done,如下图。
然后Search找到OPENCV_EXTRA_MODULES_PATH,输入#\opencv_contrib_master\modules。再次点击Configure,等出现Configuring done后,点击Generate,之后会出现Generating done。到此为止编译的工作已经完成了。
4. 在#\myopencv下找到OpenCV.sln文件,打开它。初始化之后右键 解决方案‘OpenCV’,选择重新生成解决方案。这是在Debug、win32环境下生成的。此过程时间较长。然后找到CMakeTargets文件夹下的INSTALL文件,如下图:
右键->仅用于项目->仅生成INSTALL。然后在#\myopencv下就会有一个install文件夹。
5. 配置环境变量。
环境变量设置。变量名:OPENCV;值:#\myopencv\install。
用户变量设置。path下添加:#\myopencv\install\x86\vc14\bin。
6. 打开vs2015,新建一个工程。在属性管理器里找到Microsoft.Cpp.Win32.uesr,如下图:
右键->属性,会弹出对话框。找到通用属性->VC++目录,如下图:
在包含目录里添加:
#\myopencv\install\include
#\myopencv\install\include\opencv
#\myopencv\install\include\opencv2
在库目录里添加:
#\myopencv\install\x86\vc14\lib
找到链接器->输入->附加依赖项,如下图:
在附加依赖项中添加内容(就是#\myopencv\install\x86\vc14\lib文件夹里面的lib文件,对照着添加就行):
opencv_bgsegm310d.lib
opencv_bioinspired310d.lib
opencv_calib3d310d.lib
opencv_ccalib310d.lib
opencv_core310d.lib
opencv_datasets310d.lib
opencv_dnn310d.lib
opencv_dpm310d.lib
opencv_face310d.lib
opencv_features2d310d.lib
opencv_flann310d.lib
opencv_fuzzy310d.lib
opencv_highgui310d.lib
opencv_imgcodecs310d.lib
opencv_imgproc310d.lib
opencv_line_descriptor310d.lib
opencv_ml310d.lib
opencv_objdetect310d.lib
opencv_optflow310d.lib
opencv_phase_unwrapping310d.lib
opencv_photo310d.lib
opencv_plot310d.lib
opencv_reg310d.lib
opencv_rgbd310d.lib
opencv_saliency310d.lib
opencv_shape310d.lib
opencv_stereo310d.lib
opencv_stitching310d.lib
opencv_structured_light310d.lib
opencv_superres310d.lib
opencv_surface_matching310d.lib
opencv_text310d.lib
opencv_tracking310d.lib
opencv_ts310d.lib
opencv_video310d.lib
opencv_videoio310d.lib
opencv_videostab310d.lib
opencv_xfeatures2d310d.lib
opencv_ximgproc310d.lib
opencv_xobjdetect310d.lib
opencv_xphoto310d.lib
至此,已经完成了所有工作。
测试:
重启电脑,验证一下是否已经OK。下面给出两个代码:
1. 第一个是显示一幅图像。将图像放到所建的工程里
#include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { // 读入一张图片(游戏原画) Mat img = imread("灯.jpg"); // 创建一个名为 "游戏原画"窗口 namedWindow("游戏原画"); // 在窗口中显示游戏原画 imshow("游戏原画", img); // 等待6000 ms后窗口自动关闭 waitKey(6000); }
显示结果为:
2. SIFT算法
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/xfeatures2d.hpp> using namespace cv; using namespace std; int main() { //Create SIFT class pointer Ptr<Feature2D> f2d = xfeatures2d::SIFT::create(); //读入图片 Mat img_1 = imread("4.jpg"); Mat img_2 = imread("5.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(600000); }
显示结果为: