13

OpenCVで時々スナップショットを撮るために3つのウェブカメラを使用しています。それらは同じ USB バスに接続されていますが、USB 帯域幅の制限により、3 つすべての接続を同時に許可することはできません (解像度を下げると、最大 2 つの同時接続が許可され、USB バスが増えません)。

このため、スナップショットを撮るたびに Web カメラの接続を切り替える必要がありますが、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

これらのエラーの原因と修正方法を教えてください。

4

1 に答える 1

1

関連するエラー メッセージのスニペットは、関数内の認識されていないか、サポートされていない配列型ですcvGetMat。このcvGetMat()関数は、配列を Mat に変換します。OpenCVMat は、 C/C++ の世界で使用される行列データ型です (注: 使用している PythonOpenCVインターフェースは Numpy 配列を使用し、バックグラウンドで Mat 配列に変換されます)。その背景を念頭に置いて、問題は、渡している配列 im の形式cv2.imshow()が不十分であることのようです。2 つのアイデア:

  1. これは、Web カメラの異常な動作が原因である可能性があります...一部のカメラでは、時々 null フレームが返されます。im 配列を に渡す前にimshow()、null でないことを確認してください。
  2. すべてのフレームでエラーが発生する場合は、実行中の処理の一部を削除cv2.imshow()し、Web カメラからフレームを取得した直後に呼び出します。それでも問題が解決しない場合は、ウェブカメラに問題があることがわかります。それ以外の場合は、問題を特定するまで、処理を 1 行ずつ追加します。たとえば、次のように開始します。

    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++ ビデオ キャプチャが機能しないようです

于 2017-02-13T11:58:53.350 に答える