繁体   English   中英

OpenCV 使用键盘启动/停止视频捕获

[英]OpenCV Video capture using keyboard to start/stop

我有一个运行脚本,能够使用 2 个不同的键启动/停止视频 stream;

  • 程序运行并显示实时 stream。
  • 当按下ESC时,程序退出。
  • 当点击SPACE时,视频 stream 被捕获。

但是,当捕获视频时,它会从脚本执行开始存储所有 stream。

    import cv2
    import numpy as np

    capture = cv2.VideoCapture(1)
    codec = cv2.VideoWriter_fourcc(*'XVID')
    output = cv2.VideoWriter('CAPTURE.avi', codec, 30, (640, 480))

    while True:
        ret, frame_temp = capture.read()
        cv2.imshow('FRAME', frame_temp)
        key=cv2.waitKey(1)
        if key%256 == 27:
            break
        elif key%256 == 32:
            output.write(frame_temp)

    capture.release()
    output.release()
    cv2.destroyAllWindows()

所以,当程序运行时,我想要;

  • 程序运行并显示实时 stream。
  • 按下SPACE时开始录制 stream,再次按下SPACE时停止录制。

任何建议将不胜感激。

您需要一个额外的变量来确定您是否正在录制。 我创建了一个名为recording_flag的变量

import cv2
import numpy as np

capture = cv2.VideoCapture(1)
codec = cv2.VideoWriter_fourcc(*'XVID')

recording_flag = False

while True:
    ret, frame_temp = capture.read()
    cv2.imshow('FRAME', frame_temp)
    key=cv2.waitKey(1)
    if key%256 == 27:
        break
    elif key%256 == 32:
        if recording_flag == False:
            # we are transitioning from not recording to recording
            output = cv2.VideoWriter('CAPTURE.avi', codec, 30, (640, 480))
            recording_flag = True
        else:
            # transitioning from recording to not recording
            recording_flag = False

    if recording_flag:
        output.write(frame_temp)

capture.release()
output.release()
cv2.destroyAllWindows()

此行while True:并不完全适合您要执行的操作。 我建议您定义一个 function 来进行录音,并在用户通过空格键停止录音时让它递归调用自身。 脚本的顶部仍然会以相同的方式开始:

import cv2
import numpy as np

capture = cv2.VideoCapture(1)
codec = cv2.VideoWriter_fourcc(*'XVID')
output = cv2.VideoWriter('CAPTURE.avi', codec, 30, (640, 480))

接下来你将定义你的 function,它从(永远)等待一个键被按下开始。 一旦按下一个键,如果它是 escape (27),它会退出 function 并清理,如果它是 space (32),它会设置一个开始记录的 boolean 标志(while 循环)。 如果既没有按下转义键也没有按下空格键,它会调用自己并重新开始这个过程。 在 while 循环内,它检查是否按下了一个键,如果是,它检查它是转义 (27) 还是空格 (32)。 如果它命中它,它要么退出 function(转义),要么通过调用自身来停止记录,从而重新开始整个过程(空格)。

def wait_then_capture():
    key = cv2.waitKey(0)
    if key%256 == 27:
        return
    elif key%256 == 32:
        record = True
    else:
        wait_then_capture()
    while record == True:
        ret, frame_temp = capture.read()
        cv2.imshow('FRAME', frame_temp)
        key = cv2.waitKey(1)
        if key%256 == 27:
            return
        elif key%256 == 32:
            break
        output.write(frame)
    wait_then_capture()

然后我们调用我们的新 function 并以您已经拥有的相同清理结束脚本

wait_then_capture()

capture.release()
output.release()
cv2.destroyAllWindows()

你完成的脚本看起来像这样

import cv2
import numpy as np

capture = cv2.VideoCapture(1)
codec = cv2.VideoWriter_fourcc(*'XVID')
output = cv2.VideoWriter('CAPTURE.avi', codec, 30, (640, 480))

def wait_then_capture():
    key = cv2.waitKey(0)
    if key%256 == 27:
        return
    elif key%256 == 32:
        record = True
    else:
        wait_then_capture()
    while record == True:
        ret, frame_temp = capture.read()
        cv2.imshow('FRAME', frame_temp)
        key = cv2.waitKey(1)
        if key%256 == 27:
            return
        elif key%256 == 32:
            break
        output.write(frame)
    wait_then_capture()

wait_then_capture()

capture.release()
output.release()
cv2.destroyAllWindows()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM