実現したいこと
・クラッシュすることなく継続的に顔認識が行える状態
前提
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%ほどです
