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

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

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

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

Python

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

解決済

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

takashiiii
takashiiii

総合スコア8

OpenCV

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

Python

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

1回答

0評価

0クリップ

1577閲覧

投稿2021/12/16 07:34

編集2022/01/12 10:55

前提・実現したいこと

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

import cv2 import numpy as np camera0 = cv2.VideoCapture(1,cv2.CAP_DSHOW) # カメラCh.(ここでは0)を指定 # 動画ファイル保存用の設定 fps = int(camera0.get(cv2.CAP_PROP_FPS)) # カメラのFPSを取得 w = int(camera0.get(cv2.CAP_PROP_FRAME_WIDTH)) # カメラの横幅を取得 h = int(camera0.get(cv2.CAP_PROP_FRAME_HEIGHT)) # カメラの縦幅を取得 fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) video = cv2.VideoWriter('video.mp4', fourcc, fps, (w, h)) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) camera1 = cv2.VideoCapture(2,cv2.CAP_DSHOW) fps1 = int(camera1.get(cv2.CAP_PROP_FPS)) # カメラのFPSを取得 w1 = int(camera1.get(cv2.CAP_PROP_FRAME_WIDTH)) # カメラの横幅を取得 h1 = int(camera1.get(cv2.CAP_PROP_FRAME_HEIGHT)) # カメラの縦幅を取得 fourcc1 = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') # 動画保存時のfourcc設定(mp4用) video1 = cv2.VideoWriter('video1.mp4', fourcc1, fps, (w1, h1)) # 動画の仕様(ファイル名、fourcc, FPS, サイズ) # 撮影=ループ中にフレームを1枚ずつ取得(qキーで撮影終了) 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 # 撮影用オブジェクトとウィンドウの解放 camera0.release() camera1.release() cv2.destroyAllWindows()
ソースコード

試したこと

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

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

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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は変えられないように感じています.

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

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

Python

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