簡體   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