Python版OpenCVでアニメ顔を検出

この記事では、Python+OpenCVでCascade識別器(分類器)を実装し、画像からアニメ顔を検出する方法をソースコード付きで解説します。

Haar Cascade

OpenCVでは、cv2.CascadeClassifierとdetectMultiScaleメソッドでカスケード型識別器を実装できます。

書式

cascade = cv2.CascadeClassifier(path)
face = cascade.detectMultiScale(src, scaleFactor, minNeighbors, minSize)
パラメータ名 説明
path 使用するカスケード識別器のファイルパス
src 入力画像
scaleFactor 画像スケールにおける縮小量
minNeighbors 矩形を要素とするベクトル
minSize 探索窓の最小サイズ(これより小さい対象は無視)
face 探索結果(見つかった場所の左上座標・幅・高さを格納したリスト)

今回はアニメの顔を検出するために有志がGithubで公開してくださっている「lbpcascade_animeface.xml」を使います。
このカスケード型識別器は下記URL先から入手できます。
https://github.com/nagadomi/lbpcascade_animeface

ソースコード(Python3 + OpenCV3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import cv2


def main():
    # 入力画像の読み込み
    img = cv2.imread("input.jpg")
    
    # カスケード型識別器の読み込み
    cascade = cv2.CascadeClassifier("lbpcascade_animeface.xml")
    
    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # アニメ顔領域の探索
    face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
    
    # 顔領域を赤色の矩形で囲む
    for (x, y, w, h) in face:
        cv2.rectangle(img, (x, y), (x + w, y+h), (0,0,200), 3)

    # 結果を出力
    cv2.imwrite("output.jpg", img)

    
if __name__ == '__main__':
    main()

実行結果

サンプルプログラムの実行結果です。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!