みなさんこんにちわ、こんばんわ
SAIです。
1.4では、OpenCVで画像解析し、青い枠で表示することができましたね!
でも、静止画を解析するんじゃ、いったん写真を撮って、そのあと解析になっちゃいます。
どうせなら、監視カメラを作ってみたい。
というわけで、今回はウェブカメラを繋いで、
リアルタイムの画像を解析してみようと思います。
画像の解析は、1.4で学んだ通りです。
今回は、ウエブカメラから画像を読み取り、
即座に解析させて、画面に表示を繰り返してみようと思います。
◆1 ウェブカメラの画像取り込み
ウェブカメラの画像を取り込む。
この取り込み処理もcv2に組み込まれていました。
cv2には、VideoCapture()という関数があり、
この戻り値(仮にcapとする)のアイテムで
カメラとのセッションを繋いでいるようなイメージになります。
画像を取得するには、
戻り値capからread()を呼び出すことで、最新画像が取得できます。
具体的には、
cap = cv2.VideoCapture(0) #キャプチャアイテム取得
ret, img = cap.read() #画像取得
こんな感じでimgに画像が取り込まれますね。
VideoCapture()
の引数は、デバイスNoになります。
SAIはノートPCで作業をしたのですが、
ノートPCのインカメラが0番に当たっていました。
WEBカメラが何番かわからないのでforでぐるぐる回してみたのですが、
結局わからず。
悩みに悩んでとった方法は・・・・
内蔵カメラを無効化して、WEBカメラを0番に割り当ててしまう。
写真は”有効にする”になっていますが、無効にしているのでこの画像になってます。
これでうまくいきました。
◆2 解析画像をリアルタイムで表示する。
単純にこれだけ見たら、
何だcv2.imshow()するだけじゃん。
と思うと思いますが、そうはいきませんでした。
waitKey()を呼び出さないと、白い画面が表示されるだけです。
もしかしてタイムスライスで低レベルGUIにタスクが回らないからかな?と思い、
time 関数によりsleep()を100msかけてみたのですが、やっぱり駄目です。
よくよく調べてみると、imshow()はウィンドウに対して
描画したい”画像データを転送”するものの、
このデータを描画するためには、
waitKey()の中にあるメッセージプロシージャっていうのかな?
を、呼び出さないと動いてくれないようです。
描画のたびにキーなんて押したくない・・・
悩んでいたのですが、
よく考えたらwaitKey()の引数は待ち時間です。
つまり、1ms 町に設定してしまえばwaitを抜けてくれるはず。
#最新画像を表示
cv2.imshow('img', img)
#imshowの絵を描画するコマンドがwaitkeyに入っているらしく、waitkeyによる1msキー待ち
#実際には1ms後に抜けるのでこのままで随時画面更新になる。
cv2.waitKey(1)
これで、1ms待ちごとに画像解析を行うことができました。
ウェブカメラでPCの画面をぐるぐるしながら青枠が顔に追従しますね!
これで、リアルタイム顔認識の出来上がりです!
イイ感じで画像認識ができていますね!
本日はここまでです。
それでは本日使用したコードを載せておきます。
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
import numpy as np
import cv2
#顔認識カスケード
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#Videoキャプチャ
cap = cv2.VideoCapture(0)
#繰り返し
while(True):
#最新画像を取得
ret, img = cap.read()
#グレースケール化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#顔を認識
faces = face_cascade.detectMultiScale(gray)
#認識箇所を青枠で囲む
for (x,y,w,h) in faces:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
#最新画像を表示
cv2.imshow('img', img)
#imshowの絵を描画するコマンドがwaitkeyに入っているらしく、waitkeyによる1msキー待ち
#実際には1ms後に抜けるのでこのままで随時画面更新になる。
cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
![]()
それではまたね

