Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NumpyAllocator::allocate中的Python OpenCV(cv2)VideoCapture.read()未指定错误_Python_Opencv_Numpy - Fatal编程技术网

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

NumpyAllocator::allocate中的Python OpenCV(cv2)VideoCapture.read()未指定错误,python,opencv,numpy,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

我是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
OpenCV错误:未指定的错误(typenum=2,ndims=3的numpy数组不能
e)在NumpyAllocator::allocate中,文件D:\Build\OpenCV\OpenCV-2.4.9\module
s//python//src2//cv2.cpp,第201行
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“vidUtils.py”,第25行,在_init中__
self.frames、self.fps、self.numFrames=self.getVideoInfo(文件路径)
getVideoInfo中第57行的文件“vidUtils.py”
ret,frame=cv2Cap.read()
cv2.error:D:\Build\OpenCV\OpenCV-2.4.9\modules//python//src2//cv2.cpp:201:erro
r:(-2)无法在函数Num中创建typenum=2,ndims=3的numpy数组
pyAllocator::allocate
我正在打印出代码失败的帧号,它并不总是一致的,这让我觉得我完全遗漏了其他一些东西。它最近一直在1780-1820帧之间。任何帮助或建议都将不胜感激

提前谢谢

~zoltana

你可能内存不足吗?分配错误通常意味着“内存不足”。在不知道视频分辨率的情况下,您的帧通常在1到5 MB之间,然后在2000帧左右,您将看到几GB

如果您运行的是32位PYthon,那么您可能会很容易遇到2GB的障碍。使用64位Python时,如果您做了一些非常大的事情,您很可能会窒息到交换

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


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

当达到500或1000帧时,尝试在50帧之后清除50帧。这似乎是内存问题。谢谢您的回复!内存正在耗尽。我必须将阅读图像与分析与存储帧结合起来。