代码之家  ›  专栏  ›  技术社区  ›  user1245262

当我想开始/暂停视频时,我应该如何正确使用cv2.waitKey?

  •  1
  • user1245262  · 技术社区  · 6 年前

    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”的延迟为0(即无限期等待),则似乎只能间歇性地看到鼠标单击事件,尽管有时我在单击时也会周期性地按空格键。为什么会这样?如果我在按键之前(或之后?)足够快地点击鼠标,我是否会感到“幸运”?如果没有,为什么会出现间歇性响应?

    最终,我并不真正理解cv2.waitKey()的工作原理。我认为它会等待键盘事件的给定时间延迟,然后继续。用鼠标点击的互动甚至让我感到困惑。

    1 回复  |  直到 6 年前
        1
  •  0
  •   deets    6 年前

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

    此外,您还可以在if前面拉waitKey,只需发出一次。

        2
  •  1
  •   tsveti_iko    5 年前

    OpenCV Documentation :

    函数waitKey无限期地等待一个键事件(当 delay <=0)或 延迟 毫秒,当它为正时。由于操作系统在切换线程之间有一个最小的时间间隔,因此函数不会完全等待 延迟 延迟

    因此,您可以使用OpenCV按键盘上的“p”按钮暂停 cv2.waitKey(delay) 功能如下:

    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)