opencv 在if-elif测试中使用多个waitKey(),第二个键测试始终失败,即使按下该键也是如此

0yg35tkg  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(132)

我做了一个简单的代码,当提示按“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一段时间它才能工作为什么它不能正常工作?

rjee0c15

rjee0c151#

我从评论中了解到,这个问题是由waitKey延迟引起的。所以为了修复它,我把按下的按钮放进一个变量中,并将条件语句与该变量进行比较。

import cv2

cap = cv2.VideoCapture(0)
counter = 0

while(True):
    ret, frame = cap.read()
    cv2.imshow('Webcam', frame)
    k = cv2.waitKey(1) & 0xFF
    if  k == ord('s'):
        print("s working")
        counter = counter + 1
        cv2.imwrite("Screenshot_" + str(counter) + ".png", frame)
    elif k == ord('q'):
        print("q working")
        break
cap.release()
cv2.destroyAllWindows()
pcww981p

pcww981p2#

该问题 * 不是 * 由任何延迟引起,也不是由任何阻塞引起。
cap.read()返回新帧后,可能会有按键事件等待,因为您按下了某些按键。
每个waitKey()使用一个按键事件,如果有按键事件,则返回该事件。
如果您按下了某个键,第一个waitKey()就会接收到该事件,如果按错了键,if就不会运行相应的代码。
然后,第二个waitKey()没有要处理的键事件,因此返回-1。
如果您 * 按住键 *,您可能有机会创建足够多的按键事件,使其中一个事件进入第二个waitKey()

正确的解决方案是每个循环调用waitKey()一次,并将其返回值存储在变量中。

然后,您可以根据自己喜欢的任意多个关键代码测试该变量。

while True:
    ...
    keycode = cv.waitKey()
    if keycode == ord('s'):
        ...
    elif keycode == ord('q'):
        ...

&0xFF的东西是多余的,而且自2016年以来就过时了。waitKey()已经这样做了。它是多余的。

相关问题