python+opencvで個人認識 その1
個人認識したい
ちょっと個人認識したいなと思ったので、何はともあれ学習データを集めるところから始める。
使ったものは
取りあえず自分を認識させたいので自分の顔画像を集めるところから始める。
最初は自宅の背景を
良い感じに消して顔写真を撮りまくろうと思った。
元々撮影した背景と各フレームごとのデータを引き算してあげればいい感じになるのではと思って
def delete_background(frame,bcg): src_img = frame - bcg src_img[src_img <= 100] = 0 print(src_img) return src_img
こんな関数を作った。ただ、
こんな感じになってしまい、綺麗に消せなかった。
だから結局は適当な範囲を抽出して画像を保存することにした。
以下ソースコード、
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のどちらかを使おうと思っている。