Python OpenCV (cv2) VideoCapture.read() 中 NumpyAllocator::allocate 的未指定错误
我刚接触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 个回答
1
你可能是内存不够用了吧?分配错误通常意味着“内存不足”。如果不知道你的视频分辨率,通常每帧的大小在1到5MB之间,到了2000帧的时候,你可能就要处理好几个GB的数据了。
如果你在用32位的Python,可能很容易就会碰到2GB的限制。而如果是64位的Python,处理非常大的数据时,你可能会遇到性能下降的问题。
我建议你做一下内存分析。最简单的方法就是查看单帧的大小(frame.nbytes
),然后乘以帧的数量。另一个方法(根据操作系统不同)是使用ps
或者类似的工具来检查Python进程的总内存使用情况。如果你想更深入地了解内存使用情况,可以看看heapy
(这是guppy-pe
包的一部分)。
你可以做一个诊断检查,试着运行同样的循环,但不执行frames.append(frame)
,这样内存占用应该会小很多。如果这样运行得很顺利,那你的问题很可能就是内存不够了。(不幸的是,简单测试中的错误并不能证明没有内存问题,只能说明问题不在于存储帧,可能还有其他内存泄漏。)