使用键盘的 OpenCV 视频捕获 start/stop

OpenCV Video capture using keyboard to start/stop

我有一个 运行 脚本能够 starting/stopping 使用 2 个不同密钥的视频流;

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

    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()

所以,我希望在程序运行时;

如有任何建议,我们将不胜感激。

您需要一个额外的变量来确定您是否正在录制。我创建了一个名为 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: 并不完全适合您要执行的操作。我建议您定义一个函数来进行录音,并在用户通过 space 键停止录音时递归调用自身。您脚本的顶部仍将以相同的方式开始:

import cv2
import numpy as np

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

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

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()

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

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()