使用键盘的 OpenCV 视频捕获 start/stop
OpenCV Video capture using keyboard to start/stop
我有一个 运行 脚本能够 starting/stopping 使用 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
停止录制。
如有任何建议,我们将不胜感激。
您需要一个额外的变量来确定您是否正在录制。我创建了一个名为 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()
我有一个 运行 脚本能够 starting/stopping 使用 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
停止录制。
如有任何建议,我们将不胜感激。
您需要一个额外的变量来确定您是否正在录制。我创建了一个名为 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()