我有一个正在运行的脚本,能够使用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:
并不是你想要做的理想选择。我建议你定义一个函数来进行录制,如果用户通过空格键停止录制,它就递归调用自己。你的脚本顶部仍然会以同样的方式开始。
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()