(一)OpenCv中HighGUI(图形用户界面)的简述 1--OpenCv中将与操作系统,文件系统和摄像机之间的硬件交互的一些函数纳入了HighGUI (high-level graphical user interface)高级图形用户界面的库中。有了HighGUI, 我们可以方便的打开窗口,显示图像,读出或者写入图像相关的文件(包含图像和视频), 处理简单的鼠标,光标,和键盘事件 2--也可以使用HighGUI创建其他很有用的控件,比如常见的滑动条,并且把它们加入到窗口, 如果对自己所使用的系统的图像用户界面非常熟悉,也许会认为HighGUI提供的很多功 能没有必要,但即使如此,HighGUI的跨平台性对你的帮助也会很大 3--OpenCv中的HighGUI可以分为三部分: 1---硬件相关部分 2---文件部分 3---图形用户界面部分 1---硬件部分最主要的----就是对于摄像机的操作,在大多数操作系统下,与摄像机交互是一 件很复杂并且痛苦的工作。HighGUI提供了一种从摄像机中获取图像的简单方法,所有 复杂的工作都在HighGUI内部完成 2---文件系统部分主要的工作就是载入与保存图像文件.HighGUI一个很好的特点就是可以用 与读取摄像机视频相同的方法读入视频文件。这使得我们可以省去处理从各种特定设备 中读入数据的麻烦 3---HighGUI的第三部分是窗口系统,或者成为GUI.HighGUI提供了一些简单的函数用来打开窗 口以及将图像显示在窗口中。它同时为我们提供了为窗口加入鼠标,键盘响应的方法,这些 函数为我们快速建立一个简单的应用程序提供了很大的帮助,一种变通的方式,我们可以使 用滑动条实现切换功能.我们发现使用HighGUI可以实现很多使用的程序 (二)OpenCv的命名空间 1--OpenCv中的C++类和函数都是定义在命名空间cv之内的 2--一般在写一个简答的OpenCv应用程序的时候,以下这三句是标配: 1--#include<opencv2/core/core.hpp> //OpenCv中的核心模块,包括基本的数据结构和类型等 2--#include<opencv2/highgui/highgui.hpp> 3--using namespace cv; (三)图像的载入与显示的概述 1--在OpenCv2中,最简单的图像载入和显示最需要两句代码,非常便捷.这两句代码分别对应两个 函数,它们分别是imread()以及imshow() 2--图像的载入: Mat imread("图片的路径名",载入表示,它指定一个加载图片的颜色类型); 3--图像的显示: void imshow("要显示的窗口标识",要显示的图像); (四)关于InputArray类型和创建窗口 1--我们可以把InputArray简单的当做Mat类型即可 2--创建窗口:namedWindow()函数 namedWindow("被用作窗口的标识符的窗口名称",窗口的标识); 1--WINDOW_NORMAL----设置这个值,用户可以改变窗口的大小 2--WINDOW_AUTOSIZE--设置这个值,窗口的大小会自动的调整以适应显示的图像 3--WINDOW_OPENGL----设置这个值,窗口创建的时候会支持OpenGl (五)输入图像到文件imwrite()函数 1--在OpenCv中,输出图像到文件一般采用imwrite函数,它的声明如下所示: bool imwrite("填写需要写入的文件名.jpg",InoutArray img,一般不需要填写); 2--imwrite函数,用于将图像保存到指定的文件,图像格式是基于扩展名的 (六)waitKey()函数详解 1--waitKey()--这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环) 2--如下所示: while(1){ if(waitKey(100)==27)break; } 在这个程序中,我们告诉OpenCv等待用户触发事件,等待时间为100ms,如果在这个时间段内, 用户按下ESC(ASCII码为27),则跳出循环,否则,则跳出循环 3--如果设置waitKey(0),则表示程序会无限制的等待用户的按键事件 (七)滑动条的创建和使用 1--滑动条(Trackbar)是OpenCv动态调节参数特别好的一种工具,它依附于窗口而存在 2--创建滑动条createTrackbar()函数: 1--createTrackbar函数用于创建一个可以调节整数值的滑动条,并将滑动条附加到指定 的窗口上,使用起来很方便。但需要记住,它往往会和一个回调函数配合起来使用 2--int createTrackbar("滑动条的名字","附加到窗口的名字",int* value,int count, TrackbarCallback onChange=0;void userdata=0) 3--int* value--一个指向整形的指针,表示滑块的位置;在创建滑块是,滑块的初始 位置就是该变量当前的值 4--int count--滑块可以到达的最大位置 5--TrackbarCallback onChange=0----这是一个指向回调函数的指针,每次滑块位置 改变时,都会调用这个函数,并且这个函数的原型必须为void XXXX(int,void*) 1--其中第一个参数是轨迹的---位置 2--第二个参数是---用户数据
/********************************************************************************************* 程序功能: 滑动条的创建和使用 编写环境: OpenCv2.4.8+VS2010 地点时间: 陕西师范大学 2016.4.26 作者信息: 九月 **********************************************************************************************/ /***********************************【函数的头文件和命名空间】********************************/ #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> using namespace cv; /******************************************【宏定义】****************************************/ #define WINDOW_NAME "【线性混合示例】" /***************************************【全局变量声明部分】**********************************/ const int nMaxAlphaValue=100; //Alpha的最大值 int nAlphaValueSlider; //滑动条对应的变量 double dAlphaValue; double dBetaValue; //声明存储图像的变量 Mat srcImg1; Mat srcImg2; Mat dstImg; /***************************************【全局函数声明部分】**********************************/ void trackBar(int,void*); /********************************************【main函数】*************************************/ int main(int argc,char** argv) { //【1】载入两幅带有Alpha通道的图片 srcImg1=imread("D:\\17.png",CV_LOAD_IMAGE_COLOR); srcImg2=imread("D:\\18.png",CV_LOAD_IMAGE_COLOR); //【2】设置滑动条的初始位置为50 nAlphaValueSlider=50; //【3】创建一个窗体 namedWindow(WINDOW_NAME,WINDOW_NORMAL); //【4】在创建的窗体中创建一个滑动条 createTrackbar("透明值",WINDOW_NAME,&nAlphaValueSlider,nMaxAlphaValue,trackBar,0); //结果在回调函数中显示 trackBar(nAlphaValueSlider,0); //按任意键退出6 waitKey(0); return 0; } /*************************************************************************************************** 函数功能: 响应滑动条的回调函数 函数参数: 1---int------滑动条的位置 2---void*----用户数据 函数返回值: 无 ***************************************************************************************************/ void trackBar(int,void*) { //求出Alpha值相对于最大值的比例 dAlphaValue=(double)nAlphaValueSlider/nMaxAlphaValue; //beta值为1减去alpha值 dBetaValue=(1.0-dAlphaValue); //根据alpha和beta的值进行现行混合 addWeighted(srcImg1,dAlphaValue,srcImg2,dBetaValue,0.0,dstImg); //显示效果图 imshow(WINDOW_NAME,dstImg); }