下面通过一个示例演示如何通过函数
cv2.witkey
实现交互功能。
【例1.3】在一个窗口内显示图像,并针对按下的不同按键做出不同的反应。
函数cv2.waitkey()能够获取按键的ASCⅡ码。例如,如果该函数的返回值为97,表示按下了键盘上的字母a键。通过将返回值与ASCⅡ码值进行比较,就可以确定是否按下了某个特定的键。例如,通过语句“返回值-97”就可以判断是否按下了字母a键。 Python提供了函数ord(),用来获取字符的ASCII码值。因此,在判断是否按下了某个特定的按键时,可以先使用ord()函数获取该特定字符的ASCI码值,再将该值与cv2.waitkey() 函数的返回值进行比较,从而确定是否按下了某个特定的键。这样,在程序设计中就不需要ASCⅡ值的直接参与了,从而避免了使用ASCII进行比较可能带来的不便。例如,要判断是否 按下了字母A键,可以直接使用“返回值ord('A')”语句来完成。
根据题目要求及以上分析,编写代码如下:
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo", lena)
key=cv2.waitkey ()
if key==ord('A'):
cv2.imshow("PressA",lena)
elif key==ord('B'):
cv2.imshow("PressB",lena)
运行上述程序,按下键盘上的A键或者B键,会在一个新的窗口内显示图像lena.bmp, 它们的不同之处在于:
- 如果按下的是键盘上的A键,则新出现的窗口名称为 Pressa,如图1-4的左图所示。
- 如果按下的是键盘上的B键,则新出现的窗口名称为 Press,如图1-4的右图所示。
从另外一个角度理解,该函数还能够让程序实现暂停功能。当程序运行到该语句时,会按 照参数 delay的设定等待特定时长。根据该值的不同,可能有不同的情况:
如果参数 delay的值为0,则程序会一直等待。直到有按下键盘按键的事件发生时,オ会执行后续程序。
如果参数 delay的值为一个正数,则在这段时间内,程序等待按下键盘按键。当有按下键盘按键的事件发生时,就继续执行后续程序语句;如果在 delay参数所指定的时间内 直没有这样的事件发生,则超过等待时间后,继续执行后续的程序语句。
【例1.4】在一个窗口内显示图像,用函数cv2. witkey实现程序暂停,在按下键盘的按键后让程序继续运行。
根据题目要求,编写代码如下:
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo", lena)
key=cv2.waitkey ()
if key!=-1:
print("触发了按键”)
运行上述程序,首先会在一个名为demo的窗口内显示lena.bmp图像。在未按下键盘上的 按键时,程序没有新的状态出现;当按下键盘上的任意一个按键后,会在控制台打印“触发了按键”。
在本例中,由于cv2. waitkeyoi函数的参数值是默认值0,所以在未按下键盘上的按键时,程序会一直处于暂停状态。当按下键盘上的任意一个按键时,程序中key=cv2.waitkey()下方的 语句便得以执行,程序输出“触发了按键”。
- destroy Window函数 函数cv2.destroyWindow()用来释放(销毁)指定窗口,其语法格式为:
None= cv2 destroywindow( winname)
其中, winname是窗口的名称.
在实际使用中,该函数通常与函数cv2.waitkey()组合实现窗口的释放。【例1.5】编写一个程序,演示如何使用函数cv2. destroy Window释放窗口。
根据题目要求,编写代码如下
import cv2
lena=cv2.imread("lena.bmp")
cv2.imshow("demo", lena)
cv2.waitkey()
cv2 destroyWindow("demo")
运行上述程序,首先会在一个名为demo的窗口内显示lena.bmp图像。在程序运行的过程 中,当未按下键盘上的按键时,程序没有新的状态出现;当按下键盘上的任意一个按键后,窗 口demo会被释放。
- destroyallwindows函数 函数cv2.destroyAllwindows()用来释放(销毁)所有窗口,其语法格式为:
None =cv2.destroyallwindows()
【例1.6】编写一个程序,演示如何使用函数cv2.destroyAllwindows()释放所有窗口。
根据题目要求,编写代码如下
import cv2
lena=cv2.imread("lena. bmp")
cv2.imshow("demol", lena)
cv2.imshow("demo2", lena)
cv2.waitkey()
cv2.destroyAllWindows()
运行上述程序,会分别出现名称为 demol和demo2的窗口,在两个窗口中显示的都是lena.bmp图像。在未按下键盘上的按键时,程序没有新的状态出现:当按下键盘上的任意一个 按键后,两个窗口都会被释放。
1.2.3 保存图像 OpenCV提供了函数cv2.imwrite(),用来保存图像,该函数的语法格式为:
retval = cv2.imwrite( filename, img[ ,params])
式中:
- retval是返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假( False).
- filename是要保存的目标文件的完整路径名,包含文件扩展名。
- img是被保存图像的名称。
- params是保存类型参数,是可选的。【例1.7】编写一个程序,将读取的图像保存到当前目录下。根据题目要求,编写代码如下:
import cv2
lena=cv2.imread("lena.bmp")
r=cv2.imwrite("result.bmp", lena)
上述程序会先读取当前目录下的图像lena.bmp,生成它的一个副本图像,然后将该图像以名称 result.bmp存储到当前目录下。
1.3 Opencv贡献库
目前, Opencv库包含如下两部分。
Opencv
主库:即通常安装的 Opencv库,该库是成熟稳定的,由核心的 Opencv团队 维护。Opencv
贡献库:该扩展库的名称为 opencv contrib,主要由社区开发和维护,其包含 的视觉应用比 Opencv主库更全面。需要注意的是, Opencv贡献库中包含非 Opencv 许可的部分,并且包含受专利保护的算法。因此,在使用该模块前需要特别注意。
Opencv贡献库中包含了非常多的扩展模块,举例如下。
- bioinspired:生物视觉模块。
- datasets:数据集读取模块。
- dnn:深度神经网络模块。
- face:人脸识别模块。
- matlab: MATLAB接口模块。
- stereo:双目立体匹配模块。
- text:视觉文本匹配模块。
- tracking:基于视觉的目标跟踪模块。
- Ximgpro:图像处理扩展模块。
- xobjdetect:增强2D目标检测模块。
- photo:计算摄影扩展模块。
可以通过以下两种方式使用贡献库:
- 下载 Opencv贡献库,使用 cmake手动编译。
- 通过语句 pip install opencv-contrib- python直接安装编译好的 Opencv贡献库。网页htts/pypi.org/ project/opencv- contrib- python/上提供了该方案的常见问题列表FAQ( Frequently Asked Questions),而且该FAQ是不断更新的。
joker-wt
扫码|关注我们
微信号|joker-wt123
新浪微博|梧tw桐
承蒙关照!!!
我的心愿是——世界和平