Утечка памяти с помощью 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
, хотя я все еще могу ее использовать.
Как дополнительная информация, это мой вывод 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
Что вызывает эти ошибки и как я могу их исправить?
Ответы
Ответ 1
Соответствующим фрагментом сообщения об ошибке является тип Unrecognized или unsupported array в функции cvGetMat
. Функция cvGetMat()
преобразует массивы в Mat. Мать - это тип данных матрицы, который OpenCV
использует в мире C/С++ (Примечание: используемый вами интерфейс Python OpenCV
использует массивы Numpy, которые затем преобразуются за кулисами в массивы Mat). Имея это в виду, проблема заключается в том, что массив im, который вы переходите на cv2.imshow()
, плохо сформирован. Две идеи:
- Это может быть вызвано причудливым поведением на вашей веб-камере... на некоторых
время от времени возвращаются нулевые кадры камер. Прежде чем вы пройдете
массив im до
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;
source: Связанный вопрос: OpenCV С++ Video Capture не работает