我正在尝试使用opencv的cv2.VideoWriter来录制视频一段时间。问题是输出不正确。例如,10秒的视频只有2秒,而且速度更快,播放速度更快。 这是我的代码。欢迎任何建议或想法。另外,另一个问题是输出视频是静音。谢谢!!!
主持人:Raspberry Pi
语言:Python
import numpy as np
import cv2
import time
# Define the duration (in seconds) of the video capture here
capture_duration = 10
cap = cv2.VideoCapture(0)
# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output3.avi',fourcc, 20.0, (640,480))
start_time = time.time()
while( int(time.time() - start_time) < capture_duration ):
ret, frame = cap.read()
if ret==True:
frame = cv2.flip(frame,0)
# write the flipped frame
out.write(frame)
else:
break
# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()
答案 0 :(得分:0)
您忽略了代码中的两个重要因素:
while循环中的帧数:
您希望以每秒20帧(fps)的速度写入10秒的视频。这为整个视频提供了总共200帧。为此,您需要在捕获每个帧并将其写入文件之前,注意while循环内的等待时间。如果忽略等待期,则:
frameCount = 0
while( int(time.time() - start_time) < capture_duration ):
# we assume that all the operations inside the loop take 0 seconds to accomplish.
frameCount = frameCount+1
print('Total frames: ',frameCount)
在上面的示例中,您会注意到,通过忽略等待时间,您将在10秒内将数千帧写入视频文件。现在10帧20帧的帧会给你200帧,为了达到这个帧数,你需要50毫秒的等待时间才能将每帧写入文件。
frameCount = 0
while( int(time.time() - start_time) < capture_duration ):
# wait 50 milliseconds before each frame is written.
cv2.waitKey(50)
frameCount = frameCount+1
print('Total frames: ',frameCount)
在上面的示例中,总帧数约为200.
VideoCapture::read()
是阻止I / O调用:
cap.read()
函数执行两项操作,即VideoCapture::grab()
和VideoCapture::retrieve()
。此功能等待下一帧被抓取,然后解码并返回图像。等待时间取决于您的相机fps 。
因此,例如,如果你的相机fps是6,那么在10秒内你就可以拍摄60帧。您已将20 fps设置为VideoWriter
属性;以20 fps播放的60帧可为您提供约3秒的视频。
要查看相机在10秒内捕获的帧数:
frameCount = 0
while( int(time.time() - start_time) < capture_duration ):
# wait for camera to grab next frame
ret, frame = cap.read()
# count number of frames
frameCount = frameCount+1
print('Total frames: ',frameCount)