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函数的详细说明将在3.8节中详细介绍。
【例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