私はラップトップの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フィード間をスクロールできます。
動作するcap
sを使用すれば、3 +、cv2.imshow()
フレームなどの複数のフレームを作成できることを知っています。私のプロジェクトでは、これを実行して、複数のカメラからラップトップでリアルタイムのUSB Webカメラフィードを表示します。
どんな助けやアドバイスも歓迎します。 (Pythonベースの)代替ソリューションにも関心がある可能性があります。乾杯。
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))
あなたはテストしているだけだと思う
ウェブカメラは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()
からアクセスできます。
1)cv2
について...他のインスタンス/代替物はありますか?おそらく、3番目のカムはcv2
ではなく他のインスタンスにバインドされていますか?
2)-1
の代わりに0
からループ(範囲)を開始しようとしましたか?
3)いずれの方法も役に立たない場合は、Device Manager
に移動し、個々のWebカメラを一時的に無効にしてから、スクリプトを再度実行して、どのような変更が行われるかを確認することをお勧めします。そのウェブカメラを有効にして、変更点を確認します。 (最悪のシナリオでは、有効化/無効化の代わりに、特定のウェブカメラをインソール/再インシントすると、ウィンドウがそれらを正しく解決する可能性があります)。
まず、WebカメラをOPENCVに接続できるかどうかをテストする必要があります。
1つのWebカメラのみを接続し、cv2.VideoCapture(0)
を使用してプログラムを実行します。パラメーター0は、単一のカメラが接続されていることを意味します。あなたのウェブカメラがすべて大丈夫ならば、それはインデックスの問題になります、 カムに割り当てられたdeviceIDを見つける になるコードがあります。
残念ながら一部のウェブカメラが失敗した場合、それは困難になります。
この場合、SDKを使用して取得する独自の関数を作成し、イメージをcv :: Matに書き込む必要があります。