【问题标题】:How to pause VideoStream while holding down a key? Python OpenCV如何在按住键时暂停 VideoStream? Python OpenCV
【发布时间】:2019-12-30 10:27:11
【问题描述】:

我正在尝试为图像处理项目创建网络摄像头视频流,并且我想要一种暂停流的方法(因为它对于检查值、掩码等非常有用) 我确实找到了一种使用 time.sleep() 暂停一定量的简单方法,但这并不是我真正想要的。

我真正想要的是一种在按下 SPACE 时暂停流并在释放时取消暂停的方法。 在我看来,按住一个键是最简单的选择,因为它只是意味着检查一个按钮是否在帧开始时被按下,如果是,则跳过该特定帧。但是,我在这里尝试过的代码(使用 continue 跳过帧)不起作用。

有什么建议吗?

from imutils.video import VideoStream
import imutils
import time
import cv2

vs = VideoStream(src=0).start()

while True:
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"): break # quitting when q is pressed
    # if key == ord(" "): time.sleep(5)
    if key == ord(" "): continue

    frame = vs.read()
    frame = imutils.resize(frame, width=500)

    if frame is None:
        print("Oops, something went wrong")
        break

    # Image processing over here

    cv2.imshow("Frame", frame)  

vs.stop()
cv2.destroyAllWindows()

另外,如果有人对我的代码有任何其他提示或建议,请告诉我。

【问题讨论】:

标签: python opencv keypress video-capture pause


【解决方案1】:

您可以将空格键用作开关,而不是连续按下它。按一次停止,再按一次启动,依此类推。为此,只需使用一个标志变量,只要按下空格键就会改变值。我使用了这段代码,它成功了:

import cv2
cap = cv2.VideoCapture(0)
flag = True
while(True):
    if cv2.waitKey(1) & 0xFF == ord(' '):
        flag = not(flag)
        print(flag)
        # Capture frame-by-frame
    if flag == True:
        ret, frame = cap.read()
        if frame is None:
            break
        # Display the resulting frame
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        continue

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

编辑(用于评论)

我做了一些测试来检查通过使用此代码连续按下空格按钮获得的值:

import cv2
cap = cv2.VideoCapture(0)
while(True):
    key = cv2.waitKey(1) & 0xFF
    print(key)
    if key == ord(' '):
        continue
    elif key != ord('q'):
        # Capture frame-by-frame
        ret, frame = cap.read()
        if frame is None:
            break
        # Display the resulting frame
        cv2.imshow('frame',frame)
    else:
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

但是,即使在连续按下空格键后,打印的值也是

.
.
.
255
32
255
32
255
255
32
32
255
32
255
113

其中 255 代表空白,32 代表空格,113 代表 'q'。很抱歉,但我不知道发生这种情况的原因,但这需要解决,否则按住空格键将不起作用。

【讨论】:

  • 感谢您的回答!使用空间作为标志解决了我的问题。但是,我还是很好奇:有没有办法检查按钮是否被按下?你总是需要做按下释放的事情吗?它可以工作,但在我看来,它非常复杂,需要额外的代码。
猜你喜欢
  • 1970-01-01
  • 2021-11-27
  • 2020-06-02
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2013-04-29
相关资源
最近更新 更多