みなさんこんにちわ、こんばんわ

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()

 

晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ晴れ

 

 

それではまたね