GNU/Linux >> Linux の 問題 >  >> Linux

Linux で複数の USB Web カメラを使用する

ディンディン! freenode の #v4l の親切な人々の助けを借りて、これを解決することができました。

簡単に言うと:v4l2-ctl USB カメラの問題をデバッグするのに最適なツールです。利用可能なすべてのコマンドと man ページを読んでください。きっと楽しいものになるでしょう。 v4l2-ctl の使用 カメラの 1 つが圧縮ビデオ モードをサポートしていないことがわかりました。次のコマンドを実行して、カメラがサポートしているモードを確認できます:

v4l2-ctl -d /dev/video0 --list-formats

これは、このようなものを出力するはずです.

 ioctl: VIDIOC_ENUM_FMT
 Index       : 0
 Type        : Video Capture
 Pixel Format: 'MJPG' (compressed)
 Name        : MJPEG

 Index       : 1
 Type        : Video Capture
 Pixel Format: 'YUYV'
 Name        : YUV 4:2:2 (YUYV)

返されるピクセル形式が「YUYV」、「IUYV」、「I420」、または「GBRG」のみの場合、これらの形式は圧縮されていないため、USB コントローラーごとに 1 つのカメラしか実行できません*。 MJPEG またはその他の形式の圧縮をサポートする複数の Web カメラを使用すると、問題なく動作します。

私のように OpenCV を使用している場合、デフォルトのピクセル形式が圧縮されていなくても心配する必要はありません。OpenCV はデフォルトで圧縮を使用するようになっているようです。

**320x240 以下の解像度に満足している場合を除きます。*


答えは、SwDevRefugee によって記述され、上記で説明されている uvcvideo の修正を使用することです。彼と私は協力して、Mod 化されたコードを OpenWrt 用にコンパイルし、成功しました。私が実行しているバージョンは、tplink wdr3600 ルーター上の OpenWRT DESIGNATED DRIVER (Bleeding Edge、r48130) です:

結果:USB 2.0 ハブを介して、MJPG 形式で 1280x960 および 15fps で 3*c270 (logitech) を同時に実行できます。接続する 4 番目の c270 がありません。申し訳ありません。

YUV フォーマットで 2*c270 と 1*GEMBIRD 640*480*15fps を使用することもできますが、2 番目の GEMBIRD を追加すると、恐ろしい「キャプチャを開始できません:デバイスにスペースが残っていません」というエラーが発生します (ここではスペース ==帯域幅です。よく知っている:))。 GEMBIRD (1908:2311) ==http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .

3*c270 の CPU 使用率は、wdr3600 ではかなり妥当です:

Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached

CPU:  16% usr  27% sys   0% nic  45% idle   0% io   0% irq  10% sirq

Load average: 1.20 0.85 0.44 4/60 2546

  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

 2240  1679 root     S    15348  12%  17% mjpg_streamer --input input_uvc.so --

 2505  1679 root     S    15368  12%  11% mjpg_streamer --input input_uvc.so --

 2239  1679 root     S    15532  12%  11% mjpg_streamer --input input_uvc.so --

コミュニティがある程度の評判とサポートを提供するなら、SwDevRefugee は喜んでコードを uvc-linux に取り込んでくれると思います。


uvcvideo ドライバーを調べたところ、ストリームが mjpeg 圧縮されている場合、quirks=128 モジュール パラメーターは無視されます。

私が選んだ Web カメラは Logitech C500 と Logitech C270 で、C500 で 1280x1024 で生成される画像は 100kbytes で、C270 で 1280x960 で生成される画像は 200kbytes であることがわかりました。

C270 を 10fps で実行する場合、必要なビットレートは 10x200000x8 =16Mbit/s です。 Ubuntu 14.04 では、フレーム レートに関係なく、uvcdriver モジュールは常に 196Mbits/s を割り当てます。 C500 の場合、動作は少し改善されていますが、それでも帯域幅を大量に消費します。

V4L2 インターフェイスを介してドライバに「圧縮」係数を提供できるように、uvcvideo ドライバを修正しました。構造体 v4l2_pix_format で priv 属性を使用して値を指定したという点で、これは「少しハック」です。ドライバーでは、圧縮されていない画像のサイズを計算し、圧縮係数で割って、使用する USB 帯域幅を計算します。

デフォルトでは、圧縮係数 10 を使用します。これにより、カメラが特に圧縮しにくい画像に遭遇した場合に備えて、大きな余裕ができます。 1280x960 および 10fps で動作する C270 は 41Mbit/s を使用するようになり、1 つのバスで 4 台のカメラを簡単に実行できます。

誰かがこの機能に興味を持っている場合は、uvcvideo のメンテナーに「圧縮」係数の概念を検討してもらいます。


Linux
  1. LinuxでMongooseを使用してESP8266のネットワークアプリケーションを開発する

  2. 1つのUSBに複数のLinuxディストリビューションをインストールする方法

  3. Popsicle –Linux用の複数のUSBファイルフラッシャー

  1. ProcDumpを使用してLinuxをデバッグする

  2. 3 つの方法を使用して Linux で複数のファイルの名前をまとめて変更する方法

  3. Linux で ip コマンドの例を使用して複数のルートを追加する方法

  1. LinuxでUSBドライブをフォーマットする方法

  2. Etcherを使用してLinuxでISOファイルをUSBドライブに書き込む方法

  3. tarおよびxzユーティリティを使用してLinuxで.xzファイル形式を解凍するにはどうすればよいですか?