2014-02-05 2 views
10

Я использую 3 веб-камеры, чтобы иногда делать снимки в OpenCV. Они подключены к одной и той же шине usb, которая не позволяет одновременно использовать все 3 соединения из-за ограничений пропускной способности USB (снижение разрешений позволяет не более двух одновременных подключений, и у меня больше нет USB-шин).Утечка памяти с VideoCapture в Python OpenCV

Из-за этого я должен переключаться между веб-камерами каждый раз, когда хочу сделать снимок, но это вызывает утечку памяти через 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 

Что вызывает эти ошибки и как их исправить?

+0

Я, имеющий точно такой же вопрос вы узнали, что была проблема? – bakalolo

+0

Какую версию OpenCV вы используете? Это было какое-то время, но я считаю, что проблема остановилась после обновления OpenCV (я думаю, это было 2.3.1). – RemiX

+0

Я использую 2.4.12, который должен быть более поздним. Я мог бы попробовать обновить до 3. – bakalolo

ответ

1

Соответствующий фрагмент сообщения об ошибке является непризнанным или неподдерживаемым типом массива в функции cvGetMat. Функция cvGetMat() преобразует массивы в Mat. Мать - это тип данных матрицы, который OpenCV использует в мире C/C++ (Примечание: используемый вами интерфейс Python OpenCV использует массивы Numpy, которые затем преобразуются за кулисами в массивы Mat). Имея это в виду, проблема заключается в том, что массив im, который вы передаете в cv2.imshow(), плохо сформирован. Две идеи:

  1. Это может быть вызвано причудливым поведением на вашей веб-камеры ... на некоторых камер нулевые кадры возвращаются время от времени. Прежде чем передать массив im в imshow(), попробуйте убедиться, что он не равен нулю.
  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