OpenCV视频采集使用键盘启停

问题描述 投票:0回答:1

我有一个正在运行的脚本,能够使用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 是打了一次。

任何建议都将是非常感激的。

python opencv video-capture
1个回答
0
投票

你需要一个额外的变量来找出你是否在录制。我做了一个变量,叫做 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()

0
投票

这一行 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),它就会退出函数并进行清理,如果是space(32),它就会设置一个布尔标志,开始录音(while loop)。如果escape或空格都没有被按下,它就会调用自己并重新开始这个过程。在 while 循环中,它检查是否有键被按下,如果有,它检查是 escape (27) 还是 space (32)。如果按下了其中一个键,它要么退出函数(escape),要么通过调用自己重新开始这个过程(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()
© www.soinside.com 2019 - 2024. All rights reserved.