一、简介
OpenCV (Open Source Computer Vision)是由intel建立的计算机视觉开源库,充分的使用c/c++编写,提供c++,c,python和Java接口,支持Windows,Linux,Mac OS,iOS和Android系统,基于BSD许可发行,学术用商用都可以,在世界范围内得到广泛的应用。参加CVPR的研究人员也通常选用OpenCV库,也因此OpenCV会及时的收录一些CVPR上先进的算法。
OpenCV官方网站:http://opencv.org
二、下载
OpenCV下载:http://opencv.org/downloads.html
OpenCV同时在更新2.4.x版本和3.x版本,目前最新的分别是2.4.13和3.1,根据官方ChangeLog的说法,version 3 比version 2.4 有更多的GPU加速功能,而且拥有更加透明的接口(通过把OpenCL的核心整合进OpenCV的API里),如不需要在指定是cv::ocl::canny还是cv::gpu::canny,只需写cv::canny,具体参见:https://github.com/opencv/opencv/wiki/ChangeLog
version 3 也把很多好的高级的算法整合在opencv_contrib,下载https://github.com/opencv/opencv_contrib,这部分是以源码的形式给出,需要自己make,这部分以后再说。
本着赶时髦的原则,你可以选用version 3.1.0,也可以用version 2.4.13。值得一提的是,version 2.4.13的pre-build lib只提供vc11(VS2012)和vc12(VS2013),version 3.1.0的pre-build lib只提供vc12(VS2013)和vc14(VS2015),其他版本的VS若要使用则需要自己CMake,同样,version 3.1.0是不提供x86(32位)版本的,如果不想自己make,请根据自己的VS版本选择相应的OpenCV版本。
附 vc与vs版本对照:
vc6 - vc 6.0
vc7 - vs 2002
vc7.1 - vs 2003
vc8 - vs 2005
vc9 - vs 2008
vc10 - vs 2010
vc11 - vs 2012
vc12 - vs 2013
vc13 - vs 2014
vc14 - vs 2015
后续以以下版本为示例,配置方法是相通的:
操作系统:Windows 10
IDE:Visual Studio 2015 Community https://www.visualstudio.com/zh-hans/vs/community/
OpenCV版本:3.1.0 (也会涉及2.4.13)
三、配置
1.安装OpenCV
下载完之后是一个exe文件,本质是一个解压程序,选好解压后的路径就行,如图:
解压后的文件结构如下:
包含pre-build的lib和source code,可以直接使用pre-build库,也可以通过source code自己make,方便起见先用pre-build。
点开build文件夹
x64对应64位,x86对应32(version 3.1.0是没有x86的)
可以看出3.1的pre-build lib支持vs2013和2015,2.4.13的pre-build lib是不支持vs2015的,需要自己make。(vc与vs版本对照见上)
在下一级目录就是接下来配置环境变量要用到的bin目录以及lib目录
2.4.13版本还提供静态链接库
2.配置环境变量
配置环境变量的目的是为了让vs能找到你所用的库,环境变量在我的电脑->属性->高级系统设置->环境变量,找到path选项,编辑,在变量值内填入所需要的bin所在的路径,以你自己的bin所在路径为准,不要复制别人的路径,以下以3.1版本x64适用vs2015的bin路径为例:
C:\opencv\opencv3.1.0\build\x64\vc14\bin
如果你是vs2013和opencv2.4.13,那就添加 C:\opencv\opencv2.4.13\build\x64\vc12\bin,如果要用x86,那就添加x86路径 C:\opencv\opencv2.4.13\build\x86\vc12\bin,多个路径间用英文分号(;)隔开。
保存好环境变量后,可能需要重启计算机来使环境变量生效,但这一步不是必须的。再次说明下环境变量path的含义,系统执行用户命令时,如果没有给出绝对路径,会先在当前目录下找可执行文件,如果找不到,则会依次在path保存的路径下查找。
3.在vs2015中使用OpenCV
首先新建一个c++ 控制台项目,打开项目的属性页,选择vc++目录,值得注意的是,要注意当前项目的配置
debug(调式)模式和release(发布)模式用到的库是不一样的,因此需要单独配置,程序最后是要以release模式发布的,因此我们把debug和release模式均配置好。
1)先配置debug模式:
a.填好包含目录,include文件在opencv\build文件夹下,建议通过输入框右边的...来手动选择include所在的目录,不要复制别人的路径,不要复制别人的路径,不要复制别人的路径:
由于后续版本为了兼容1.x版本,保留了1.x版本的c接口,因此include文件夹下有opencv和opencv2,图个方便把这些都包括进去
b.接下来填库目录,库(lib)在刚刚配置环境变量的bin同级目录下,选择依据跟bin一样,这里用x64的vc14,也是手动选择为好,确保路径正确:
c.在链接器->输入->附加依赖项下填入刚刚lib文件夹里的lib文件名,这里需要讲解一下lib文件名,3.1.0的lib下只有两个,因为3.0开始整合成一个库,好处是方便使用,坏处就是无法自由选择。
目前配置的是debug模式,因此把带d的opencv_world310d.lib填入附加依赖项:
2.4.13下的lib有很多,基本是依据OpenCV模块化的结构生成的,下面简单介绍下各个lib的功能(这对3.1是通用的,即使3.1全封装成了一个lib,但模块结构还是没变的)
命名方式:opencv_+模块名称+版本号+是否debug.lib
模块名称和功能:
- core---------定义基本数据结构,包括稠密多维数组Mat,以及其他模块会用到的一些基本功能
- imgproc----图像处理模块,包括线性非线性滤波,图像几何变换(放大缩小、放射变换、透视变换等),颜色空间转换,直方图等等
- video-------视频分析模块,包括运动估计,背景差分,物体跟踪相关算法等
- calib3d-----基础的多视角几何算法,单个、立体相机标定,物体姿态估计,立体匹配算法,3D重建等
- features2d-显著特征的检测、描述和匹配
- objdetect--物体检测以及一些预定义好的分类器(例如,人脸,人眼,杯子,人体,车辆等等)
- highgui-----包含视频捕获、图片视频编解码以及一些简单的UI功能的接口
- gpu----------gpu加速算法
- flann--------快速近似最邻近搜索模块
- ml-----------机器学习模块(包含一些机器学习方法)
- photo-------计算摄影模块
- stitching----图像拼接模块
- nonfree-----不是免费的模块,被申请专利保护
- contrib------别人贡献的或是试验性的算法
- legacy------被弃用的一些东西
- ocl-----------opencl加速模块
- superres---超分辨率模块
- viz-----------3D可视化模块
了解模块功能对头文件的选择也是有帮助的
如果使用2.4.13,就可以根据自己的需求添加相应的lib,注意版本号,是否带d
2)接着配置release模式
配置栏选择Release
a.同样添加好包含目录和库目录(同debug模式)
b.添加链接器->输入->附加依赖项,注意release用不带d的lib
如果使用2.4.13版本同样选择lib下不带d的lib,添加进来即可
四、欢迎进入OpenCV的世界
小程序
下面开始编写我们的第一段OpenCV程序,一个简单的读取图片功能,同时也检验一下配置是否正确
(以下示例均使用c++类型接口,不涉及c接口)
// Author Mrwrichard
// Date 2016.10.04
#include <opencv2\opencv.hpp> ///< 按需要添加相应的头文件
#include <opencv2\core.hpp>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\highgui.hpp>
#include <iostream>
using namespace std;
using namespace cv; ///< c++类型接口全在cv命名空间下,
// 可以 using cv:: 或者using namespace cv
int main()
{
Mat m_image = imread("lena.jpg"); ///< 读取一张图片,这里lena.jpg放在vcxproj同级目录下
if (!m_image.empty()) { ///< 判断一下图片读取是否成功
imshow("hello opencv", m_image); ///< 显示图片,第一个参数为窗口名称
}
else {
cout << "can't read image..." << endl;
}
waitKey(0); ///< 键盘响应,0表示阻塞
return 0;
}
讲解
Mat imread( const String& filename, int flags = IMREAD_COLOR )
- \*.bmp,\*dib
- \*.jpeg, \*.jpg, \*.jpe
- \*.jp2
- \*.png
- \*.webp
- \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm
- \*.sr, \*.ras
- \*.tiff, \*.tif
- \*.exr
- \*.hdr, \*.pic
- Raster and Vector geospatial data supported by Gdal
//! Imread flags
enum ImreadModes {
IMREAD_UNCHANGED = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
IMREAD_GRAYSCALE = 0, //!< If set, always convert image to the single channel grayscale image.
IMREAD_COLOR = 1, //!< If set, always convert image to the 3 channel BGR color image.
IMREAD_ANYDEPTH = 2, //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
IMREAD_ANYCOLOR = 4, //!< If set, the image is read in any possible color format.
IMREAD_LOAD_GDAL = 8, //!< If set, use the gdal driver for loading the image.
IMREAD_REDUCED_GRAYSCALE_2 = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
IMREAD_REDUCED_COLOR_2 = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
IMREAD_REDUCED_GRAYSCALE_4 = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
IMREAD_REDUCED_COLOR_4 = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
IMREAD_REDUCED_GRAYSCALE_8 = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
IMREAD_REDUCED_COLOR_8 = 65 //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
};
void imshow(const String& winname, InputArray mat);
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE)
//! Flags for cv::namedWindow
enum WindowFlags {
WINDOW_NORMAL = 0x00000000, //!< the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size.
WINDOW_AUTOSIZE = 0x00000001, //!< the user cannot resize the window, the size is constrainted by the image displayed.
WINDOW_OPENGL = 0x00001000, //!< window with opengl support.
WINDOW_FULLSCREEN = 1, //!< change the window to fullscreen.
WINDOW_FREERATIO = 0x00000100, //!< the image expends as much as it can (no ratio constraint).
WINDOW_KEEPRATIO = 0x00000000 //!< the ratio of the image is respected.
};
int waitKey(int delay = 0);
结果
厉害了
OK,配置完成,后面就可以利用OpenCV完成更复杂的任务了。