石油王研究課|CIFLAB

CIFLAB石油王研究課の活動ブログです。

python+opencvで個人認識 その1

個人認識したい

ちょっと個人認識したいなと思ったので、何はともあれ学習データを集めるところから始める。

使ったものは

取りあえず自分を認識させたいので自分の顔画像を集めるところから始める。
最初は自宅の背景を

f:id:fortis3m:20180415171357p:plain

良い感じに消して顔写真を撮りまくろうと思った。

元々撮影した背景と各フレームごとのデータを引き算してあげればいい感じになるのではと思って

def delete_background(frame,bcg):
    src_img = frame - bcg
    src_img[src_img <= 100] = 0

    print(src_img)
    return src_img

こんな関数を作った。ただ、

f:id:fortis3m:20180415171614p:plain

こんな感じになってしまい、綺麗に消せなかった。

だから結局は適当な範囲を抽出して画像を保存することにした。

以下ソースコード

import cv2
import time
import numpy as np

def delete_background(frame,bcg):
    src_img = frame - bcg
    src_img[src_img <= 100] = 0

    print(src_img)
    return src_img

def capture_camera(mirror=False, size=None):

    img_no = 1

    cv2.namedWindow("Get_faceimg")
    cap = cv2.VideoCapture(0)

    background = cv2.imread('img/bcg.png',cv2.IMREAD_COLOR)

    while True:

        now = int(time.time())

        # retは画像を取得成功フラグ
        ret, frame = cap.read()

        # 鏡のように映るか否か
        if mirror is True:
            frame = frame[:,::-1]

        # フレームをリサイズ
        # sizeは例えば(800, 600)
        if size is not None and len(size) == 2:
            frame = cv2.resize(frame, size)
        
        width = frame.shape[1]
        height = frame.shape[0]

        rect_startx = int(width/4)
        rect_endx = int(3*width/4)

        rect_starty = int(height/8)
        rect_endy = int(7*height/8)

        cv2.rectangle(frame, (rect_startx-1, rect_starty-1), (rect_endx+1, rect_endy+1), (0, 0, 255), 1)

        #frame = frame - background
        #frame = delete_background(frame,background)
        # フレームを表示する
        cv2.imshow('camera capture', frame)
        cv2.imshow('save capture', frame[rect_starty:rect_endy,rect_startx:rect_endx])

        k = cv2.waitKey(10) # 10msec待つ
        if k == 27: # ESCキーで終了
            break
        elif k == 0x73:
            cv2.imwrite('faceimg/' + str(now) + '.png',frame[rect_starty:rect_endy,rect_startx:rect_endx])
        elif k == 32:
            delete_background(frame,background)
            #cv2.imwrite('img/bcg.png',frame)

    # キャプチャを解放する
    cap.release()
    cv2.destroyAllWindows()

if __name__ == '__main__':
    capture_camera(size = (800,600))

背景を消すところはrgbじゃなくてhsvで処理すべきだったかもしれない。久しぶりに画像を扱うので色々とセオリーを忘れている感がいなめない。

次辺りは適当に画像データを集めて、今回の顔写真を使って識別器を作っていきたい。svmか流行りのcnnのどちらかを使おうと思っている。