天天看点

OpenCV(六)细说HighGUI(创建窗口,载入图像,显示图像)

创建窗口 如何将一幅图像显示在屏幕上,在之前的学习中我们多次用到了函数cvNamedWindow()函数来实现这个功能。来看一下这个函数的定义:

int  cvNamedWindow(
     const char* name,
      int  flags=CV_WINDOW_AUTOSIZE
);
           

由此可见,这个函数接受两个参数,第一个参数用来表示窗口的名字,就是给新建的窗口起个合适的名字,这个名字显示在窗口的顶部,HighGUI的其他函数也是根据这个名字来调用该窗口。第二个参数是一个标志,用来表示是否需要窗口大小自动适应读入的图像大小。      注意第二个参数,其实它就只有两个值,一个是0,或者是保持默认设置CV_WINDOW_AUTOSIZE。设置成0的话,窗口的大小就不能自动调整了。      释放窗口也是十分简单,直接调用函数cvDestroyWindow()就可以,这个函数接受一个字符串参数,想必都能想到,这个字符串参数就是之前我们对窗口的起的名字。      在OpenCV中,窗口的引用是根据名称而不是一些句柄。句柄和窗口名称之间的转换都由HighGUI在后台处理,我们不必要太过关心。 不过HighGUI还是提供了以下函数: void* cvGetWindowHandle(const char* name); const char* cvGetWindowName(void* window_handle); 这些函数允许我们在OpenCV所使用的窗口名称与各个窗口系统所使用的窗口句柄之间进行转换。      如果想调整窗口的大小该怎么办呐?HighGUI提供了cvResizeWindow()函数。

void cvResizeWindow(
     const char*  name,
     int width,
     int height
);
           

载入图像 为了在窗口中显示图像,我们需要了解如何从磁盘中载入图像。OpenCV则提供了cvLoadImage()函数,如下:

IplImage* cvLoadImage(
     const char* filename,
     int iscolor = CV_LOAD_IMAGE_COLOR

);
           

打开一幅图像时,cvLoadImage()并不分析文件扩展名,而是通过分析图像文件的前几个字节来确定图像的编码格式。第二个参数iscolor有几个值可以选择。默认情况下,图像是以每个通道8位,3个通道的形式被读入;CV_LOAD_IMAGE_ANYDEPTH 非8位的图像;CV_LOAD_IMAGE_GRAYSCALE 图像强制转换单通道;CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYDEPTH 16位的彩色图像。  CV_LOAD_IMAGE_UNCHANGED 读入数据与原始图像通道数以及位数保持一致。 注意:当cvLoadImage()读入失败时,并不会产生运行时错误,而是返回一个空指针。 当想保存一幅图像时就要用到另外一个函数cvSaveImage(),看看它的定义:

int cvSaveImage(
     const char* filename,
     const CvArr* image

);
           

第一个参数表示文件名,其中后缀部分用来指定图像存储的编码格式。第二个参数指向要存储图像的数据。对于大部分文件格式,cvSaveImage()只能存储8位单通道或者8位3通道格式的图像。新的文件格式PNG,TIFF或者JPEG2000,允许存储16位甚至浮点型格式,同样也部分支持4通道格式(BGRA)的图像。存储成功时,返回1,否则返回0。 显示图像 显示图像其实也是十分简单了,只需要cvShowImage()函数就可以了。

void cvShowImage(
          const char* name,
          const CvArr* image

);
           

第一个参数用来指定显示图像的窗口,第二个参数指定要显示的图像。        让我们再来看一个比较重要的函数:cvWaitKey() 这个函数在一个给定的时间内(单位ms)等待用户按键触发,如果在给定的时间内用户按下了一个键,函数返回用户按下的键,否则,返回0,。具体使用如下:

while(1){
          if(cvWaitKey(100)==27)break;
}
           

在这个程序中,我们告诉OpenCV等待用户触发事件100ms,如果在100ms中没有用户触发,则继续循环;      cvWaitKey(),需要介绍的是:这个函数是可以接受0参数的,在这种情况下,cvWaitKey()会无限期等待,直到用户触发一个按键。