質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

7180閲覧

USBカメラを複数つなげた際の表示順番をカメラを識別して固定化したい

August

総合スコア1

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2022/03/31 00:09

現在pythonでopencvにて複数カメラのキャプチャを試しているのですが、
PCにはUSB拡張(3ポートに拡張)を接続し、その先3ポートに同じカメラ3つを接続して試しているのですが、
ほかのPCにUSB拡張ごと繋ぎ変えたり、拡張先のUSBの順番を入れ替えたりすると表示されるイメージの順番が入れ替わってしまいます。
カメラ毎に識別して表示の順番を固定化する方法をご教授願いたいです。

python

1#この関数を3台分呼ぶ 2def ConnectCamera( self,device ): 3 4logger.info( self.TAG + 'カメラデバイスと接続開始します。:' + self.device ) 5 if device == 'USB-CAM0': 6 self.cap = cv2.VideoCapture( 0 ) 7 # カメラ0 8 elif device == 'USB-CAM1': 9 self.cap = cv2.VideoCapture( 1 ) 10 # カメラ1 11 elif device == 'USB-CAM2': 12 self.cap = cv2.VideoCapture( 2 ) 13 #カメラ2 14 else: 15 self.cap = cv2.VideoCapture( self.device ) 16

cv2.VideoCapture()のカッコ内の数値を変えると表示される順番も変わるので
そこを何らかの方法で識別できればできそうな気もしておりますが、、、
現在はカッコ内の数字をいちいち入れ替えているのでそこをプログラム上で固定化させたいです。
表示方法ですが、カメラそれぞれのスレッドを立ててキューに入れる⇒キューから取り出す⇒QTのラベルに表示
をループで繰り返しています。
ですがスレッドを別々で立てているのでそこはあまり関係ないのかなと思案しております。
見づらいコードで申し訳ないです。

退会済みユーザー👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/03/31 02:25 編集

リファレンスに CAP_PROP_GUID とかいうのがあったので何か固有の値が取れないかな?と試してみたけど,(私の環境では?)カメラに依らず常に-1が返ってきた…… --- 実行時に人手を介して良いならば,人間が映像を見ながらカメラを選択させるだとか,あるいは特定のパターンをカメラに見せて認識させることで決定するだとか,そういう類の処理を実装すればよかろうとか思うけど, 「必ず全自動でいきなりちゃんと動いて欲しい」という話だと少なくとも OpenCV の範疇では手段が無いと思う. (別途何かしらの手段で環境側に対して環境固有の方法で問い合わせるような話が必要な予感…?)
August

2022/03/31 04:07

返答ありがとうございます。やはりopencvの範疇では厳しいものがありますかね。 一時的に映してマーカー(QRなど)を認識させてその結果によって位置を変更させるなどのやり方になるという認識で組みなおしてみます。 ご丁寧にありがとうございました!
fana

2022/03/31 04:20

(全然関係ないけど,↑の CAP_PROP_GUID を試そうとしたらそれ以前にVideoCaptureのopenが常に失敗する事態が発生して苦悶した.原因は単にWin10の設定でカメラが禁止されてることだったという…)
August

2022/03/31 04:23

あるあるですね(笑)、CAP_PROP_GUIDも試してみます!
fana

2022/03/31 04:24

> マーカー(QRなど)を認識 3台程度なら簡便に「単色の 赤/緑/青 を視野いっぱいに見せてやる」とかそういうのでも良いかも. カメラ「何か急に視界がめっちゃ赤い! 俺が1番目に違いない!」 みたいな.
August

2022/03/31 04:30

なるほど。やり方はいくらでもありそうですね!ありがとうございます
退会済みユーザー

退会済みユーザー

2022/03/31 14:39 編集

USB機器のシリアル番号を拾うのが一番強そうです。Python単体だと難しいかもですが…。 追補: PyUSBだとシリアル番号を拾えるともありますね。p.29 > serial_number > Return the USB device’s serial number string descriptor https://pyusb-docs.readthedocs.io/_/downloads/ja/latest/pdf/
August

2022/04/01 00:56

返答ありがとうございます。PyUSBですか、初めて拝見しました。PDFを見てきましたが、またデバイスIDとは違いそうなのでやってみます!
guest

回答1

0

ベストアンサー

cv2.VideoCapture()のカッコ内の数値を変えると表示される順番も変わるので
そこを何らかの方法で識別できればできそうな気もしておりますが、、、

これは"USBカメラを接続した順番に"数値が割り振られます。

解決策1:力技 USBポートの電源を切り替える(お手製回路必須)
力技ですが、USBHUBを自作して、1ポートずつ電源を入れていく、とするとポートごとに制御できます。

解決策2:PyUSBをLinuxから使う
PyUSBでシリアル番号をWindowsで拾えたかどうか覚えがなく。Linuxであればいけますし、USBのカメラ番号○○(LinuxなのでUSBカメラまでの絶対パス指定で)のシリアルは?みたいな使い方もできたはずです。

解決策2':PyUSBをWindows上のLinuxから使う
いまのWindowsはLinuxをエミュレータなしに走らせられるらしいので、Windowsの中のLinux経由であれば同じことができる可能性もあります。

投稿2022/04/01 09:59

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

August

2022/04/04 07:44

回答ありがとうございます。 なるほど()内の値は接続された順番なのですね。 正直力業が一番手っ取り早い気がしますが、無理そうなので下2つの方法を試してみます!
退会済みユーザー

退会済みユーザー

2022/04/04 12:10

もしうまくいかなかったらLinuxでpyudevも試してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問