2014-02-05 138 views
10

我使用3個攝像頭偶爾在OpenCV中拍攝快照。它們連接到同一個usb總線,由於usb帶寬限制(降低分辨率允許最多2個同時連接,並且我沒有更多usb總線),它不允許同時連接所有3個連接。由於這個原因,每次我想拍攝一張快照時,我都必須切換攝像頭連接,但這會導致大約40次切換後內存泄漏。在Python中使用VideoCapture的內存泄漏OpenCV

這是我的錯誤:

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 

是什麼原因導致這些錯誤,我該如何解決這些問題?

+0

我有完全相同的問題,你發現了什麼問題? – bakalolo

+0

您使用的是哪個版本的OpenCV?已經有一段時間了,但我相信在更新OpenCV之後問題就會停止(我認爲它是2.3.1)。 – RemiX

+0

我正在使用2.4.12這應該是更新的方式。我可以嘗試更新到3。 – bakalolo

回答

1

錯誤消息的相關片段是函數cvGetMat中無法識別或不支持的數組類型。 cvGetMat()函數將數組轉換爲Mat。 Mat是在C/C++世界中使用的矩陣數據類型(注意:您正在使用的Python OpenCV接口使用Numpy數組,然後在後臺將其轉換爲Mat數組)。考慮到這種背景,問題似乎是,你傳遞給cv2.imshow()的數組結構不完整。兩個想法:

  1. 這可以通過你的攝像頭古怪的行爲造成的......一些 相機空幀返回不時。在將 im數組傳遞給imshow()之前,請嘗試確保它不爲null。
  2. 如果每一幀上發生錯誤,然後消除一些 處理,你正在做的,並立即撥打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

+0

您也可以通過使用BGR圖片來解決這個問題。我的攝像頭默認是YUYV! –

+0

會傳遞不好形成的數組原因無法分配內存錯誤和/或內存泄漏?這似乎是我的問題的根源。 – bakalolo