![](/img/trans.png)
[英]How to capture video and save from webcam on click or pressing any key from keyboard using OpenCV
[英]OpenCV Video capture using keyboard to start/stop
我有一个运行脚本,能够使用 2 个不同的键启动/停止视频 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()
所以,当程序运行时,我想要;
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.