【OpenCV 初级】第一篇 OpenCV介绍与配置

一、简介

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;
}

一个简单的小程序,这里对程序做个简单讲解:

讲解

1.Mat:
        这是opencv2.0版本以来最基本最重要的一个数据结构,代表多维的单通道或多通道稠密数组,可以用来存储实数或复数向量和矩阵,灰度图或彩图,矢量场,点云,张量,直方图。Mat是一个c++ class,具体创建和使用方法(包括访问、运算等)以后再介绍。
2.
Mat imread( const String& filename, int flags = IMREAD_COLOR )
        这个函数从指定的文件中加载一幅图像,并返回保存图像数据的Mat,如果图像未能读取(可能是文件丢失,权限错误,opencv不支持或者是无效的格式)都会返回一个空的Mat(Mat::data=NULL);
        目前imread支持的格式如下:
  • \*.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
        注意不要但看文件扩展名,还是要依据图片真实的类型,在windows/Mac OSX下opencv封装了并且默认用libjpeg,libpng,libtiff和libjasper来编解码的,在Mac OSX下也是可以用原生的图片阅读器的,在Linux,类Unix的操作系统下是需要安装相关编解码包的,比如libjpeg-dev,而且在CMake的时候要勾上OPENCV_BUILD_3RDPARTY_LIBS。

        第一个参数是要加载的文件名,如果不给出绝对路径,则在当前目录下找,具体到VS的工程,会在项目配置文件.vcxproj同级目录下,给绝对路径的时候要注意Win下是以"\"为间隔符的,而在c/c++下"\"是强制换行或转义符的意思,因此在c/c++下"\\"表示"\"。
        第二个参数是读取方式,对应值在枚举量cv::ImreadModes里,下面给出
//! 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.
     };

3.
void imshow(const String& winname, InputArray mat);
          这个函数是在指定窗口显示一个图片,第一个参数是窗口名称,第二个参数是要显示的图片。
          通常在调用imshow之前需要用
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.
     };
         默认是WINDOW_AUTOSIZE,即图片尺寸多大,窗口就多大(受限于屏幕分辨率),其他情况则是图片会去适配窗口尺寸。
         如果imshow之前没有用namedWindow创建窗口,则默认以cv::WINDOW_AUTOSIZE创建窗口,如果显示的图片大于屏幕分辨率,则需要先调用namedWindow("", WINDOW_NORMAL);
         仅在windows上,可以通过Ctrl+C将图片复制到剪贴板上,通过Ctrl+S将打开一个对话框来保存图片。
         imshow后面必须跟着cv::waitKey,否则不会显示图片。
4.
int waitKey(int delay = 0);
         等待键盘事件,等待delay毫秒数,例如 waitKey(25)则是等待25ms,但0是一个特殊值,waitKey(0)意味着将永远等待下去。
         由于操作系统切换线程需要时间,因此waitKey并不是严格等待设定的毫秒数,而是至少等待设定的毫秒数。
         waitKey返回的是按键的Ascii码,如果在等待时间到仍没有按键按下则返回-1。
         waitKey是highgui中唯一可以获取和处理事件的,因此需要定期被调用,除非在其他的gui环境中。
         注意waitKey只有在至少有一个HighGUI窗口且这个窗口处于active时才有效,当有多个HighGUI窗口时任一个都可能是active的(即鼠标焦点窗口)。


结果

编译运行一下


厉害了

OK,配置完成,后面就可以利用OpenCV完成更复杂的任务了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值