15

Ubuntu 11.10 で OpenCV 2.1 を使用して、3 台の Logitech Webcam Pro 900 デバイスから画像を同時にストリーミングしようとしています。これらの uvcvideo ドライバーが読み込まれます。

2 つのデバイスをキャプチャすると問題なく動作しますが、3 つを使用すると、3 つ目のデバイスで容量不足エラーが発生します。

libv4l2: error turning on stream: No space left on device

私はこの問題に遭遇しているようです: http://renoirsrants.blogspot.com.au/2011/07/multiple-webcams-on-zoneminder.htmlそして、私は quirks=128 (またはほとんど他の2 のべき乗の値) のトリックですが、役に立ちません。また、2 つの USB 2.0 ハブを備えた別のマシンで 2 台のカメラを 1 台に接続し、3 台​​目のカメラを 2 台目のカメラに接続してみましたが、同じ問題が発生しました。私は大まかに次のように初期化しています(N個のカメラを使用しているため、結果は実際にSTLベクトルに入れられます):

cv::VideoCapture cap0(0); //(0,1,2..)

そして、ループ内のすべてのカメラを次のようにキャプチャしようとします

cap0.retrieve(frame0);

これは、N=2 カメラの場合にうまく機能します。N=3 に設定すると、3 番目のウィンドウが開きますが、画像は表示されず、コンソールは V4L2 エラーでいっぱいになります。同様に、N=2 に設定し、Cheese (単純な Web カメラ キャプチャ アプリケーション) で 3 番目のカメラを開こうとすると、これも機能しません。

ここで大きな問題が発生しますが、3 つのインスタンスを開始して guvcview を試した後、一度に 3 台のカメラを表示できたので (フレーム レートや関連の点で問題はありませんでした)、ハードウェアの問題ではないようです。設定する必要があるプロパティがあると思いますが、それが何であるかわかりません。MJPEG (これらのカメラはサポートしているようです) を調べましたが、このプロパティの設定に成功していないか、OpenCV から起動した場合にどのモード (yuyv?) で実行されているかを検出できませんでした。

考え?

4

7 に答える 7

14

私もこの問題を抱えており、mjpeg 圧縮を使用して 640x480 で 2 台のカメラをキャプチャできるソリューションがあります。Creative の「Live Cam Sync HD VF0770」を使用していますが、帯域幅要件が正しく報告されません。quirks=128 の修正は、320x240 の非圧縮ビデオで機能します。ただし、圧縮 (mjpg) 形式の場合、quirks=128 は機能しません (圧縮形式では何もしません)。

これを修正するために、uvc ドライバーを次のように変更しました。

カーネルソースをダウンロードする

mkdir -p ~/Software/kernel-git
cd ~/Software/kernel-git
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git checkout v3.2
# NOTE: `uname -r`  shows me my current kernel is 3.2.0-60-generic
# For a different kernel use a different tag

uvc ディレクトリをコピー:

mkdir -p ~/Software/uvcvideo_driver
cd ~/Software/uvcvideo_driver
#cp -a ~/Software/kernel-git/linux/drivers/media/usb/uvc .
cp ~/Software/kernel-git/linux/drivers/media/video/uvc .

Makefile を変更する

cd ~/Software/uvcvideo_driver/uvc
vi Makefile

        obj-m += aauvcvideo.o
        aauvcvideo-objs  := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o \
              uvc_status.o uvc_isight.o
        all:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

        clean:
          make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

圧縮時に帯域幅を 0x400 に強制します。

cd ~/Software/uvcvideo_driver/uvc
vw uvc_video.c
Find the uvc_fixup_video_ctrl() function.  At the end of the function add:
      if (format->flags & UVC_FMT_FLAG_COMPRESSED) {
        ctrl->dwMaxPayloadTransferSize = 0x400;
      }

aauvcvideo モジュールをビルドします。

make

古いモジュールを削除し、新しいモジュールを挿入します:

sudo rmmod uvcvideo
sudo insmod ./aauvcvideo.ko quirks=128

2 つの異なるウィンドウで圧縮して gucview を 2 回実行し、テストします

guvcview --device=/dev/video1 --format=mjpg --size=640x480
guvcview --device=/dev/video2 --format=mjpg --size=640x480

幸運を!-どんぐり

于 2014-05-27T04:33:14.817 に答える
10

3台のlogitechquickcampro 9000カメラ(ubuntuを使用)を使用して、この正確な問題が発生しました。私は2つから読むことができましたが、3つではありませんでした。私の場合、opencvを使用していませんでしたが、メモリマップドIOを使用して、V4L2を介してカメラに直接アクセスしていました。簡単に言えば、3つのバッファを割り当てるのに十分なUSB帯域幅がありませんでした。

しかし、私は非圧縮のフレームを読んでいました。フォーマットをMJPEGに切り替えるとすぐに、データは十分に小さく、3台のカメラから読み取ることができました。libjpegを使用してMJPEGストリームをデコードしました。

OpenCVを使用して画像形式を変更する方法については調べていませんが、すべてのデータを収めるにはMJPEGである必要があることは知っています。

MJPEGに切り替える前は、各カメラに一度に1つずつアクセスし、次のフレームに切り替える前に1つのフレームをストリーミングすることに多くの時間を費やしていました。お勧めしません!

于 2012-04-27T15:37:38.910 に答える
4

OpenCV はv4lまたはlibv4lのいずれかを使用するようにビルドでき、v4l バージョンのみが圧縮形式をサポートしますが、libv4l バージョンは OpenCV 2.4.11 の非圧縮形式を 1 つだけサポートします。( v4l の場合はautosetup_capture_mode_v4l2()を、libv4l の場合は692 行目以降のコードを参照してください。) OpenCV 3.0.0 は 2.4.11 よりも大幅に改善されていません。libv4l の非圧縮形式のみをサポートしています。

エラーに が記載libv4l2されているため、libv4l バージョンと OpenCV が非圧縮でキャプチャされているようです。v4l バージョンの OpenCV をビルドするには、cmake コマンドに以下を含める必要があります。

-D WITH_LIBV4L=OFF

WITH_LIBV4L私にとってはデフォルトで有効になっていました。)

帯域幅と USB に関するメモ。USB 2.0 (ほぼすべての Web カメラが使用) の帯域幅は 480 Mbit/s です。非圧縮の 30 fps および 24 ビット/ピクセルでの 640x480 は約 221 Mbit/s であるため、圧縮されていない Web カメラでは USB 2.0 の帯域幅をすぐに使い切ってしまう可能性があります。USBホストコントローラーごとに 480 Mbit/s を取得します。一覧表示方法については、この回答を参照してください。(USBハブはホスト コントローラーを追加せず、マザーボード上の複数の USB ポートは通常、同じホスト コントローラーに接続されます。ホスト コントローラーに接続されたすべてのデバイスとハブは、帯域幅を共有します。)

必要以上の USB 帯域幅を予約する Web カメラ (たとえば、UVCドライバー ページに脚注 [13]がある Web カメラ) では、FIX_BANDWIDTH quirk役に立ちます。ただし、癖は非圧縮形式でのみ機能します (ここで Acorn の回答でカーネル ハックを行わない限り)。私の場合 (Ubuntu 14.04、320x240 の多くの Microsoft LifeCam シネマ)、OpenCV の libv4l バージョン (ASMedia USB ホスト コントローラー上の 4 つの LifeCams は正常に動作しました) を使用すると、この癖は機能しましたが、v4l バージョンでは使用することが確認されました。 MJPEG -- 2 台目の LifeCam からキャプチャしようとするとすぐにエラーが発生しました。(同じマシンの場合、Intel と VIA のホスト コントローラーの方が優れており、それぞれ v4l 用の 2 つの LifeCam で動作しました。LifeCam は USB 2.0 帯域幅の 48% を予約しています。)VIDIOC_STREAMON: No space left on device

于 2016-02-02T19:00:44.423 に答える
1

これは私にとって魅力的です

sudo rmmod uvcvideo

sudo modprobe uvcvideo quirks=128

これは、再起動するたびにリセットされます。これが機能する場合は、次のファイルを作成します: sudo vi /etc/modprobe.d/uvcvideo.conf 行を含む: options uvcvideo quirks=128

このリンクを確認してください http://renoirsrants.blogspot.in/2011/07/multiple-webcams-on-zoneminder.html

于 2014-10-23T07:37:04.510 に答える
1

Ubuntu 18.04 上のカーネル 4.15.0-34-generic および gstreamer/v4l サポートでコンパイルされた OpenCV 3.4 を使用すると、Python で gstreamer を使用した MJPG 圧縮を使用して、電源付きハブを使用して単一の USB ポートで 3x720p をストリーミングできます (2xC922 および 1xC920 カメラを使用 -これが機能するために 10fps のフレームレートは必要ありません):

def open_cam_usb(dev, width, height):
    gst_str = (
        "v4l2src device=/dev/video{} ! "
        "image/jpeg,widh=(int){},height=(int){},framerate=10/1,"
        "format=(string)RGB ! "
        "jpegdec ! videoconvert ! appsink"
    ).format(dev, width, height)
    return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)
于 2018-09-28T08:38:08.973 に答える
0

私が発見した最も有用なことの1つは、キャプチャの初期化の間にSleep(ms)呼び出しを配置し​​た場合です。これにより、2つのWebカメラキャプチャを問題なく同時に取得できました。

于 2012-10-23T18:58:28.677 に答える