LoginSignup
2
7

More than 3 years have passed since last update.

30行で顔認識(OpenCV)してファイル出力!

Posted at

やること

  • 前回記事でGoogle画像検索結果をスクレイピングし、画像データをダウンロードしました。
  • 今回は、人物の画像データをダウンロードしておき、その人物の顔部分をOpenCVで認識させ、顔画像のデータを作成したいと思います。

手順概要

  1. cascadeファイルの準備
  2. 画像データの準備
  3. 顔認識 & ファイル出力

動作環境

  • macOS Catalina 10.15 beta
  • anaconda 4.6.14
  • Python 3.6.8
  • opencv 3.4.2

1. cascadeファイルの準備

  • 私の場合はanacondaで環境構築をしているため、"anaconda3/pkgs/.../haarcascades/"の中に「haarcascade_frontalface_default.xml」があります。(Finderなどで検索してみてください)
    それをコピーして、実行ファイルと同じディレクトリに格納しました。
  • ファイルが無い場合は、GitHub上からダウンロードしてください。
1.cascadeファイルの準備
import os
import cv2

HAAR_FILE = "./haarcascade_frontalface_default.xml"
face_cascade = cv2.CascadeClassifier(HAAR_FILE)

2. 画像データの準備

  • 入力元ファイルと出力先ファイルを格納するフォルダ(input/output)を作成しておき、入力元には複数の画像データ(.jpg)を格納しておきます。
2.画像データの準備
IN_PATH = './input/'
OUT_PATH = './output/'

def get_file(dir_path):
    file_names = os.listdir(dir_path)
    return file_names

images = get_file(IN_PATH)

3. 顔認識 & ファイル出力

  • 画像データを読み込みます(imread)
  • 画像を検出しやすいようにグレースケールに変換します(cvtColor)
  • 顔認識を実行するため、1.で読み込みしたcascadeを利用します
    detectMultiScaleの戻り値は、下記のリストになります
    • x座標
    • y座標
    • 横幅
    • 縦幅
  • 顔の範囲を抽出、または範囲を赤枠(OpenCVのimreadはBGRの順)で囲み、それぞれのファイルを出力します
  • rectangleは四角形を描画します。
    • rectangle(画像, 左上座標, 右下座標, 色, 線の太さ)
3.顔認識&ファイル出力
for i in images:

    # read image
    img = cv2.imread(IN_PATH + i)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # face detection
    face = face_cascade.detectMultiScale(gray)

    # get face area
    for x,y,w,h in face:
        face_cut = img[y:y+h, x:x+w]
    # wrap in red frame
    for x,y,w,h in face:
        cv2.rectangle(img, (x,y), (x+w, y+h), (0, 0, 255), 2)

    cv2.imwrite(OUT_PATH + '{}_face_cut.jpg'.format(i.replace('.jpg', '')), face_cut)
    cv2.imwrite(OUT_PATH + '{}_face_rectangle.jpg'.format(i.replace('.jpg', '')), img)

実行結果

  • 実行前後の画像データは以下の通りです。

【実行前】

1. 001.jpg

001.jpg

2. 002.jpg

002.jpg

3. 003.jpg

003.jpg

【実行後】

1.

001_face_cut.jpg

001_face_cut.jpg

001_face_rectangle.jpg

001_face_rectangle.jpg

2.

002_face_cut.jpg

002_face_cut.jpg

002_face_rectangle.jpg

002_face_rectangle.jpg

3.

003_face_cut.jpg

003_face_cut.jpg

003_face_rectangle.jpg

003_face_rectangle.jpg

ソースコード

参考文献

2
7
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
2
7