Утечка памяти с помощью VideoCapture в Python OpenCV

Я использую 3 веб-камеры, чтобы иногда делать снимки в OpenCV. Они подключены к одной и той же шине usb, которая не позволяет одновременно использовать все 3 соединения из-за ограничений пропускной способности USB (снижение разрешений позволяет не более двух одновременных подключений, и у меня больше нет 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 каждый раз, когда камера подключается, хотя я могу ее использовать.

Как дополнительная информация, это мой вывод 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 

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

One Solution collect form web for “Утечка памяти с помощью VideoCapture в Python OpenCV”

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

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

источник: Связанный вопрос: OpenCV C ++ Video Capture, похоже, не работает

Python - лучший язык программирования в мире.