要开始/暂停视频时如何正确使用cv2.waitKey?

时间:2018-12-05 18:19:39

标签: python opencv

我编写了一个小脚本,该脚本允许使用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. 如果我没有“ Use A”(使用A),则窗口将冻结,而不会显示视频。我希望它能够运行然后很快关闭。为什么不是这种情况?

  2. 如果不存在“ Use B”,则在第一次单击鼠标后冻结执行。 openCV是否需要以某种方式等待键盘输入才能看到鼠标单击?如果是这样,为什么?

  3. 如果“使用B”的延迟为0(即无限期等待),则似乎只能间歇性地看到鼠标单击事件,尽管有时我也会在单击时定期按空格键。为什么是这样?如果在按键之前(或之后)足够快地单击鼠标,我会以某种方式变得“幸运”吗?如果没有,为什么间歇性响应?

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

2 个答案:

答案 0 :(得分:0)

waitKey驱动事件循环。这对于诸如键盘或鼠标事件之类的事情是必不可少的。因此,如果您期望交互式反应,则始终需要驱动它。

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

答案 1 :(得分:0)

根据OpenCV Documentation

  

函数waitKey无限等待键事件(当delay <= 0时),或者等待delay毫秒(当它为正数)时。由于操作系统在切换线程之间的间隔时间最短,因此该功能将不会精确地等待delay毫秒,而是将至少等待delay毫秒,具体取决于当时计算机上正在运行的内容。它返回按下的键的代码;如果在指定的时间之前没有按下任何键,则返回-1。

因此,您可以使用OpenCV cv2.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)