细说opencv中的HIGHGUI结构(一)

      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¶ms=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
最后一个参数是一个void指针,可以以任何结构方式传递额外的参数信息。

下面需要注册回调函数到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最基本的部分就讲完了,下次我们开始对视频处理进行分析。











你可能感兴趣的:(opencv,机枪手opencv,opencv,highgui,图像窗口,鼠标滑动)