ベリーパイopencv呼び出しusbカメラselect timeout解決方法


ベリーパイopencv呼び出しusbカメラによるselect timeout解決方法
げんしょう
ベリーパイ4 bは、opencvを使用してusbカメラを呼び出してエラーを報告する.ret, frame = cap.read()を実行すると、端末はselect timeoutまたはVIDIOC_DQBUF: Resource temporarily unavailableを出力し、カメラから画像を取得できなくなり、frameが空になる.
可能性のある原因
  • 問題:VideoCaptureオブジェクトを作成する場合、デバイスのインデックス番号と使用中のカメラは対応しません.
  • 解決方法:cap=cv2.VideoCapture(0)のパラメータを修正し、0を使用するカメラに対応するインデックス番号に交換します.デバイスのインデックス番号が分からない場合は、usbカメラデバイスを挿抜し、それぞれコマンド:$ ls /dev/video*を入力し、比較出力でアクセスデバイスのインデックス番号を表示できます.

  • 可能な原因2
  • 問題:ベリーパイusbポートの電力供給はusbカメラの電力供給需要を満たすことができません.fswebcamなどの他のプログラムを使用してカメラを呼び出すことができる場合は、この問題を排除できます.
  • 解決策:追加の電力供給付きhub
  • を使用
    可能な原因3
  • 問題:単純にusbデバイスの呼び出しが遅いため、タイムアウトして画像を取得できません.
  • 解決方法:V 4 L 2のselect関数の最後のパラメータはtimeoutであり、timeoutはタイムアウト時間を設定するために使用され、timeoutが設定された後、selectがファイル記述子監視が利用可能でない場合、このtimeoutを待つことになり、この時間を超えるとselectはエラーを返す.したがって、timeoutの値を変更しようとすることで、タイムアウトの問題を解決することができます.

  • 可能な原因4
  • 問題:ベリーパイのCPU/GPU処理能力が限られているか、主流のusbカメラ駆動uvcにいくつかの制限があり、最終的に画像データがうまく処理できない.
  • の解決方法:opencvはuvcを使用してベリーパイでusbカメラストリームを読み取るため、cv 2.VideoCaptureは、YUYVなどの非圧縮ストリームとしてデフォルト設定されている可能性があります.そのため、カメラがこのフォーマットをサポートしているかどうかに応じて、ストリームフォーマットをMJPGなどに変更する必要があります.cap.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter_fourcc('M','J','P','G'))によってストリームの変換を完了することができる.端末入力$ v4l2-ctl -d /dev/video0 --list-formatsで、カメラがどのストリームをサポートしているかを調べることができます.
  • サンプルコード:
  • import cv2
    #first camera src
    cap = cv2.VideoCapture(0)
    # set the format into MJPG in the FourCC format 
    cap.set(cv2.CAP_PROP_FOURCC,cv2.VideoWriter_fourcc('M','J','P','G'))