我使用 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
错误,尽管我仍然可以使用它。
作为一些额外的信息,这是我的网络摄像头的 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
接口(interface)使用 Numpy 数组,然后在后面转换场景到 Mat 数组中)。考虑到这一背景,问题似乎是您传递给 cv2.imshow()
的数组 im 格式不正确。两个想法:
- 这可能是由于您的网络摄像头的古怪行为引起的……在某些情况下
相机空帧不时返回。在你通过之前
im 数组到
imshow()
,尝试确保它不为 null。 如果每一帧都出现错误,则消除一些错误 处理你正在做的事情并立即调用
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;
来源:Related Question: OpenCV C++ Video Capture does not seem to work
关于python - Python OpenCV 中 VideoCapture 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21576025/