0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【顔認識入門】haar cascadesで遊んでみた♪

Last updated at Posted at 2019-09-27

今日は、今更感があるが「ウワンさんこんにちわ」と言ってほしくて、まず顔認識で遊んでみた。
Opencvのhaar cascadesを使った顔認識やってみた。
コードは、最初は参考②のものが見やすいので、まんま利用させていただいた。
解説は参考①が詳しい。
【参考】
【入門者向け解説】openCV顔検出の仕組と実践(detectMultiScale)
python+OpenCVで顔認識をやってみる
####やったこと
・とりあえず動かしてみる
・動画に適用する
###・とりあえず動かしてみる
上記の参考コードをとりあえず、動かしてみました。
その結果、以下のような画像が得られます。

元画像 生成画像
test.jpg test.jpg
###・動画に適用する
Opencvには以下のような動画適用がありますが、ちょっと読みにくいコードなので、上記の簡単な静止画アプリを改変することとする。
opencv/samples/python/facedetect.py
その結果、以下のようなコードを作成できる。
face_recognition/face_recognition_doga.py

####コード解説
利用するLibはcv2とtimeだけです。

import cv2
from time import sleep

以下は顔認識に利用するxmlです。そして、動画のためのfourccを定義します。

cascade_path = "./models/haarcascade_frontalface_default.xml"

def cv_fourcc(c1, c2, c3, c4):
        return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
            ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)

cascade分類器を定義します。

def main():
    #カスケード分類器の特徴量を取得する
    cascade = cv2.CascadeClassifier(cascade_path)
    color = (255, 255, 255) #白

動画のファイル名等を定義する。

    OUT_FILE_NAME = "./outputs/face_recognition.avi"
    FRAME_RATE=1
    w=224 #1280
    h=224 #960
    out = cv2.VideoWriter(OUT_FILE_NAME, \
          cv_fourcc('M', 'P', '4', 'V'), \
          FRAME_RATE, \
         (w, h), \
         True)    

カメラ入力を定義

    cap = cv2.VideoCapture(1)
    is_video = 'False'
    s=0.1

動画は1フレームずつ撮影保存しています。
fpsを計測して、動画に貼り付けます。

    while True:
        timer = cv2.getTickCount()
        ret, frame = cap.read()
        sleep(s)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
        # Display FPS on frame
        cv2.putText(frame, "FPS : " + str(int(1000*fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);

取得した画像をグレースケールに変換して、それに基づいて顔検出を行います。

        #グレースケール変換
        image_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        #image_gray = cv2.equalizeHist(image_gray)
        facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=2, minSize=(30, 30))

検出した顔に合わせて矩形を作成し、frameに貼り付けます。

        if len(facerect) > 0:
            #検出した顔を囲む矩形の作成
            for rect in facerect:
                cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=2)

frameを表示します。

        cv2.imshow('test',frame)

動画に一枚ずつ保存していきます。

        key = cv2.waitKey(0)&0xff
        if is_video=="True":
            img_dst = cv2.resize(frame, (int(224), 224))
            out.write(img_dst)
            print(is_video)

以下のキー入力で動画のfpsを変更できます。
あるいは、qで終了します。

        if key == ord('q'):
            #cv2.destroyAllWindows()
            break
        elif key == ord('p'):
            s=0.5
            is_video = "True"
        elif key == ord('s'):
            s=0.1
            is_video = "False"    
if __name__ == '__main__':
    main()

###結果
上記のコードで一応顔認識しつつ動画が動きました。
ちょうと映っていたTVの画面の中の顔認識をしてくれました。
face recognition

※画像をクリックするとYouTube動画につながります
###まとめ
・haar cascadesを動かしてみた
・動画像に対して顔認識してみた

・顔認識しつつ人物認識を実施したい

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?