使用cv2.waitKey实现依赖前置按键输入的后续操作需求及问题
问题分析与解决方案
你的需求是按下s键执行完do stuff后,通过任意键或特定键触发do more some stuff,但当前两种实现都存在问题:
现有代码的问题
第一种用
input("Press any key to continue"):input()是终端输入阻塞逻辑,和OpenCV的waitKey()属于不同输入处理渠道。如果你的程序是基于OpenCV窗口的GUI应用,用户在窗口内按键不会被input()捕获,必须切换到终端操作,体验极差,还可能导致OpenCV窗口假死。第二种直接判断
kk == ord('c'):
此时kk的值是s的键码(ord('s')),不可能等于ord('c'),这个判断永远不会触发,根本等不到用户按c键。
正确实现方式
方式1:按任意键继续
执行完do stuff后,循环调用cv2.waitKey(),直到捕获到任意有效按键(waitKey()返回-1表示无按键输入):
import cv2 while True: kk = cv2.waitKey(1) # 处理窗口关闭事件,避免死循环 if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1: break if kk == ord('s'): # Do stuff print("执行完do stuff,按任意键继续") # 等待任意按键 while True: key = cv2.waitKey(1) if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1: break if key != -1: # Do more stuff print("执行do more some stuff") break
方式2:按特定键(比如c)继续
逻辑和上面类似,但只捕获指定按键:
import cv2 while True: kk = cv2.waitKey(1) if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1: break if kk == ord('s'): # Do stuff print("执行完do stuff,按c键继续") # 等待c键 while True: key = cv2.waitKey(1) if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1: break if key == ord('c'): # Do more stuff print("执行do more some stuff") break
注意事项
- 替换代码里的
my_window为你实际创建的OpenCV窗口名称(比如cv2.namedWindow("demo")里的demo)。 - 必须加入窗口关闭判断,否则关闭窗口后程序会持续运行死循环。
cv2.waitKey(1)的参数是等待时间(毫秒),1表示非阻塞式轮询,既不会卡住程序,又能响应按键和窗口事件。
内容的提问来源于stack exchange,提问作者aekiratli
相关产品推荐
相关产品推荐

