Help us understand the problem. What is going on with this article?

Python + OpenCV で顔切り出し

More than 3 years have 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/

chilitreat
GitHub: https://github.com/chilitreat
iwate-pu
岩手県滝沢市にある公立大学です。Qiitaではソフトウェア情報学部生や出身の人が多いです。
https://www.iwate-pu.ac.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした