web-dev-qa-db-ja.com

OpenCV Python:cv2.VideoCaptureは3台のカメラのうち2台しか検出できませんが、Windowsカメラアプリはすべてを検出します

私はラップトップのUSBハブにウェブカメラで3つのリアルタイムキャプチャフレームを作成しようとしています。 Windowsの「カメラ」アプリを使用して、カメラのソースを1つずつ変更し、3つのWebカメラがすべて機能していることを確認できます。ただし、私のOpenCV Pythonコードでは2つしか見つけることができません。

(USBに関する簡単なメモ-USB 3.0ハブであり、ラップトップポートはUSB 3であり、アクティブなUSBメス-オスケーブルもラップトップに接続しているので、これとWindowsアプリが機能していることを考えると、私は一般的にハードウェア。)

以下では、cv2.VideoCapture(src)の生のテストをいくつか行い、結果を以下に示します。

_cams_test = 10
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    print("i : "+str(i)+" /// result: "+str(test))
_

最初の引数testは、フレームが読み取れるかどうかに応じてTrue/Falseを返します。結果:

_i : 0 /// result: True
i : 1 /// result: True
i : 2 /// result: False
i : 3 /// result: False
i : 4 /// result: False
i : 5 /// result: False
i : 6 /// result: False
i : 7 /// result: False
i : 8 /// result: False
i : 9 /// result: False
_

私がテストした他のサンプルコードと同様に、2つのウェブカメラのみを登録し、Pythonでフレームを表示できます。また、Windows 10カメラアプリでは、3つの動作中のWebフィードと接続されているすべてのWebフィード間をスクロールできます。

動作するcapsを使用すれば、3 +、cv2.imshow()フレームなどの複数のフレームを作成できることを知っています。私のプロジェクトでは、これを実行して、複数のカメラからラップトップでリアルタイムのUSB Webカメラフィードを表示します。

どんな助けやアドバイスも歓迎します。 (Pythonベースの)代替ソリューションにも関心がある可能性があります。乾杯。

14
JDS

2つのビデオ入力デバイスを使用しても、IDが0と10になるわけではありません。10ではなく約500以上に増やして、すべてのカメラにアクセスしてみてください。

cams_test = 500
for i in range(0, cams_test):
    cap = cv2.VideoCapture(i)
    test, frame = cap.read()
    if test:
        print("i : "+str(i)+" /// result: "+str(test))

あなたはテストしているだけだと思う

4
kishea

ウェブカメラはUSB3をサポートしていますか? WebカメラとOpenCVでの実際の経験に基づいて、ほとんどの一般的なカメラは480 MBit/sのUSB2標準でのみ送信します。 1つのUSBチャンネルでサポートできるカメラの正確な詳細は、解像度、フレームレート、およびビデオ圧縮技術によって異なります。私の経験では、30 fpsの1080pカラービデオとH.264エンコーディングで、1つのUSBコントローラーに適合するカメラストリームは1つだけです。

帯域幅が制限されているかどうかを確認する簡単なテストは、テスト後に各ストリームを明示的に閉じるようにプログラムを変更することです(cap.release())。 Windowsカメラアプリ。それが機能する場合、帯域幅の制限を十分に検討している可能性があります。

Windowsでビデオキャプチャの問題をデバッグする場合、カメラストリームを [〜#〜] vlc [〜#〜] で開くことも役立ちます。 VLCは、DirectShowから利用可能なすべてのカメラを列挙できます。これは、OpenCVのVideoCaptureがデフォルトで使用するものと同じAPIです。複数のVLCインスタンスを起動して、同時ストリームを試行することもできます。

[詳細オプション]をクリックして[デバイスのプロパティ]をオンにすると、VLCはDirectShowで微調整できる設定(露出、フォーカスなど)を表示します。これらの設定は通常、OpenCVで VideoCapture.set() からアクセスできます。

4
Jack C.

1)cv2について...他のインスタンス/代替物はありますか?おそらく、3番目のカムはcv2ではなく他のインスタンスにバインドされていますか?

2)-1の代わりに0からループ(範囲)を開始しようとしましたか?

3)いずれの方法も役に立たない場合は、Device Managerに移動し、個々のWebカメラを一時的に無効にしてから、スクリプトを再度実行して、どのような変更が行われるかを確認することをお勧めします。そのウェブカメラを有効にして、変更点を確認します。 (最悪のシナリオでは、有効化/無効化の代わりに、特定のウェブカメラをインソール/再インシントすると、ウィンドウがそれらを正しく解決する可能性があります)。

2
T.Todua

まず、WebカメラをOPENCVに接続できるかどうかをテストする必要があります。

1つのWebカメラのみを接続し、cv2.VideoCapture(0)を使用してプログラムを実行します。パラメーター0は、単一のカメラが接続されていることを意味します。あなたのウェブカメラがすべて大丈夫ならば、それはインデックスの問題になります、 カムに割り当てられたdeviceIDを見つける になるコードがあります。

残念ながら一部のウェブカメラが失敗した場合、それは困難になります。

この場合、SDKを使用して取得する独自の関数を作成し、イメージをcv :: Matに書き込む必要があります。

1
obgnaw