OpenCV学习笔记(一)OpenCV4.0.1 +VS2015 环境搭建
引言
去年十一月,OpenCV4.0.0重磅发布。Release Note中介绍了OpenCV4.0 内含一些特别有用的新特性与新模块,感兴趣的可以直接通过官方文档查看。
很多像我一样的新手在配置OpenCV这一步就碰到了许多问题,因此这次我想以VS2015+OpenCV4.0.1+CMake 3.14.1为例简述一下OpenCV的环境搭建步骤,并通过自己的亲身经历提出一些问题的解决方案。
使用CMake/OpenCV_contrib编译的意义何在?
有的朋友可能会问了,为什么要使用Cmake+VS来编译OpenCV的源代码,而不是直接添加配置?contrib又是做什么的呢?
折腾这些操作其实是为了两点:
- 方便欣赏和调试opencv的源代码 。
- OpenCV有些扩展包放在了contrib中,如DNN识别、光流跟踪模块、AR增强现实模块等。为了使用这些包,我们需要自行把opencv和contrib一起编译。
OpenCV的下载、安装和配置
预准备:下载和安装开发环境
本人使用的是VS2015+OpenCV4.0.1+CMake 3.14.1。
OpenCV 4.0.1下载:https://github.com/opencv/opencv/releases/tag/4.0.1
OpenCV_contrib 4.0.1下载:https://github.com/opencv/opencv_contrib/releases/tag/4.0.1
CMake-gui 下载:https://cmake.org/download/
由于国内服务器访问GitHub不太稳定,下载contrib文件时速度很慢。特此推荐该博主上传到百度云的所有版本。
注意:OpenCV的版本和OpenCV_contrib的版本必须一致,不然CMake编译必定报错。
CMake配置与生成
1.设置解决方案的存放路径。将OpenCV、contrib文件分别安装和解压到指定位置(路径不要有中文,CMake不识别)。在OpenCV目录下创建一个新文件夹newbuild。
2.运行CMake,指定安装和存放路径。(本人使用的CMake 3.14.1)
点击左下方的configure,开始第一次编译。编译时会出现版本选择框,我们这里使用的VS2015 x64,选择Visual Studio 14 2015,x64平台。VS2017的应选择Visual Studio 15 2017,其它的按提示选择相应版本即可。
点击Finish后就会开始配置了。第一次配置之后,如果中间方框还存在红色,那就进行第二次配置,一直到方框内变白,Configuring done。然后,在OPENCV_EXTRA_MODULES_PATH下添加我们需要的contrib库。这里选中opencv_contrib下modules文件夹。
添加好库后,点击Generate,等待片刻。出现Generating done,方框内未出现红色,说明生成完毕。
CMake配置和生成中可能遇到的问题及解决方案
- CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
CUDA_nppi_LIBRARY (ADVANCED)
因为OpenCV 4.0.1不支持cuda9.0的架构,需要改一些配置文件。参考这篇博文,重新编译即可解决该问题。
还有一个简单粗暴的方法,不使用CUDA加速,直接把with CUDA的勾去掉。如下图所示。
- This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'create’.
该条不会影响编译生成的进程,只是对调用某些模块会产生影响。
这条警告是在所有工作完成后,在VS中对OpenCV测试时出现的问题。当时我想调用xfeature2D的SIFT模块,运行时出现该错误。产生错误的原因是许多算法如特征提取中的SIFT, SURF, Harris等受到专利保护。而CMake编译之前不会默认勾上OPENCV_ENABLE_NONFREE,这时我们需要手动勾上OPENCV_ENABLE_NONFREE。保证后续代码的良好运行。后来我也是重新编译生成了该模块才解决问题。
VS编译生成install
Generating done以后,我们可以打开解决方案存放路径的文件夹(这里为newbuild)。其中有个名为OpenCV.sln的解决方案文件,我们用VS2015打开它。
打开它以后,在右侧的解决方案资源管理器界面,找到CMakeTargets的INSTALL项目,右键生成。
这里生成时间较长,性能越好的电脑生成速度越快。一般在20分钟以上。
工程包含(include)目录的配置
- 打开或新建一个cpp源文件(具体步骤省略)
- 打开属性管理器(在界面的右方,解决方案资源管理的旁边。如果没有,在菜单栏单击【视图】——【属性管理器】即可)。
- 属性管理器根据Debug/Release以及32/64位版本划分了4类。Debug是调试版本,Release是发布版本。这里我们选择Debug| x64,右键【属性】。
- 在【通用属性】——【VC++目录】——【包含目录】下添加之前newbuild目录下编译生成的两个路径:D:\opencv4.0.1\opencv\newbuild\install\include及D:\opencv4.0.1\opencv\newbuild\install\include\opencv2。注意若opencv的安装路径不同,该路径要相应改变。
- 在【通用属性】——【VC++目录】——【库目录】下添加lib库目录,如下图所示。
- 在【链接器】——【输入】——【附加依赖项】下添加lib文件名。lib文件存放的路径为 D:\opencv4.0.1\opencv\newbuild\install\x64\vc14\lib。
可以看到,目录下的lib文件较多。如果一个个手输不仅效率低下,而且易出错。
这里有一个快速提取lib文件名的方法:
(1)Win+R 输入cmd打开命令提示符
(2)进入保存lib文件的路径
(3)输入命令dir /b *.lib>0.txt,即把所有lib文件名保存到该目录下的0.txt文件中。
把记事本里面的文件名全部复制,粘贴到附加依赖项就OK啦!
添加环境变量
以Win10为例,在【我的电脑】——【属性】——【高级系统设置】——【环境变量】中添加路径
大功告成!马上测试一下吧。以读取图像为例。
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char **argv){
char *filename = "D://Sources//kitty.jpg";
Mat img = imread(filename);
if (img.empty()) {
cout << "cannot load image!" << endl;
return -1;
}
char *winname = "Kitty image";
namedWindow(winname, WINDOW_AUTOSIZE);
imshow(winname, img);
waitKey(0);
return 0;
}
效果如下(切记一定选择x64,Debug版本。编译的是什么版本就用什么版本):
推荐资料
- OpenCV3编程入门_毛星云编著_电子工业出版
我的同院学长和班主任一起写的。内容详实,目前我还在学习参考中。 - OReilly.Learning.OpenCV.3
OReilly的经典书目,不必多说,英文好的可以直接啃。《学习OpenCV2》有中文版的,但是里面的语言用法太老了,不建议过多依赖。 - 图像处理、分析与机器视觉_Milan Sonka等著
我在图书馆借到了中文版,内容非常全面,适用于理论学习。