我做了一个简单的代码,当提示按“s”时从我的网络摄像头拍摄快照,如果我按“q”则退出。代码运行良好,但用于退出部分的elif语句被忽略。
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()
我也试过交换它们的顺序,if语句是'q'条件,elif语句是's',第二个语句总是被跳过的。更新:只有当我按住q一段时间它才能工作为什么它不能正常工作?
2条答案
按热度按时间rjee0c151#
我从评论中了解到,这个问题是由waitKey延迟引起的。所以为了修复它,我把按下的按钮放进一个变量中,并将条件语句与该变量进行比较。
pcww981p2#
该问题 * 不是 * 由任何延迟引起,也不是由任何阻塞引起。
cap.read()
返回新帧后,可能会有按键事件等待,因为您按下了某些按键。每个
waitKey()
使用一个按键事件,如果有按键事件,则返回该事件。如果您按下了某个键,第一个
waitKey()
就会接收到该事件,如果按错了键,if
就不会运行相应的代码。然后,第二个
waitKey()
没有要处理的键事件,因此返回-1。如果您 * 按住键 *,您可能有机会创建足够多的按键事件,使其中一个事件进入第二个
waitKey()
。正确的解决方案是每个循环调用
waitKey()
一次,并将其返回值存储在变量中。然后,您可以根据自己喜欢的任意多个关键代码测试该变量。
&0xFF
的东西是多余的,而且自2016年以来就过时了。waitKey()
已经这样做了。它是多余的。