highgui(全称:high-level graphical user interface)是一个可移植的图像工具包。通过highui, opencv将与操作系统、文件系统和摄像机之类的硬件进行交互。有了highgui,我们可以很方便的打开窗口、显示图像、读出或者写入图像相关的文件、处理简单的鼠标、光标和键盘事件。当然也可以用highgui创建一些很有用的控件-滑动条,并把它们加入窗口。
highgui可分为三部分:硬件相关部分、文件部分以及图像用户界面部分。硬件部分最主要的就是对于摄像机的操作;文件系统的主要工作是载入与保存图像文件。我们可以很方便的读取、写入视频或图像文件。窗口部分提供了为窗口加入鼠标、键盘响应的方法,也可以通过滑动条实现切换等功能。下面我将会对highgui中的主要函数功能及用法详细讲解。由于现在opencv大部分是面向对象c++开发的,在讲到一些函数功能时我将c++和c中的不同命名和功能分别列出,仅供大家对比。其实我们通过总结规律可以看出,在一些相同功能的函数中,命名字符中C比C++多出CV两个字符。
1 创建与关闭窗口(create a window and close the window)
C++: void namedWindow(const string &winname,int flags=WINDOW_AUTOSIZE)
C : int cvNamedWindow(const char *name,int flags=CV_WINDOW_AUTOSIZE)
参数解释:
name:窗口名字
flags :默认值为0,即为WINDOW_AUTOSIZE,此时HIGHGUI会根据图像的大小调整窗口大小,用户没办法手动调整窗口大小。 WINDOW_NORMAL ,值为1,此时用户可以手动调整窗口大小
如果一个相同的窗口名字已经定义,那么这个函数不起作用了。
另外我们可以通过c++:destoryWindow(const string &winname) or destoryAllWindow();
c: cvDestoryWindow(char *name)orcvDestoryAllWindow来关闭窗口,释放内存。
当然,对于一个简单的程序来讲,可以不用调用关闭窗口函数,因为当OS退出时,窗口应用和所有的资源会自动关闭,可是这真的是一个非常不好的习惯,不建议大家这么做。
2 移动与调整窗口(move the window and resize the window)
C++ : void moveWindow(const string &winname,int x,int y)
C : void cvMoveWindow(char *name,int x,int y)
参数解释:
winname : 窗口名字
x :窗口的x坐标
y :窗口的y坐标
C++: void resizeWindow(const string &winname,int width,int height)
C : void cvResizeWinow(const char *name,int width,int height)
参数解释:
winname: 窗口名字
width :新窗口的宽度
height :新窗口的高度
3 载入、保存与显示图像文件(load an image、 save an image or show an image from a file )
载入: C++: Mat imread(const string &filename,int flag=1)
C : IplImage *cvLoadImage(const char *filename,int iscolor=CV_LOAD_IMAGE_COLOR)
参数解释:
filename : 加载的文件名
flag(iscolor) : 默认值为1,即 CV_LOAD_IMAGE_COLOR 意味着将以3通道的形式加载图像,这里不管要是加载的图像是否为单通道或者三通道,都以3通道形式加载。
flag(iscolor) | 函数功能 |
CV_LOAD_IMAGE_COLOR | 以3通道的形式加载图像,不论原使图像是否为3通道,深度8位 |
CV_LOAD_IMAGE_GRAYSCALE | 以灰度图的形式加载图像,转为单通道 |
CV_LOAD_IMAGE_ANYDEPTH | 用来读入非8位图 |
CV_LOAD_IMAGE_ANYCOLOR | 以保持原始图像通道数的方式读入 |
CV_LOAD_IMAGE_UNCHANGED | 读入数据与原始图像通道数以及位数保持一致 |
保存:
C++: bool imwrite(const string &filename,InputArray img,const vector
C : int cvSaveImage(const char *filename,const CvArr *image,const int * params=0)
参数解释:
filename:文件名字
images:保存的图片
需要注意的是:只能存储8位单通道或者8位3通道格式的图像,PNG,TIFF或者JPEG2000允许存储16位甚至浮点类型格式。存储成功返回1,否则返回0;
显示:
C++: void imshow(const string &winname,IputArray mat)
C : cvShowImage(const char *name,const CvArr * image)
参数解释:
winname: 窗口名字
image : 窗口图像
4 WaitKey:
C++: waitKey(int delay=0)
C : cvWaitKey(int delay=0)
delay:delay in milliseconds. 0 is the special value that means "forever"
当delay<=0时:会无限期地等待,直到用户触发一个按键。
当delay>0时:会延迟delay ms.
经典应用:
while(1){
if(waitKey(100)==27)
break;
}
5鼠标事件
与键盘事件响应不同,鼠标事件响应采用回调函数的方式来处理。为了可以响应鼠标点击事件,首先必须创建一个回调函数,是鼠标点击事件发生时opencv可以调用这个函数。
回调函数calback可以是满足制定输入参数以及返回参数类型的任何函数。我们需要告诉回调函数触发的事件以及触发位置。函数还需要被告知用户是否再出发鼠标事件是同时触发了shift或者alt等键。
回调函数格式:
void CvMouseCallback(int event,int x,int y,int flags,void * param)
参数解释: event可以为:
事件名称 | 数值 |
CV_EVENT_MOUSEMOVE | 0 |
CV_EVENT_LBUTTONDOWN | 1 |
CV_EVENT_RBUTTONDOWN | 2 |
CV_EVENT_MBUTTONDOWN | 3 |
CV_EVENT_LBUTTONUP | 4 |
CV_EVENT_RBUTTONUP | 5 |
CV_EVENT_MBUTTONUP | 6 |
CV_EVENT_LBUTTONDBLCLK | 7 |
CV_EVENT_RBUTTONDBLCLK | 8 |
CV_EVENT_MBUTTONDBLCLK | 9 |
第二个以及第三个参数会被设置成事件发生时鼠标位置的x,y坐标,这些坐标代表窗口中图像的像素坐标,与窗口的大小没有关系。
第四个参数flags,每一位指定了在事件发生时的不同状态,例如:CV_EVENT_FLAG_SHIFTKEY的值为16,如果想知道shift键是否被触发我们可以用flags与位掩码(1<<4)求与。
下表为flags可以取的值:即鼠标事件名称
标志名称 | 数值 |
CV_EVENT_FLAG_LBUTTON | 1 |
CV_EVENT_FLAG_RBUTTON | 2 |
CV_EVENT_FLAG_MBUTTON |
4 |
CV_EVENT_FLAG_CTRLKEY |
8 |
CV_EVENT_FLAG_SHIFTKEY |
16 |
CV_EVENT_FLAG_ALTKEY |
32 |
下面需要注册回调函数到opencv中,实现注册函数时
C : void cvSetMouseCallback(const char * window_name,CvMouseCallback on_mouse,void * param=null)
C++ : void setMouseCallback(const string& winname, MouseCallback onMouse, void* userdata=0 )
如果想具体了解鼠标事件是如何实现的,可以连接:http://download.csdn.net/detail/yuansanwan123/7085459
6 滑动条设置
HIGHGUI为我们提供了滑动条(trackbar)设置
C : int cvCreateTrackbar(const char * trackbar_name,const char * window_name,int * value,int count,CvTrackbarCallback on_change)
C++ : int createTrackbar(const string & trackbarname,const string &winname,int *value,int count,TrackbarCallback onChange=0,void *userdata=0)
参数解释:
trackbarname: 创建的滑动条名字
winname : 窗口的名字
value : 整数指针,当滑动条被拖动时,opencv会自动地将当前位置所代表的值传给指针指向的整数。
count : 滑动条所能代表的最大值
onChange : 为指向回调函数的指针,当滑动条被拖动时,回调函数会自动被调用。
同时,HIGHGUI提供了两个函数分别用来度区域设置滚动条的值,但需要提供滑动条和对应窗口名字
读取: C : int cvGetTrackbarPos(const char * trackbar_name,const char * window_name)
C++ : int getTrackbarPos(const string & trackbarname,const string & winname)
设置: C : void cvSetTrackbarPos(const char * trackbar_name,const char * window_name,int pos)
C++: void setTrackbarPos(cosnt string & trackbarname,cosnt string &winname,int pos)
同样,如果想具体了解滑动条的实现过程,可连接:
http://download.csdn.net/detail/yuansanwan123/7085581
好了,HIGHGUI最基本的部分就讲完了,下次我们开始对视频处理进行分析。