我目前正在开发一个 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()
,我将不胜感激。先谢谢你了
225 是你通过 Shift 键得到的值。
您可能正在尝试输入大写 Q,
shift
+Q
。因此得到 225。
你的第二个代码有两个问题
您在
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。所以几乎就是你想要的。尽管如此,与您的其余代码相比,这有点过于“黑客风格”,所以我想知道您是否意识到这种微妙的风格
但无论如何,无论自愿与否,
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)