繁体   English   中英

Python OpenCV中的VideoCapture内存泄漏

[英]Memory leak with VideoCapture in Python OpenCV

我正在使用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

这是一段生成此错误的简单代码:

import cv2

for i in range(0,100):
    print i
    cam = cv2.VideoCapture(0)
    success, img = cam.read()
    cv2.imshow('cam', img)
    del(cam)
    if cv2.waitKey(5) > -1:
        break

cv2.destroyAllWindows()

也许值得注意的是我得到VIDIOC_QUERYMENU: Invalid argument每次相机连接时VIDIOC_QUERYMENU: Invalid argument错误都VIDIOC_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()的数组很难形成。 两个想法:

  1. 这可能是由于您的网络摄像头上的奇怪行为造成的......在某些摄像头上,会不时返回空帧。 在将im数组传递给imshow() ,请尝试确保它不为null。
  2. 如果每帧都出现错误,则在您从网络摄像头抓取帧后立即cv2.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 C ++视频捕获似乎不起作用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM