本篇文章用来记录花一天时间将扩展模块加入opencv,为了避免大家迷路,特写此博客帮助大家顺利搞定opencv扩展模块
版本:VS2017、CMake3.12.3、OpenCV3.4.7
安装OpenCV时的环境配置以及扩展模块的编译对于多数新手来说都是令人头疼的问题,希望通过这篇文章可以帮助新手们一次搞定OpenCV的安装与扩展模块编译问题。
第一步:安装软件
1、安装VS(这里用的版本是VS2017),在微软官网可直接下载。
2、安装OpenCV,建议将扩展模块部分也一起下载。
-
需要登陆opencv官方github网站戳这里,打开页面点击上方
releases
-
找到要安装的opencv版本,先点击
Assets
,再选择Source code (Zip)
下载压缩包。
-
将压缩包(opencv-3.4.7)解压到指定路径下得到opencv源码
source
-
下载扩展模块,需要先找到
opencv_contrib
戳这里,同样点击releases
-
进入后选择与自己的opencv源码版本一致的opencv扩展模块点击
zip
下载压缩包
- 将压缩包(opencv_contrib-3.4.7)解压到指定路径下,建议和opencv解压缩后的文件放在同一个文件夹中。
点开文件夹的样子如下,其中modules
中存放着opencv中的扩展模块:
到此为止,我们的opencv及其扩展模块就安装完成了。
3、安装编译工具CMake
- 进CMake的官方网址下载即可。戳这里
要注意的是,选择的CMake版本要与opencv的版本兼容,这里选择的CMake版本为3.12.3,选择msi文件下载。
- 第一次进入会出现下面的弹窗,按如下勾选
其余出现的接受协议,存储路径等弹窗,就一路确定下来就好,这样就完成了CMake的安装。
第二步:编译OpenCV中的扩展模块
使用编译工具CMake,其界面如下所示
- 首先在CMake中添加源码地址与结果保存地址,结果保存地址可以自己创建,建议和OpenCV中的
source
建立在一个文件夹下,这里为build
文件夹。
- 点击
configure
,首次点击会要求选择VS版本(这里采用的是VS2017),按如下进行勾选:
- configure结束后如果没有出现报错,则点击
generate
,如果出现报错,需要先排除报错,可以先多试几次configure
,直到不报错。
- 添加扩展模块路径
在上方勾选框中找到如下所示的模块路径,将扩展模块中的modules
路径添加进去,将其上方的OPENCV_ENABLE_NONFREE
勾选上,将world
选项也勾选上,其余的可以先不动(按照默认)。
- 然后重新进行
configure
,直到上方勾选框全部变白,然后点击generate
,配置完成。 - 这时在build中找到
OpenCV.sln
打开
- 在资源管理器中找到
INSTALL
,右键点击生成(如果不是第一次就点击重新生成)
- 生成结束后,在build的文件夹下将会有一个新出现的
install
文件夹,这个文件夹就是最终得到的包含了扩展模块的opencv框架。
第三步:环境配置
配置OpenCV与VS2017
-
配置环境变量
-
找到CMake编译后的
\build\install\x64\vc15\bin
文件夹,复制其路径
-
找到本机的高级系统设置(在文件夹中右击此电脑选择属性可以找到),点击进入。
-
进入后点击环境变量然后找到
Path
系统变量,双击进入。
-
点击新建,将刚刚复制的路径粘贴进去,然后一路点击确定。
-
-
配置包含目录
-
打开VS2017,切换窗口为属性管理器
-
在属性管理器中按如下操作进入属性页
-
进入属性页后双击包含目录,点击右侧出现的角标进入编辑
-
进入后添加路径分别为编译生成的install下的几个文件夹,分别为
install\include
、install\include\opencv
、install\include\opencv2
,全部添加完成后点击确定。
-
-
配置库目录
- 进入属性页后双击库目录,点击右侧出现的角标进入编辑
- 进入后添加路径为编译后install下的文件夹
install\x64\vc15\lib
,添加完成后点击确定。
- 进入属性页后双击库目录,点击右侧出现的角标进入编辑
-
配置链接文件
打开属性页中链接器中的输入,将附加依赖项改为和自己的opencv版本匹配即可,完成后点击属性页下方的确定。例如:我用的opencv版本是3.4.7,则附加依赖项为opencv_world347d.lib
,具体可在install\x64\vc15\lib
中查看
第四步:测试扩展模块
这里以扩展模块中常用的xfeature2D
模块为例,调用包含其中的SIFT实现特征检测:
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
#include <opencv2/xfeatures2d/nonfree.hpp>
using namespace std;
using namespace cv;
int main() {
Mat src = imread("C:\\Users\\26839\\Pictures\\测试.png");
cv::Ptr<cv::xfeatures2d::SIFT>
sift = cv::xfeatures2d::SIFT::create();
std::vector<cv::KeyPoint> kp;
sift->detect(src, kp);
Mat res;
cv::drawKeypoints(src, kp, res);
imshow("input", src);
imshow("result", res);
waitKey(0);
return 0;
}
输出结果如下: