`cv2.waitKey(7) & 0xFF` 始终返回 225,不等于按“q”键时的 113

问题描述 投票:0回答:1

我目前正在开发一个 Python 项目,该项目涉及使用 OpenCV 捕获视频 (

cv2
)。我遇到了
cv2.waitKey
函数的问题,我正在寻求帮助以了解它为何表现异常。

这是我的代码片段:

import cv2

videos = cv2.VideoCapture(0)
videos.set(5, 3840)
videos.set(8, 2160)
videos.set(10, 10000)

while True:
    success, img = videos.read()
    cv2.imshow("output", img)
    
    key = cv2.waitKey(7) & 0xFF
    if key == ord("q"):
        break

videos.release()
cv2.destroyAllWindows()

在这段代码中,我试图在按下“q”键时跳出循环。但是,条件

cv2.waitKey(7) & 0xFF
始终返回 225,这不等于 'q' 的 ASCII 值 (113)。

我尝试过其他一些方法,比如在if语句中打印条件

import cv2
videos = cv2.VideoCapture(0)
videos.set(5,3840)
videos.set(8,2160)
videos.set(10,10000)
while True:
    sucess, img = videos.read()
    cv2.imshow("output", img)
    if print(cv2.waitKey(7)&0XFF) or cv2.waitKey(7) & 0XFF == ord("q") :
        
        break

但它仍然评估为 false。但是,它设法输入 if 语句并中断循环。如果有人告诉我为什么它会这样并且也启发我

waitKey()
,我将不胜感激。先谢谢你了

python opencv computer-vision video-capture
1个回答
0
投票

225 是你通过 Shift 键得到的值。

您可能正在尝试输入大写 Q,

shift
+
Q
。因此得到 225。

你的第二个代码有两个问题

  1. 您在

    print
    条件下使用
    if
    。但
    print
    没有任何价值。所以
    print(cv2.waitKey(7)&0xff)
    值得
    None
    。也许您是自愿这样做的,因为
    None or whatever
    会评估
    whatever
    并值得
    whatever
    。因此
    print(cv2.waitKey(7)&0xff) or cv2.waitKey(7)&0xff==113
    是一个表达式,它打印
    cv2.waitKey(7)&0xff
    ,然后计算
    cv2.waitKey(7)&0xff==113
    并根据最后一个子表达式值得出 False 或 True。所以几乎就是你想要的。尽管如此,与您的其余代码相比,这有点过于“黑客风格”,所以我想知道您是否意识到这种微妙的风格

  2. 但无论如何,无论自愿与否,

    if
    条件意味着其他东西:
    cv2.waitKey
    被调用两次。因此,如果没有按下任何键,则等待 14 毫秒(而不是 7 毫秒),并且两个调用都返回 255。如果只按下一个键,则等待 7 毫秒,然后,第一个调用返回(要打印)该键的代码,第二个调用返回返回 255(最有可能。除非按键发生在 7 毫秒等待期间)。

如果按下两个键,第一个

waitKey
返回第一个键码,即打印出来,第二个
waitKey
返回第二个键码,即与113进行比较来决定是否破解。

例如,如果您按

Shift+Q
,则第一次调用将返回 225(shift),并打印 225。然后,第二次调用返回 113,与
ord('q')
(也是 113)进行比较,因此 if (
print(cv2.waitKey(7)&0xff) or cv2.waitKey(7)&0xff==ord('q')
that is
None or 113==ord('q')
that is
True
) 的条件为 True,并且发生中断。

如果您想在一行中执行“用作条件并打印”,您可以这样做

if print(x:=(cv2.waitKey(7)&0xff)) or x==ord('q'):
    break

但是,与此同时,您的代码正在打印 2 个关键代码中的一个,并测试另一个。按

shift+Q
意味着按下两个键:shift (225) 和 Q (113)。 这当然就是为什么你看到 225,但感觉是 113 :D(我的意思是,它打印了 225,但中断了,就好像它是 113)

© www.soinside.com 2019 - 2024. All rights reserved.