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

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

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

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

Python

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

Q&A

解決済

1回答

9278閲覧

python opencvのプログラムでusbカメラ2台以上を用いて同時に映像の出力,録画を行いたい!!

takashiiii

総合スコア8

OpenCV

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

Python

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

0グッド

0クリップ

投稿2021/12/16 07:34

編集2021/12/20 07:46

前提・実現したいこと

python初心者です.
python opencvを使用して,usbハブに接続したusbカメラ2台以上から同時に映像を出力+録画を行うプログラムを作成したいのですがエラーをはいてしまいます.
最終的には8台ほど接続して同様のことを行いたいのでそちらにも応用できるとありがたいです.(その場合は帯域の問題がありますが)

発生している問題・エラーメッセージ

1台目のカメラからは問題なく出力,録画が可能なのですが2台目以降は映像データを読み込むことが出来ていません.
usbカメラ自体の接続は確認できていて,デバイスの認識もコードによって確認できています.

エラーメッセージ Traceback (most recent call last): File "C:\Users*******\Documents******\python code\sample_code2dai.py", line 34, in <module> cv2.imshow('camera1', frame1) # フレームを画面に表示 cv2.error: OpenCV(4.5.4-dev) D:\a\opencv-python\opencv-python\opencv\modules\imgproc\src\color.cpp:182: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'

該当のソースコード

python

1import cv2 2import numpy as np 3 4camera0 = cv2.VideoCapture(1,cv2.CAP_DSHOW) # カメラCh.(ここでは0)を指定 5 6# 動画ファイル保存用の設定 7fps = int(camera0.get(cv2.CAP_PROP_FPS)) # カメラのFPSを取得 8w = int(camera0.get(cv2.CAP_PROP_FRAME_WIDTH)) # カメラの横幅を取得 9h = int(camera0.get(cv2.CAP_PROP_FRAME_HEIGHT)) # カメラの縦幅を取得 10fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) 11video = cv2.VideoWriter('video.mp4', fourcc, fps, (w, h)) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) 12 13camera1 = cv2.VideoCapture(2,cv2.CAP_DSHOW) 14 15fps1 = int(camera1.get(cv2.CAP_PROP_FPS)) # カメラのFPSを取得 16w1 = int(camera1.get(cv2.CAP_PROP_FRAME_WIDTH)) # カメラの横幅を取得 17h1 = int(camera1.get(cv2.CAP_PROP_FRAME_HEIGHT)) # カメラの縦幅を取得 18fourcc1 = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) 19video1 = cv2.VideoWriter('video1.mp4', fourcc1, fps, (w1, h1)) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) 20 21# 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了) 22while True: 23 ret0, frame0 = camera0.read() # フレームを取得 24 if (ret0 == True ) : 25 cv2.imshow('camera', frame0) # フレームを画面に表示      26 video.write(frame0) # 動画を1フレームずつ保存する 27 28 ret1, frame1 = camera1.read() # フレームを取得 29 if (ret1 == True ) : 30 cv2.imshow('camera1', frame1) # フレームを画面に表示 31 video1.write(frame1) # 動画を1フレームずつ保存する 32 33 34 # キー操作があればwhileループを抜ける 35 if cv2.waitKey(1) & 0xFF == ord('q'): 36 break 37 38# 撮影用オブジェクトとウィンドウの解放 39camera0.release() 40camera1.release() 41cv2.destroyAllWindows()
ソースコード

試したこと

usbカメラの接続,認識
複数カメラを接続した状態でそれぞれを1台ずつ稼働させての映像の出力,録画は可能です.

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

1T2R3M4

2021/12/16 07:41

インデントをつけないで動作させているのですか。
takashiiii

2021/12/16 09:35

インデントというのはwhile ,ifの後の部分ですか? while以降の本来のコードは以下のようになっています.Tabの入力が反映されていなかったようです. 勘違いさせてしまい申し訳ないです. while True:   ret0, frame0 = camera0.read() # フレームを取得     if (ret0 == True ) :       cv2.imshow('camera', frame0) # フレームを画面に表示       video.write(frame0) # 動画を1フレームずつ保存する   ret1, frame1 = camera1.read() # フレームを取得     if (ret1 == True ) :       cv2.imshow('camera1', frame1) # フレームを画面に表示       video1.write(frame1) # 動画を1フレームずつ保存する キー操作があればwhileループを抜ける   if cv2.waitKey(1) & 0xFF == ord('q'):     break
jbpb0

2021/12/16 11:26 編集

> Tabの入力が反映されていなかった pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 質問にコードを載せる際に上記をやってくれたら、ちゃんとインデントが反映されます
takashiiii

2021/12/16 13:11

インデンスの反映ができました.質問するのが初だったので教えていただけて助かりました.
yuki23

2021/12/17 04:07

1台ずつ接続したときは取得できていますか? また、2台接続して1台目を開かないときに2台目を取得できますか?
takashiiii

2021/12/17 05:37

usbハブに複数接続した場合でも1台ずつであればどのカメラでも作動します.
fana

2021/12/17 06:06 編集

ググって出てきた個人ブログですが参考になれば: https://hirasaka001.blogspot.com/2019/03/opencvusb-cam.html こっちは stack overflow : https://stackoverflow.com/questions/29664399/capturing-video-from-two-cameras-in-opencv-at-once 同一のUSBコントローラに複数のUSBカメラだと大域が足りないみたいな話に見える. (stack overflow の質問者は解像度落としたら動いたとか言っている.) usbハブ使わずに USBコントローラ vs カメラ が 1対1 になるような形で接続してみることはできないのでしょうか? (そういう話だとしたら,「最終的には8台…」というのは厳しそう)
takashiiii

2021/12/19 09:02 編集

解像度を160×120まで落としてもダメだったので帯域の問題ではないと勝手に思い込んでいましたが,この話が本当であればusbハブを用いての同時接続という条件では難しそうですね,, usbポートを2つ持つpcで同様のコードを回しましたところ,2台のカメラから映像の取得と録画を行うことが可能でした.やはりこのコードではusbハブの使用はできないようです.
fana

2021/12/24 02:29

可能かどうかわかりませんが,帯域に関しては,カメラ側の撮影解像度だけでなくFPSも落とすようなことは試せないのでしょうか. (FPSを半分にすれば通信量も半減するのでは? とかいう素人考え.) (N個のカメラに対しての 画像取得→動画に書出 という作業をシーケンシャルに行うならそれなりに処理時間がかかるでしょうから,個々のカメラのFPSはそんなに高くなくて良いのではないかな,とか.) ※ググった感じだと,カメラのFPSの設定は効くとか効かないとか効いてるように見えるけど実は変わってないだとか,何かいろいろと面倒そうな話がありそう? ですが…
takashiiii

2022/01/09 13:04

返答が遅れて申し訳ないです. カメラの出力fpsは変える方法はあるかもしれませんがカメラから所得するfpsは変えられないように感じています.
guest

回答1

0

自己解決

帯域の関係でusbポート1つに対して1つのカメラしか接続できないため,パソコンのusbポートを増築する方法で解決しました.

投稿2022/01/09 13:05

takashiiii

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問