3.1.1 OpenCV的命名空间

OpenCV中的C++类和函数都是定义在命名空间cv之内的,有两种方法可以访问:第一种,是在代码开头的适当位置加上usingnamespace cv;这句代码,规定程序位于此命名空间之内:另外一种,是在使用OpenCV的每一个类和函数时,都加入cv::命名空间。不过这种情况会很繁琐,每用一个OpenCV的类或者函数,都要多敲四下键盘写出cv::。所以,推荐大家在代码开头的适当位置,加上usingnamespace cv;这句.
比如在写简单的OpenCV程序的时候,以F三句可以作为标配:
  #include <opencv2/core/core.hpp>
  #include<opencv2/highgui/highgui.hpp>
  using namespace cv;

3.1.2 Mat类简析

Mat类是用于保存图像以及其他矩阵数据的数据结构,默认情况下其尺寸为0.我们也可以指定其初始尺一寸,比如定义一个Mat类对象,就要写cv::Mat pic(320,640,cv:: Scalar( 100)):
Mat类型作为OpenCV2. OpcnCV3新纪元的重要代表,在稍后的章节中,笔者会花长篇幅详细讲解它,现在我们只要理解它是对应于OpenCV 1.0时代的Ipllmage,主要用来存放图像的数据结构就行了。对于本节,我们需要用到关于Mat的其实就简单的这样一句代码:
  Mat srcImage= imread("dota.jpg");
这表示从工程目录下把一幅名为dota. jpg的jpg类型的图像载入到Mat类型的srclmage变量中。对于这里的imread函数,用于将图片读入Mat类型中,会在下文进行详细剖析。而Mat类,也会在第4章中进行更加全面的讲解。

3.1.3图像的载人与显示概述

在新版本的OpenCV2中,最简单的图像载入和显示只需要两句代码,非常便捷。这两句代码分别对应了两个函数,它们分别是imread()以及imshow().

3.1.4图像的载人:imread()函数

首先来看imread函数,其用于读取文件中的图片到OpenCV中。可以在OpenCV官方文档中查到它的原型,如下。
  Mat imread(const string& filename,  intflags=1);
(I)第一个参数,const string&类型的filename,填我们需要载入的图片路径名。
(2)第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带默认值1,所以有时候这个参数在调用时可以忽略。
因为flags是int型的变量,若我们不在这个枚举体中取固定的值,可以这样进行:
 flags >0返回一个3通道的彩色图像:
 flags =0返回灰度图像:
 flags <0返回包含Alpha通道的加载图像。
经过上面详细的讲解,我们一起看几个载入示例,以便多方位地掌握imread函数的用法。
Mat image0=imread("1.jpg",2 I 4);//载入无损的源图像
Mat image1=imread("1.jpg",0);//载入灰度图
Mat image2=imread("1.jpg",199)://载入3通道的彩色图像

3.1.5图像的显示:imshow()函数

imshow()函数用于在指定的窗口中显示一幅图像,函数原型如下。
  void imshow(const string& winname,  InputArray mat):
  第一个参数:const string&类型的winname填需要显示的窗口标识名称。
  第二个参数:InputArray类型的mat,填需要显示的图像.

3.1.6关于InputArray类型

对于这里的InputArray类型,通过对InputArray转到定义,我们可以在core.hpp中查到一个typedef声明,如下:
  typedef const_ InputArray& InputArray;
这其实一个类型声明引用,就是说_InputArray和InputArray是一个意思,因此我们就来做最后一步:对InputArray进行转到定义,可以在core.hpp头文件中发现InputArray的真身。InputArray的源代码略显冗长,不在这里贴出,若读者自己去实践并通过转到定义的方法找到InputArray的真身,便可以着InputArray类的里面首先定义了一个枚举,然后是各类的模板类型和一些方法。而很多时候,遇到函数原型中的I nputArray/OutputArray类型,我们把它简单地当做Mat类型即可。

3.1.7创建窗口:namedWindow()函数

namedWindow函数用于创建一个窗口。若是简单地进行图片显示,可以略去namedWindow函数的调用,即先调用imread读入图片,然后用imshow充接指定出窗口名进行显示即可。但需要在显示窗口之前就用到窗口名时,比如我们后面会马上讲到滑动条的使用,要指定滑动条依附到某个窗口上,就需要namedWindow函数先创建出窗口,显式地规定窗口名称了。
namedWindow的函数原型如下:
  void namedWindow(const strings winname,int flags=WINDOW_AUTOSIZE);
(I)第一个参数,const string&型的name.填写被用作窗口的标识符的窗口名称.
(2)第二个参数,int类型的flags,窗口的标识,可以填如下几种值。
.WINDOW NORMAL,设置这个值,用户可以改变窗口的大小(没有限制)。
  OpenCV2中它还可以写为CV_ WINDOW_NORMAL.
.WINDOW AUTOSIZE,设置这个值,窗口大小会自动调整以适应所显示
  的图像,并且用户不能手动改变窗口大小。OpenCV2中它还可以写为
    CV WINDOW AUTOSIZE.
·WINDOW_OPENGL,设置这个值,窗口创建的时候会支持OpenGL.
  OpenCV2中它还可以写为CV_WINDOW_OPENGL.
首先需要注意的是,namedWindow函数有默认值WINDOW_ AUTOSIZE,所以,一般情况下,这个函数我们填一个变量就行了。named Window函数的作用是通过指定的名字,创建一个可以作为图像和进度条的容器窗口。如果具有相同名称的窗口己经存在,则函数不做任何事情.我们可以调用destroyWindow()或者destroyAl l Windows()函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间。
但是事实上,对于代码最不大的简单程序来说,我们完全没有必要手动调用上述的destroyWindow()或者destroyAll Windows()函数,因为在退出时,所有的资源和应用程序的窗口会被操作系统自动关闭.

3.1.8输出图像到文件:imwrite()函数

在OpenCV 中,输出图像到文件一般采用imwrite函数,它的声明如下.
  bool imwrite(const string& filename,InputArray img, const vector<int>¶ms=vector<int>());
(I)第一个参数,const string&类型的filename,填需要写入的文件名.注意要带上后缀,如“123.jpg "
(2)第二个参数,InputArray类型的img,一般填一个Mat类型的图像数据.
(3)第三个参数,const vector<int>&类型的params,表示为特定格式保存的参数编码。它有默认值vector<int>(),所以一般情况下不需要填写.而如果要填写的话,有下面这些需要了解的地方:
.对于JPEG格式的图片,这个参数表示从0到100的图片质量 (CV_IMWRITEwe_JPEG_QUALITY),默认值是95。
.对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNGCOMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,默认值是3。
.对于PPM, PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY ),取值为0或1,默认值是1。
imwrite函数用于将图像保存到指定的文件。图像格式是基于文件扩展名的,可保存的扩展名和imread中可以读取的图像扩展名一致。

3.2滑动条的创建和使用

滑动条(Trackbar)是OpenCV动态调节参数特别好用的一种工具,它依附于窗口而存在。
由于OpenCV中并没有实现按钮的功能,所以很多时候,我们还可以用仅含0-1的滑动条来实现按钮的按下、弹起效果。

3.2.1创建姗动条:createTrackbar()函数

createTrackbar函数用于创建一个可以调整数值的滑动条(常常也被称作轨迹条),并将滑动条附加到指定的窗口上,使用起来很方便。需要记住,它往往会和一个回调函数配合起来使用。先看下它的函数原型,如卜。
   C++: int createTrackbar(conststring& trackbarname,  conststring& winname,int*value, int count, TrackbarCallback onChange=0,void* userdata=0):
  .第一个参数,const string&类型的trackbarname,轨迹条的名字,用来代表我们创建的轨迹条。
  .第二个参数.const string&类型的winname,窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应named Window()创建窗口时填的某一个窗口名。
  .第三个参数,int*类型的value,一个指向整型的指针,表示滑块的位咒。在创建时,滑块的初始位置就是该变量当前的值。
  .第四个参数.int类型的count,表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0.
  ·第五个参数,TrackbarCallback类型的onChange.它有默认值0.这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int, void*);,其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,则表示没有回调函数的调用,仅第三个参数value有变化。
  .第六个参数,void*类型的userdata,也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。

3.2.2获取当前轨迹条的1-f_it:getTrackbarPos()函数

本小节介绍一个配合create丁rackbar使用的函数—getTrackbarPos(),它用于获取当前轨迹条的位置。
下面这个函数用于获取当前轨迹条的位置并返回。
  C++:int getTrackbarPos(conststrings trackbarname, conststring& winname);
  .第一个参数.const string&类型的trackbarname,表示轨迹条的名字.
  ·第二个参数,const string&类型的winname,表示轨迹条的父窗口的名称。

3.3鼠标操作

OpenCV中的鼠标操作和滑动条的消息映射方式很类似,都是通过一个中介函数配合一个回调函数来实现的。创建和指定滑动条回调函数的函数为createTrackbar,而指定鼠标操作消息回调函数的函数为SetMouseCallback。下面一起来了解一下它。
SetMouseCallback函数的作用是为指定的窗口设I及标回调舀数,原型如下。
  C++: void setMouseCallback(conststring& winname, MouseCallback onMouse,void* userdata=0》
 .第一个参数,const string&类型的winname.窗口的名字.
 .第二个参数,MouseCallback类型的onMouse.指定窗口里母次鼠标时间发生的时候,被调川的函数指针.这个函数的原型的大概形式为void Foo(intevent, int x, int y, int flags, void* param)。其中event是EVENT_+变量之一,x和y是鼠标指针在图像坐标系(需要注意,不是窗口坐标系)中的坐标值,flags是EVENT FLAG的组合,param是用户定义的传递到SetMouseCallback i数调用的参数。如EVENT MOUSEMOVE为鼠标移动消息、EVENT LBUTTONDOWN为鼠标左键按下消息等。
 .第三个参数,void*类型的userdata,用户定义的传递到回调函数的参数,有默认值0。