OpenCV也支持有限的界面编程,主要是针对窗口、控件和鼠标事件等,比如滑块。有了这些窗口和控件,可以更好地展现图像并调节图像的一些参数。这些界面编程主要由High-level GUI(高层次图形用户界面)模块支持。
在High-level GUI模块中,用于新建窗口的函数是nameWindow,同时可以指定窗口的类型。该函数声明如下:
namedWindow(winname[, flags]) → None
其中,参数winname表示新建的窗口名称,自己随便取;flags表示窗口的标识(一般默认为cv2.WINDOW_AUTOSIZE,表示窗口大小自动适应图片大小,并且不可手动更改;cv2.WINDOW_NORMAL表示用户可以改变这个窗口大小;cv.WINDOW_OPENGL窗口创建的时候会支持OpenGL)。
在High-level GUI模块中,用于显示窗口的函数是imshow,声明如下:
imshow(winname, mat) → None
其中,参数winname表示显示的窗口名,可以使用namedWindow函数创建窗口,如不创建,imshow函数将自动创建;image表示需要显示的图像。
根据图像的深度,imshow函数会自动对其显示灰度值进行缩放,规则如下:
(1)如果图像数据类型是8U(8位无符号),就直接显示。
(2)如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),那么imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0~255×256]映射到[0~255]。
(3)如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),那么imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[0~1]映射到[0~255](注意:原图像素值必须要归一化)。
需要注意的一点就是imshow之后必须有waitKey函数,否则显示窗口将一闪而过,不会驻留屏幕。waitKey函数声明如下:
waitKey([delay]) → retval
其中,参数delay表示一个延时值,单位为ms,默认为0,永久延时,一直等待,直到用户按键。如果在指定时间之前没有按下任何键,就返回-1;如果在指定时间之前按下任何键,就返回按键的对应值。
当delay≤0时,函数waitKey无限地等待一个键事件,当delay>0时,则等待delay毫秒。由于操作系统在切换线程之间有一个最短的时间间隔,因此该函数不会正好等待delay毫秒,而是等待比delay毫秒长一些,这取决于当时计算机上运行的其他操作。如果在指定时间之前没有按下任何键,就返回按下键的代码或-1。注意,此函数是HighGUI模块中唯一可以获取和处理事件的方法,因此需要定期调用它以进行正常的事件处理,除非HighGUI是在负责事件处理的环境中使用的。
另外,只有在至少创建了一个HighGUI窗口并且该窗口处于活动状态时该函数才起作用。如果有几个HighGUI窗口,那么其中任何一个都可以是活动的。
【例3.5】 新建窗口并显示5秒后退出
import cv2 as cv import numpy as np #导入numpy模块 img = cv.imread('p1.jpg') cv.namedWindow("myimg", cv.WINDOW_AUTOSIZE); cv.imshow("myimg",img);#在“窗口1”中输出图片 cv.waitKey(5000);#等待5秒,程序自动退出
在上述代码中,首先利用函数imread读取当前目录下的p1.jpg文件,接着用函数namedWindow新建一个窗口,并用参数WINDOW_AUTOSIZE表示窗口大小自动适应图片大小,并且不可手动更改;最后调用waitKey函数等待5秒后程序自动退出。
运行工程,结果如图3-6所示。
图3-6