2014-02-05 2 views
10

OpenCV에서 스냅 샷을 찍기 위해 3 개의 웹캠을 사용하고 있습니다. 그것들은 같은 USB 버스에 연결되어 있는데, 이는 USB 대역폭 제한으로 인해 동시에 3 개의 모든 연결을 허용하지 않습니다 (해상도를 낮추면 최대 2 개의 동시 연결이 가능하며 더 많은 USB 버스를 가질 수는 없습니다).Python OpenCV에서 VideoCapture를 사용한 메모리 누수

이 때문에 스냅 샷을 찍을 때마다 웹캠 연결을 전환해야하지만 40 개가 넘으면 메모리 누수가 발생합니다. 내가 VIDIOC_QUERYMENU: Invalid argument 오류마다를 얻을

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() 

어쩌면 가치있는 참고 인 :

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 

이이 오류를 생성하는 코드의 간단한 조각이다 :

은 내가 오류입니다 카메라는 연결되지만 여전히 사용할 수 있습니다.

~$ v4l2-ctl -V 
Format Video Capture: 
Width/Height : 640/480 
Pixel Format : 'YUYV' 
Field   : None 
Bytes per Line: 1280 
Size Image : 614400 
Colorspace : SRGB 

무엇 이러한 오류의 원인이며 어떻게 해결할 수 : 몇 가지 추가 정보를 원하시면,이 웹캠의 내 v4l2-ctl -V 출력은

입니까?

+0

를? – bakalolo

+0

사용중인 OpenCV 버전은 무엇입니까? 오래 동안이지만 OpenCV를 업데이트 한 후에 문제가 발생하지 않는다고 생각합니다 (2.3.1 버전이라고 생각합니다). – RemiX

+0

2.4.12를 사용하고 있습니다. 시도해보고 3으로 업데이트 할 수 있습니다. – bakalolo

답변

1

오류 메시지의 관련 스 니펫은 인식 할 수 없거나 지원되지 않는 배열 유형 cvGetMat입니다. cvGetMat() 함수는 배열을 매트로 변환합니다. 매트는 OpenCV이 C/C++ 세계에서 사용하는 매트릭스 데이터 유형입니다 (참고 : 사용중인 Python OpenCV 인터페이스는 Numpy 배열을 사용하고 장면 뒤에서 매트 배열로 변환됩니다). 그 배경을 염두에두고, 문제는 배열을 당신이 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

관련 문제