Python
OpenCV

Python + OpenCV で顔切り出し

More than 1 year has passed since last update.

目標

TensorFlowで顔認識を実装したいので.顔データを集めて正規化するために,画像から顔をトリミングしたい

本気の備忘録

環境

jupyter notebook
OpenCV3.0
Python3.5

.pyファイルと同じディレクトリにレナさんとhaarcascade_frontalface_alt.xmlを入れるか,パス書き直してください.

コード

trimming.py
import cv2
import matplotlib.pyplot as plt
%matplotlib inline

#画像読み込み
src_image = cv2.imread('lenna.jpeg')
#グレースケールに変換
dst_image = cv2.cvtColor(src_image,cv2.COLOR_RGB2GRAY)
#Haar-like分類器読み込み
cascade=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
#カスケード実行して検出した顔の座標情報をfacerectへ格納
#[四角形の左上X座標,四角形の左上Y座標,顔画像のX軸方向への長さ,顔画像のY軸方向への長さ] ここあってるか不安
facerect = cascade.detectMultiScale(dst_image, scaleFactor=1.1, minNeighbors=1, minSize=(1, 1))
#顔が1つ以上検出された時
if len(facerect) > 0:
    for rect in facerect:
        dst_image = dst_image[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
#顔が検出されなかった時
else:
    print("no face")
#これしとくとグレースケールになる.謎
dst_image = cv2.cvtColor(dst_image,cv2.COLOR_GRAY2RGB)

plt.imshow(dst_image)

まとめ

imread()で読み込んだカラー画像をimshow()でグレースケールで表示する時は,
cvtColorでRGB→グレーにして,もう一度cvtColorでグレー→RGBにしないといけないらしい.多分

この辺もわかり次第追記しようかと思います.

2016/11/30追記

これじゃあ保存してねえよな?ってことで
トリミングして保存する機構を作りました.jupyterとはおさらばして,
PyCharmで作業しています.pycharm便利

trimming.py
import cv2

cascade_path = "./haarcascades/haarcascade_frontalface_alt.xml"
origin_image_path = "画像のフォルダパス"
dir_path = "画像の保存先パス"

i = 0

for line in open('テキストファイルのパス','r'):
    line = line.rstrip()
    print(line)
    image = cv2.imread(origin_image_path+line,0)
    if image is None:
        print('Not open : ',line)
        quit()

    cascade = cv2.CascadeClassifier(cascade_path)
    facerect = cascade.detectMultiScale(image, scaleFactor=1.1, minNeighbors=1, minSize=(10, 10))

    if len(facerect) > 0:
        for rect in facerect:
            # 顔だけ切り出して保存
            x = rect[0]
            y = rect[1]
            width = rect[2]
            height = rect[3]
            dst = image[y:y + height, x:x + width]
            save_path = dir_path + '/' + 'image(' + str(i) + ')' + '.jpg'
            #認識結果の保存
            cv2.imwrite(save_path, dst)
            print("save!")
            i += 1
print("Finish")

画像が入っているフォルダで$ls > hoge.txtすることで,テキストに1行ずつ書き込める
書き込んだ画像の名前を読み取りながらあったら開いてトリミング,保存という流れ

rstrip()噛ませないとなぜか画像が読み込めず...

でもこれ,画像のリサイズとかしてなくね?(続く)

参考サイト

像の一部を切り抜いて保存
http://clngn.hatenablog.com/entry/20120113/1326442326
Pythonで遊んでみる -part1- (OpenCVで顔認識)
http://www.takunoko.com/blog/python%E3%81%A7%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B-part1-opencv%E3%81%A7%E9%A1%94%E8%AA%8D%E8%AD%98/