我知道VideoWriter对象的FPS应该与我的摄像头的FPS匹配。我的网络摄像头是一个罗技高清专业网络凸轮C920,正如你所看到的,规格说明它的FPS为30。不过,我仍然没有硬编码值,而是使用cap.get(CV_CAP_PROP_FPS) (返回30.0)来确保与FPS匹配。
cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output.avi', fourcc, cap.get(CV_CAP_PROP_FPS), (640, 480))
print(cap.get(CV_CAP_PROP_FPS)) # 30.0这就是我如何捕捉每一帧的视频:
while(cap.isOpened()):
# Capture frame-by-frame
ret, frame = cap.read()
if ret == True:
out.write(frame)我的问题是,即使匹配的FPS,输出视频(output.avi)的播放速度约为x3 (根据我的非科学估计),这显然不是我想要的。我试过使用不同的编解码器,但同样的问题也发生了。
有几个问题是为了解决同样的问题:
http://answers.opencv.org/question/16522/video-recording-is-too-fast/
其中大多数建议与作者的FPS相匹配,与网络摄像头的FPS相匹配,我就是这样做的。如果我硬编码FPS到10,视频播放似乎是正常的,但我不想这样做,因为它必须与许多相机通用的工作。
我现在还不知道该怎么做,但我会继续寻找,直到找到解决方案。任何洞察力都会被欣赏!!
发布于 2015-10-12 19:08:48
@MBo正确地回答了为什么视频播放速度快于预期,但我想要更多的信息给有同样问题的人。
首先,这与覆盆子皮也有很多关系,所以使用性能更好的机器的人可能不会遇到这个问题。
即使简单地从摄像机读取视频流而不写入视频文件,在640 x 480下最多可以达到18-20 FPS。在1920年x1080,最大FPS为1-2.这是因为摄像头帧是按顺序读取的,因此只使用CPU的一个核心进行处理。
当读取不同线程中的帧时,可以以640 x 480分辨率实现24 FPS。不过,如果您感兴趣,请参阅这个问题获得更多关于并行读取摄像头帧的信息。
我为覆盆子皮视频应用程序找到的唯一真正的解决方案是使用官方摄像模块,它直接连接到GPU,并提供1080 p和30个FPS。请参阅这个问题,为什么覆盆子Pi相机模块是一个更好的方式替代一个USB摄像头。
发布于 2015-09-22 09:47:09
检查真正的相机FPS ,不需要视频写入??例如,数一些捕获的帧10秒。
如果FPS接近30,请与录像检查相同。如果FPS变得更糟,那么您就错过了一些帧,因为您的系统可能无法使用给定的编解码器(MJPG) -弱处理器等等来处理这个视频流。
加载项:我认为,您可以搜索Raspberry最有效的编解码器,并检查平台上的opencv是否使用了诸如ffmpeg这样的附加库。
https://stackoverflow.com/questions/32706613
复制相似问题