Python OpenCV(cv2)VideoCapture.read()NumpyAllocator :: allocate中的未指定错误

时间:2014-07-31 19:53:46

标签: python opencv numpy

我是OpenCV的新手,我正在使用它的python版本来读出视频的帧,以便我可以对它们进行一些分析。我正在读一个mp4视频文件并循环遍历帧以保存它们:

import cv2
cv2Cap = cv2.VideoCapture(filepath)
frames = []
cnt = 0 
while 1:
    # get the next frame form the video 
    ret, frame = cv2Cap.read()
    cnt+=1
    print 'Count: ' + str(cnt)
    if not ret: 
        break # means ret was false so break out of the loop 
    cv2.imshow('Frames', frame)
    # show the frame that was read to make sure it is normal
    k = cv2.waitKey(1) & 0xff
    if k == 27:
        break
    frames.append(frame) 

此代码大部分时间都可以使用,不过,我已经看到它在几个不同的视频中突破如下:

OpenCV Error: Unspecified error (The numpy array of typenum=2, ndims=3 can not b
e created) in NumpyAllocator::allocate, file D:\Build\OpenCV\OpenCV-2.4.9\module
s//python//src2//cv2.cpp, line 201
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "vidUtils.py", line 25, in __init__
    self.frames, self.fps, self.numFrames = self.getVideoInfo(filepath)
  File "vidUtils.py", line 57, in getVideoInfo
    ret, frame = cv2Cap.read()
cv2.error: D:\Build\OpenCV\OpenCV-2.4.9\modules//python//src2//cv2.cpp:201: erro
r: (-2) The numpy array of typenum=2, ndims=3 can not be created in function Num
pyAllocator::allocate

我正在打印出代码失败的帧号并且它并不总是一致的,这让我觉得还有其他事情我完全失踪了。它最近已经在1780-1820帧被淘汰出局。任何帮助或建议将不胜感激!

提前致谢!
~zoltana

1 个答案:

答案 0 :(得分:1)

你可能会用完内存吗?分配错误通常意味着“内存不足”。在不知道您的视频分辨率的情况下,您的帧通常在每个1到5 MB之间,然后在大约2000帧时,您将看到几千兆字节。

如果您正在运行32位PYthon,则可能很容易碰到2 GB的障碍。使用64位Python,如果你做了很大的事情,你很可能会窒息交换。

我建议你做一些内存分析。最简单的方法是查看单个帧的大小(frame.nbytes)并将其乘以帧数。另一种可能性(取决于操作系统)是使用ps或等效实用程序来检查Python进程的总内存使用情况。如果您想认真考虑内存使用情况,请查看heapyguppy-pe包的一部分)。

您可以做的一个诊断检查是在不执行frames.append(frame)的情况下运行相同的循环,因为那样内存占用空间应该小得多。如果那个运行完美,你的问题很可能是你的内存不足。 (不幸的是,简单测试中的错误并不能证明没有内存问题只是因为它没有存储帧。可能还有其他泄漏。)