在if-elif判断中多次使用waitKey(),第二个按键检测总是失效
OpenCV按键检测异常:elif分支失效,仅长按按键才生效
我编写了一段简单代码,按下's'键时从摄像头拍摄快照,按下'q'键时退出程序。代码如下:
import cv2 cap = cv2.VideoCapture(0) counter = 0 while(True): ret, frame = cap.read() cv2.imshow('Webcam', frame) if (cv2.waitKey(1) & 0xFF) == ord('s'): print("s working") counter = counter + 1 cv2.imwrite("Snapshot_" + str(counter) + ".png", frame) elif (cv2.waitKey(1) & 0xFF) == ord('q'): print("q working") break cap.release() cv2.destroyAllWindows()
代码运行基本正常,但用于退出的elif语句始终被忽略。我尝试交换两个判断的顺序,无论哪个条件放在elif位置,都会被跳过。补充:只有长按'q'键时该功能才生效,请问这是为什么?
问题原因
你在if和elif分支中分别调用了一次cv2.waitKey(1),这会导致两次调用之间的按键输入被丢弃。第一次调用waitKey如果没捕获到目标按键,第二次调用时可能已经错过该按键的信号;只有长按按键时,第二次调用waitKey才刚好能捕获到持续的按键信号,所以功能才会生效。
解决方法
只调用一次cv2.waitKey(1),将返回的按键值存入变量,再基于这个变量完成所有按键判断:
import cv2 cap = cv2.VideoCapture(0) counter = 0 while(True): ret, frame = cap.read() cv2.imshow('Webcam', frame) # 仅调用一次waitKey,保存按键值供后续判断 key = cv2.waitKey(1) & 0xFF if key == ord('s'): print("s working") counter += 1 cv2.imwrite(f"Snapshot_{counter}.png", frame) elif key == ord('q'): print("q working") break cap.release() cv2.destroyAllWindows()
原理说明
cv2.waitKey(delay)会等待delay毫秒,返回按下按键的ASCII码;若等待时间内无按键输入,返回-1。原代码每次循环两次调用该函数,相当于要检测两次独立的按键输入,单次按键的信号只会被其中一次调用捕获,另一次调用就会错过信号,导致elif分支无法触发。提前保存按键值,能确保所有判断基于同一个按键输入,避免信号丢失。
内容的提问来源于stack exchange,提问作者UglyNoodle
相关产品推荐
相关产品推荐

