【问题标题】:OpenCV VideoCapture on Large files looping back to the start frame after 4000+ framesOpenCV VideoCapture 上的大文件在 4000+ 帧后循环回到起始帧
【发布时间】: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


【解决方案1】:

使用 cap.set(cv2.cv.CV_CAP_PROP_FPS, 25) 而不是在代码中跳帧和设置帧号。

在设置 cv2.CAP_PROP_POS_FRAMES、frameId + frameRate 之前,您的代码不会检查视频的大小。

您可以使用 cap.get(cv2.CAP_PROP_FRAME_COUNT) 检查帧的大小。

【讨论】:

  • 在视频案例中设置帧似乎没有任何作用。每个 read() 调用仍然会在它之后立即读取帧。
【解决方案2】:
def getNextFrame(cap):
    frameRate = 25
    for i in range(frameRate-1):
        cap.grab()
    ret, frame = cap.read()
    return ret, frame

我找到了解决方法。我使用 grab() 来跳过 24 帧,然后只使用 read() 来处理我需要的帧。

我不确定这是否是最好的方法,但我会把它放在这里。我仍然会接受其他答案。

【讨论】:

    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2019-11-20
    • 2016-11-06
    • 1970-01-01
    相关资源
    最近更新 更多