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

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

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

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

Q&A

解決済

1回答

989閲覧

ウェブカメラ2台をUSBハブに繋ぐと正常動作しません

yyicp

総合スコア75

Python

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

0グッド

0クリップ

投稿2023/11/06 01:15

編集2023/11/06 06:43

実現したいこと

ウェブカメラの画像をpythonで表示・保存しようとしています。
ウェブカメラ(0、1、2とします)は3台あって、各々PC本体のUSBポートまたはUSBハブに接続して使用します。
0と1をPC本体のUSBポートに、2をUSBハブに接続すると3つの画面を順番に保存することができました。
0をPC本体のUSBポートに、1と2をUSBハブに接続すると0と1の画面しか保存できず、2の画面は保存できず、下のようなエラーメッセージが出ました。原因と対策を教えてください。

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

C:・・・\Python\testCV157 [ WARN:1@20.231] global cap_msmf.cpp:471 `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): OnReadSample() is called with error status: -1072875772 [ WARN:1@20.245] global cap_msmf.cpp:483 `anonymous-namespace'::SourceReaderCB::OnReadSample videoio(MSMF): async ReadSample() call is failed with error status: -1072875772 [ WARN:0@20.253] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -1072875772 Traceback (most recent call last): File "・・・\Python\testCV157\testCV157.py", line 37, in <module> schedule.run_pending() File "・・・\Python\Python311\Lib\site-packages\schedule\__init__.py", line 822, in run_pending default_scheduler.run_pending() File "・・・\Python\Python311\Lib\site-packages\schedule\__init__.py", line 100, in run_pending self._run_job(job) File "・・・\Python\Python311\Lib\site-packages\schedule\__init__.py", line 172, in _run_job ret = job.run() ^^^^^^^^^ File "・・・\Python\Python311\Lib\site-packages\schedule\__init__.py", line 693, in run ret = self.job_func() ^^^^^^^^^^^^^^^ File "・・・\Python\testCV157\testCV157.py", line 30, in job cv2.imwrite(fname2, frame2) cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp:783: error: (-215:Assertion failed) !_img.empty() in function 'cv::imwrite'

該当のソースコード

import cv2 import datetime import schedule import time capture0 = cv2.VideoCapture(0) capture1 = cv2.VideoCapture(1) capture2 = cv2.VideoCapture(2) def job():#一台ずつ順番に撮影し、その時刻で保存する ret, frame0 = capture0.read() strdate0=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') fname0=".\\files3\\"+"image0_" + strdate0 + ".png" cv2.imwrite(fname0, frame0) ret, frame1 = capture1.read() strdate1=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') fname1=".\\files3\\"+"image1_" + strdate1 + ".png" cv2.imwrite(fname1, frame1) ret, frame2 = capture2.read() strdate2=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') fname2=".\\files3\\"+"image2_" + strdate2 + ".png" cv2.imwrite(fname2, frame2) #do job every 10 seconds schedule.every(1/6).minutes.do(job) while True: schedule.run_pending() time.sleep(1)

試したこと

デバイスマネージャ→カメラで、HD USB Cameraは3台とも正常動作していることを確認しました。

別のPythonプログラムを実行した結果は以下の通りです。
port number 0 Find!
port number 1 Find!
port number 2 Find!
Number of connected camera: 3

cv2.CAP_DSHOW(DirectShow)を明示的に指定して実行した結果、0と1には正しい画像が保存されていましたが、2には真っ暗な画像が保存されていました。ソースコードは以下の通りです。

Python

1def job(): 2 for camera_number in range(0, 3): 3 # for windows -> cv2.CAP_DSHOW 4 cap = cv2.VideoCapture(camera_number,cv2.CAP_DSHOW) 5 ret, frame = cap.read() 6 7 if camera_number==0: 8 strdate0=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') 9 fname0=".\\files4\\"+"image0_" + strdate0 + ".png" 10 cv2.imwrite(fname0, frame) 11 12 elif camera_number==1: 13 strdate1=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') 14 fname1=".\\files4\\"+"image1_" + strdate1 + ".png" 15 cv2.imwrite(fname1, frame) 16 17 elif camera_number==2: 18 strdate2=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') 19 fname2=".\\files4\\"+"image2_" + strdate2 + ".png" 20 cv2.imwrite(fname2, frame)

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

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

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

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

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

maisumakun

2023/11/06 01:32

同時に動かそうとするとバスパワーの電力が不足する、なんてことはないでしょうか?
melian

2023/11/06 01:46

接続されているウェブカメラは1台ですが、似た様な問題が報告されていて、原因は AntiVirus ソフトウェア(Kaspersky)との事です。 Video Capture from webcam only works when debugging · Issue #23119 · opencv/opencv https://github.com/opencv/opencv/issues/23119
fana

2023/11/06 02:35

USBハブを使うと帯域がどうの~みたいな話があったような?
can110

2023/11/06 04:15

別のPythonプログラムと同じように MSMF(Microsoft Media Foundation) の代わりに cv2.CAP_DSHOW(DirectShow)を明示的に指定して実行した結果を本文に追記ください。
yyicp

2023/11/06 06:21

>can110様 追記しましたので、ご確認ください。 ソースは下手くそだと思いますので、その点は申し訳ありません。 よろしくお願いします。
yyicp

2023/11/06 06:32

>maisumakun様 コメントありがとうございます。 今私が使用しているハブはAC100Vで駆動しているものなので、 残念ながらパワー不足という可能性は低いと思います。 >melian様 コメントありがとうございます。 私が使用しているPCのウイルスソフトはAntiVirusではなく、Trend Microです。 >fana様 コメントありがとうございます。 帯域の問題かもしれないとのご指摘、頭に入れておきます。
can110

2023/11/06 06:36

「別のPythonプログラム」を実行したら「Number of connected camera: 3」以外にも カメラ番号と実際の画像ファイルができると思います。 その結果(正常or異常)も記載ください。(カメラ番号が0,1,3など飛んでいないか?)
yyicp

2023/11/06 07:16 編集

>can110様 「別のPythonプログラム」の実行結果を追記しました。 カメラ番号は0、1、2です。 各画像は正常です。
can110

2023/11/06 07:09

あとプログラムの違いとしては - cap.read()の戻り値(成否)も確認している - 正常だった3秒後にファイル保存している くらいなので、その部分も動きを合わせてみるのは試してみる価値あると思います。
退会済みユーザー

退会済みユーザー

2023/11/06 10:07 編集

fanaさんが書いていますが、USB機器(USBハブも含みます)は「つなぐだけ」で帯域を浪費するようです。特に高解像度のカメラだとこの傾向が顕著で、まともに動かそうとするとたぶんUSBのポートごとにコントローラがないとうまくいきません(普通はUSBポート4つでコントローラ1つくらいと思います)。 なので、(VGAのような低解像度でない限り、)カメラ3つは動作が不安定になります。 他の質問にも書いたことがありますがUSB機器はデバグ用位にとらえて、ちゃんとやるにはLANで動くカメラかmipi接続のカメラにした方が良いです。
yyicp

2023/11/08 02:24

>fourteenlength様、fana様 コメントありがとうございます。 自分でも少し調べてみました。 ご指摘のように、USBハブを用いてUSBカメラの複数台同時接続には帯域不足という問題があることが分かりました。 私の今回の状況では、現象がほぼ定常なので、各USBカメラの取得画像が同時であることを諦めて 複数のカメラ画像を順番に保存するということで解決しました。 コードは「別のPythonプログラム」を参考に書きました。 皆様、どうもありがとうございました。
guest

回答1

0

自己解決

Python

1import cv2 2import time 3import datetime 4 5# カメラ画像を順番に保存するコード(撮影時刻の同時性を諦める) 6def check_camera_connection_display(save_flag=True): 7 for j in range(0,3):#各カメラが保存する枚数 8 for camera_number in range(0, 3):#カメラの数 9 cap = cv2.VideoCapture(camera_number,cv2.CAP_DSHOW) 10 11 ret, frame = cap.read() 12 13 if ret is True: 14 start = time.time() 15 16 while True: 17 elasped_time = time.time() - start 18 ret2, frame = cap.read() 19 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 20 21 if elasped_time > 3.0: 22 if save_flag : 23 # save data file 24 strdate=datetime.datetime.now().strftime('%Y%m%dT%H%M%S.%f') 25 fname=".\\files\\"+ str(camera_number) +"_" + strdate + ".png" 26 cv2.imwrite(fname, gray) 27 28 break 29 30 # cv2.imshow(f'Camera Number: {camera_number}',gray) 31 32 if cv2.waitKey(1) & 0xFF == ord('q'): 33 break 34 35 cap.release() 36 cv2.destroyAllWindows() 37 38if __name__ == '__main__': 39 check_camera_connection_display(save_flag=True)

投稿2023/11/08 02:25

yyicp

総合スコア75

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問