【发布时间】:2018-11-20 11:25:35
【问题描述】:
import matplotlib.pyploy as plt
import cv2
def getFrame(cap):
frameRate = 25
frameId = cap.get(cv2.CAP_PROP_POS_FRAMES)
ret, frame = cap.read()
if not ret:
return None
print frameId
if frameId < 0:
return None
if not (frameId % int(frameRate)):
cap.set(cv2.CAP_PROP_POS_FRAMES, frameId + frameRate)
return frame
return None
videoFile = 'filename.webm'
cap = cv2.VideoCapture(videoFile,cv2.CAP_FFMPEG)
image = getFrame(cap)
plt.imshow(image)
cap.set(cv2.CAP_PROP_POS_FRAMES,4000.0)
image = getFrame(cap)
while(image is not None):
plt.imshow(image)
image = getFrame(cap)
cap.release()
我在 while 循环中运行上述代码并显示图像。似乎在大约 4250 帧之后,返回的帧将与开始时的帧相同。此循环在另外 4250 帧后继续。
我正在阅读的文件是 mp4 和 webm 文件。这两种文件的行为是相同的。 videoCapture 正在使用 FFMPEG 后端。 Opencv 版本 = 3.4.1,python 2.7。
另一个值得注意的行为是帧的读取速度随着帧的增加而减慢,然后在 4250 帧后又回到快速。
编辑:
我编辑了代码。我认为您可以尝试使用 mp4/webm 文件运行超过 5 分钟。由于隐私原因,我无法上传视频,因为它是在办公室录制的。
当我只用 cap.read() 修改代码时,错误消失了。我怀疑这与 cap.set()
有关【问题讨论】:
-
请将您的代码升级到minimal reproducible example。
-
我编辑了代码。似乎在尝试了多个 read() 而不是 set 之后,我能够读取 4250 帧。您是否遇到过 cv2 cap.set() 方法的任何问题?
标签: python python-2.7 opencv video-capture