Захват видео OpenCV с использованием клавиатуры для запуска / остановки - PullRequest
0 голосов
/ 28 мая 2020

У меня есть работающий скрипт, способный запускать / останавливать видеопоток с помощью 2 разных клавиш;

  • Программа запускается и показывает прямой поток.
  • При нажатии ESC программа завершается.
  • При нажатии 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))

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

Итак, вместо этого, когда программа запускается, я хотел бы;

  • Программа запускается и показывает прямой поток.
  • Начать запись потока при нажатии SPACE и остановить запись при повторном нажатии SPACE.

Мы будем благодарны за любые предложения.

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Эта строка while True: не совсем идеальна для того, что вы пытаетесь сделать. Я бы порекомендовал вам определить функцию для записи и сделать так, чтобы она рекурсивно вызывала себя, если пользователь прекращает запись с помощью клавиши пробела. Верх вашего скрипта по-прежнему будет запускаться так же:

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), он выходит из функции и очищается, если это пробел (32), он устанавливает логический флаг, который начинает запись (пока l oop). Если не нажимаются ни escape, ни пробел, он вызывает себя и запускает процесс заново. Внутри while l oop он проверяет, нажата ли клавиша, если да, то проверяет, является ли это escape (27) или пробел (32). Если он ударил, он либо выйдет из функции (escape), либо вызовет запись, вызвав себя, что запустит процесс заново (пробел).

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()
0 голосов
/ 28 мая 2020

Вам нужна дополнительная переменная, чтобы определить, записываете ли вы. Я создал переменную под названием 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()
...