【问题标题】:OpenCV runs out of memory when reading video fileOpenCV在读取视频文件时内存不足
【发布时间】:2014-01-26 04:52:34
【问题描述】:

这个在 python OpenCV 中使用cv2.VideoCapture 从文件中读取视频的例子内存不足:

import cv2
cap = cv2.VideoCapture('file.mp4')
while True:
    ret, frame = cap.read()

在 1920x1080 分辨率下需要大约 300 帧才能用完。在 OpenCV 3.0.0 beta 和 2.4.8 中测试,在 Windows 7 64 位的最新 Pythonxy 中运行。

需要在此代码中添加什么以使其不会耗尽内存,而是在读取下一帧之前释放每一帧?

【问题讨论】:

  • 视频文件一共有多少帧?
  • @herohuyongtao:示例文件中大约有 20000 帧。
  • openCV 使用reference counting 并自行释放不需要的 Mat 内存。因此,如果您不将帧的数据链接到其他地方,则不需要释放内存。在 c++ 中有一个 cv::Mat 的 .release 方法,我猜你可以尝试 python 的等效方法。
  • 你可能想将你的故事附加到这个bug report
  • @berak:是的,就是这样。你知道吗,有没有旧版本没有有这个内存泄漏?

标签: python opencv video


【解决方案1】:

您可以使用scikit-image,它有一个视频加载器,并根据文档支持OpencvGstreamer 后端。我从来没有用过Gstreamer

import cv2
from skimage.io import Video

cap = Video(videofile)
fc = cap.frame_count()
for i in np.arange(fc):
   z = cap.get_index_frame(i)

现在使用框架z 做任何你想做的事!

【讨论】:

  • 有趣的建议,不幸的是它对我不起作用: cap = Video('test.mp4', backend="opencv") => raise ImportError("Opencv 2.0+ required") 我有OpenCV 3.0 :)
  • @Alex 好的。如果您想降级,您可以从link下载 64 位 py 2.7 兼容的 opencv 2.4.6 包
【解决方案2】:

试试

while True:
    ret, frame = cap.read()
    if(!frame)
        break;

确保frame 有效以避免永远读取帧甚至无效。

【讨论】:

  • 是的,清楚地检查结果是个好主意。但是当我运行我的示例时,ret 值始终为 True,并且 frame 是有效帧,它在读取有效帧时内存不足。
  • 我明白了。现在对我来说似乎可能是一个错误。正如@berak 评论的那样,您可以将此报告给bug report
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-02
  • 1970-01-01
  • 2011-09-18
  • 2014-04-30
  • 2018-01-27
  • 1970-01-01
相关资源
最近更新 更多