Python OpenCV中视频捕获的内存泄漏

Python OpenCV中视频捕获的内存泄漏,python,opencv,memory-leaks,webcam,v4l2,Python,Opencv,Memory Leaks,Webcam,V4l2,我使用3个摄像头偶尔在OpenCV中拍摄快照。它们连接到同一个usb总线,由于usb带宽限制,这不允许同时进行所有3个连接(降低分辨率最多允许同时进行2个连接,并且我没有更多的usb总线) 因此,每次我想拍摄快照时都必须切换网络摄像头连接,但这会导致大约40次切换后内存泄漏 这是我得到的错误: libv4l2: error allocating conversion buffer mmap: Cannot allocate memory munmap: Invalid argument munm

我使用3个摄像头偶尔在OpenCV中拍摄快照。它们连接到同一个usb总线,由于usb带宽限制,这不允许同时进行所有3个连接(降低分辨率最多允许同时进行2个连接,并且我没有更多的usb总线)

因此,每次我想拍摄快照时都必须切换网络摄像头连接,但这会导致大约40次切换后内存泄漏

这是我得到的错误:

libv4l2: error allocating conversion buffer
mmap: Cannot allocate memory
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument

Unable to stop the stream.: Bad file descriptor
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
munmap: Invalid argument
libv4l1: error allocating v4l1 buffer: Cannot allocate memory
HIGHGUI ERROR: V4L: Mapping Memmory from video source error: Invalid argument
HIGHGUI ERROR: V4L: Initial Capture Error: Unable to load initial memory buffers.
OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or 
unsupported array type) in cvGetMat, file 
/build/buildd/opencv-2.3.1/modules/core/src/array.cpp, line 2482

Traceback (most recent call last):
File "/home/irobot/project/test.py", line 7, in <module>
cv2.imshow('cam', img)
cv2.error: /build/buildd/opencv-2.3.1/modules/core/src/array.cpp:2482: 
error: (-206) Unrecognized or unsupported array type in function cvGetMat
也许值得注意的是,每次连接相机时,我都会出现
VIDIOC\u QUERYMENU:Invalid argument
错误,尽管我仍然可以使用它

作为一些额外信息,这是我的
v4l2 ctl-V
网络摄像头的输出:

~$ v4l2-ctl -V
Format Video Capture:
Width/Height  : 640/480
Pixel Format  : 'YUYV'
Field         : None
Bytes per Line: 1280
Size Image    : 614400
Colorspace    : SRGB

导致这些错误的原因以及如何修复这些错误?

在函数
cvGetMat
中,错误消息的相关片段无法识别或不支持数组类型。
cvGetMat()
函数将数组转换为Mat。Mat是
OpenCV
在C/C++世界中使用的矩阵数据类型(注意:您正在使用的Python
OpenCV
接口使用Numpy数组,然后在后台将其转换为Mat数组)。考虑到这一背景,问题似乎是您要传递给
cv2.imshow()
的数组im格式不正确。两个想法:

  • 这可能是由于网络摄像头上的古怪行为造成的。。。在一些 相机会不时返回空帧。在你通过之前 将im数组设置为
    imshow()
    ,尝试确保它不为空
  • 如果错误发生在每一帧上,则消除一些错误 处理您正在执行的操作,并立即调用
    cv2.imshow()
    从网络摄像头抓取画面后。如果那还不行的话 工作,然后你就会知道你的网络摄像头有问题。否则,添加 逐行返回处理过程,直到隔离问题。对于 例如,从以下内容开始:

    while True:
    
    
    # Grab frame from webcam
    retVal, image = capture.read(); # note: ignore retVal
    
    #   faces = cascade.detectMultiScale(image, scaleFactor=1.2, minNeighbors=2, minSize=(100,100),flags=cv.CV_HAAR_DO_CANNY_PRUNING);
    
    # Draw rectangles on image, and then show it
    #   for (x,y,w,h) in faces:
    #       cv2.rectangle(image, (x,y), (x+w,y+h), 255)
    cv2.imshow("Video", image)
    
    i += 1;
    

  • 来源:

    我遇到了完全相同的问题。您找到问题所在了吗?您使用的是哪个版本的OpenCV?已经有一段时间了,但我相信在更新OpenCV之后问题就不再发生了(我认为是2.3.1)。我正在使用2.4.12,这应该是最近的版本。我可以尝试更新到3。一个可能的解决办法是在新的过程中调用另一个脚本来拍摄照片并将其保存到磁盘。然后在主脚本中从磁盘加载图片。这将避免USB同时切换,并且由于外部进程的寿命较短,因此不会有内存问题的危险。可能是网络摄像头质量差的问题。您也可以使用BGR图片解决此问题。默认情况下,我摄像头里的那个是YUYV!传递格式错误的数组是否会导致无法分配内存错误和/或内存泄漏?这似乎是我问题的根源。