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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

1回答

1595閲覧

OpenCV-pythonでの顔認識が長時間行えません

Dr.DOS

総合スコア1

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2023/07/31 23:41

実現したいこと

・クラッシュすることなく継続的に顔認識が行える状態

前提

USBカメラからの映像を取り込み、OpenCV-python(CPU処理)を用いて、だれが入室してきたのかを顔認識で判別するシステムを作ろうとしているのですが、テスト時に以下の問題が発生して解決できずにいます。

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

顔写真を用いて認識のテストを行っていると、数十秒ほどで以下のエラーを吐いてプログラムがクラッシュします

[ WARN:0@53.455] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638 (WARN:0@の後ろにある数字は時間(秒)で一定ではなく、変わります)

該当のソースコード

https://office54.net/python/opencv/movie-face-authentication
のソースコードほぼそのままとなり、殆どカスタマイズは行っていません

python

1import cv2 2cascade = cv2.CascadeClassifier("c:/Users/Streamer/Downloads/haarcascade_frontalface_default.xml") 3cap = cv2.VideoCapture(1) 4if not cap.isOpened(): 5 print("カメラが正常ではありません") 6 exit() 7# カメラから連続的にキャプチャ画像を取得 8while True: 9 # Bool値とキャプチャ画像を変数に格納 10 ret, frame = cap.read() 11 # キャプチャ画像が正しく読み込めたかの確認 12 if not ret: 13 print("画像を正しく読み込めませんでした") 14 break 15 # 画像データをグレースケール化(白黒) 16 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 17 # 顔を検出する 18 lists = cascade.detectMultiScale(frame_gray, minSize=(50, 50)) 19 # forですべての顔を赤い長方形で囲む 20 for (x,y,w,h) in lists: 21 cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 0, 255), thickness=2) 22 # 顔認識を行っている画像を表示 23 cv2.imshow('video image', frame) 24 # qが押されたらwhileから抜ける 25 if cv2.waitKey(1) == ord('q'): 26 break 27cap.release() 28cv2.destroyAllWindows()

試したこと

もともと複数の顔を認識させてテストしていたのを一つの顔のみに絞る
→クラッシュまでの時間は伸びたが結局クラッシュ

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

Python 3.11.4 / OpenCV-Python 4.8.0.74

端末スペック:
OS:Windows 10 Pro x64 21H2(Build 19044.3086)
CPU: Intel Core i5-9400
GPU: NVIDIA Quadro P620
RAM: 8GB

同時に別のカメラの映像をOBSで配信します。
映像ビットレートは2500kbps、エンコーダはNVENC H.264のハードウェアエンコードで、プリセットがP7(Slowest)です

画像処理中のCPU使用率が50-60%、アイドル(配信のみ)時で18%ほどです

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

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

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

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

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

jbpb0

2023/08/12 00:59 編集

> [ WARN:0@53.455] global cap_msmf.cpp:1759 CvCapture_MSMF::grabFrame videoio(MSMF): can't grab frame. Error: -2147483638 https://qiita.com/grinpeaceman/items/10bb46de3adfeb915ed0 のコード中のコメントに、それに対策したらしきことが書かれてます (質問者さんの環境に合致するかどうか分かりませんが) 上記webページのコードのように「cv2.VideoCapture」に「cv2.CAP_DSHOW」を付けてもダメでしょうか?
guest

回答1

0

以下、私のUSBカメラに対する意見です。

USBのカメラの信頼性は低いです。

  • パソコンの負荷が高くても、
  • 機器の接続数が多くても(通信すらしていなくても)、
  • 給電が不安定でも、
  • カメラの解像度が高ければ高いほど、

クラッシュしたりノイズが乗りやすくなります。反対に、解像度の低いカメラは安定性が高いです。

一度起きたエラーを解消するには、大概OS再起動するかUSBを抜き差しするくらいしかありません。バッファをいじったり解像度をフルHDくらいに絞ったりスレッドを分けたりでいくらかマシにはできますが、どうしても安定性には限界があります。

対策としては、USB接続を止める、が良いです。mipi接続のボートPCからLAN経由でデータを飛ばしても良いでしょうし、産業用IPカメラを使うのも良いと思います。

USB接続のカメラはプログラムのデバグ用だとか、開発段階のおもちゃくらいの用途とした方が良いと思います。

投稿2023/08/01 00:44

編集2023/08/01 00:47
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問