当想要启动/暂停视频时,我应该如何正确使用cv2.waitKey



我写了一个小脚本,允许使用OpenCV运行/暂停视频流。我不明白为什么我需要以这种方式使用cv2.waitkey((。我的代码结构如下:

def marker(event, x, y, flags, param):
# Method called by mouse click
global run
if event == cv2.EVENT_LBUTTONDOWN:
run = not run

...
window_name = 'Editor Window'
cv2.namedWindow(window_name)
cv2.setMouseCallback(window_name, marker)
fvs = cv2.VideoCapture(args["video"])
(grabbed, frame) = fvs.read()
while grabbed:
# grab the frame from the threaded video file stream, resize
# it, and convert it to grayscale (while still retaining 3
# channels)
if run:
# Code to display video fames ...
cv2.waitKey(1) & 0xFF # Use A
(grabbed, frame) = fvs.read()
else:
cv2.waitKey(1) & 0xFF # Use B

该代码对cv2.waitKey:的使用非常敏感

  1. 如果我没有"使用A",窗口将冻结,而不会显示视频。我本以为它会跑,然后很快就结束了。为什么不是这样?

  2. 如果没有"使用B",则在第一次单击鼠标后执行将冻结。openCV是否需要等待键盘输入才能看到鼠标点击?如果是,为什么?

  3. 如果"使用B"的延迟为0(即无限期等待(,那么它似乎只会间歇性地看到鼠标点击事件,尽管有时我也会在点击时定期按下空格键。为什么会这样?如果我在按键之前(或之后(很快点击鼠标,我会不会感到"幸运"?如果没有,为什么会出现间歇性响应?

最终,我真的不了解cv2.waitKey((的工作原理。我本以为它会等待给定的键盘事件延迟,然后继续。鼠标点击的交互甚至让我感到困惑。

根据OpenCV文档:

函数waitKey无限等待一个键事件(当delay<=0时(,或等待delay毫秒(当它为正时(。由于操作系统在切换线程之间的时间最短,因此函数不会等待delay毫秒,而是至少等待delay毫秒,这取决于当时计算机上运行的其他程序。它返回所按下的键的代码,如果在指定时间之前没有按下任何键,则返回-1。

因此,您可以使用OpenCVcv2.waitKey(delay)功能按下键盘的"p"按钮暂停,如下所示:

import cv2
cap = cv2.VideoCapture('your_video.mov')
while(True):
_, frame = cap.read()
cv2.imshow("Frame", frame)
key = cv2.waitKey(1)
if key == ord("p"):
cv2.waitKey(0)

waitKey驱动事件循环。这对于键盘或鼠标事件来说是必不可少的。因此,如果你期望互动反应,你总是需要驾驶它。

此外,您可以将waitKey拉到if前面,只需发出一次即可。

最新更新