« 128×128の1.5インチOLED付Arduino互換ボード”Pixel 2.0” | トップページ | 百均のiPhoneケースもアイデア次第で豪華に!? »

2017年3月12日 (日)

OpenCVによる”アニメ顔”検出

急にアニメ動画から顔を取り出したくなったので、OpenCV用のアニメ顔検出器を探してたんですが、ここのを使うと便利なようです。

OpenCVによるアニメ顔検出ならlbpcascade_animeface.xml - デー

よくある”顔検出器”ではアニメ顔をほとんど検出してくれませんが、ここにある”lbpcascade_animeface.xml”を使うとほんとによく検出してくれます。

入手元:http://anime.udp.jp/data/lbpcascade_animeface.xml

てことで、動画から直接顔を検出するコードを作りました。

◆「movie2face.py

import cv2
import glob

video_path = './(動画ファイル名)'
video_name = video_path[2:8] + '_'
output_path = './movie/'
out_face_path = './face/'
xml_path = "./lbpcascade_animeface.xml"

def movie_to_image(num_cut):

    capture = cv2.VideoCapture(video_path)

    img_count = 0
    frame_count = 0

    while(capture.isOpened()):

        ret, frame = capture.read()
        if ret == False:
            break

        if frame_count % num_cut == 0:
            img_file_name = output_path + str(img_count) + ".jpg"
            cv2.imwrite(img_file_name, frame)
            img_count += 1

        frame_count += 1

    capture.release()

def face_detect(img_list):

    classifier = cv2.CascadeClassifier(xml_path)

    img_count = 1
    for img_path in img_list:

        org_img = cv2.imread(img_path, cv2.IMREAD_COLOR)

        gray_img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)

        face_points = classifier.detectMultiScale(gray_img, \
                scaleFactor=1.2, minNeighbors=2, minSize=(1,1))

        for points in face_points:

            x, y, width, height =  points

            dst_img = org_img[y:y+height, x:x+width]

            face_img = cv2.resize(dst_img, (64,64))
            new_img_name = out_face_path + video_name + str(img_count) + 'face.jpg'
            cv2.imwrite(new_img_name, face_img)
            img_count += 1

if __name__ == '__main__':

    movie_to_image(int(10))

    images = glob.glob(output_path + '*.jpg')
    face_detect(images)

この「movie2face.py」と先の「lbpcascade_animeface.xml」と動画ファイルを同一フォルダに置きます。

そのフォルダ内に「face」と「movie」というフォルダを作成。

あとは

> python movie2face.py

と実行すれば、まず「movie」フォルダに動画から取り出された静止画が保存され

Tf_kemo01

その静止画から取り出された顔の部分が「face」に保存されます(64×64)。

Tf_kemo02

若干誤認識がありますけど、結構な精度で落としてくれます。

ただ”ハシビロちゃん”がうまく認識されないですよね・・・ってなにをキャプチャしてるんだか。

上のコードの「xml_path = "./lbpcascade_animeface.xml"」の部分を「xml_path = "./haarcascade_frontalface_default.xml"」と置き換えて、動画をアニメからドラマやホームビデオに変えれば、人の顔をキャプチャする検出器に早変わりします。

haarcascade_frontalface_default.xml”は、たいていOpenCVをインストールすればデフォルトで入ってくるようですが、別途入手する方法は以下。

(1) https://github.com/opencv/opencvにアクセス

(2) 「Clone or Download」をクリックし「Download ZIP」をクリック

(3) ダウンロードしたファイル(opencv-master.zip)を解凍

(4) 解凍したフォルダ内にある「data\haarcascades」の中に「haarcascade_frontalface_default.xml」というのがあるのでこれを取り出す

これを使えばリアルな人の顔を検出できます。

動画から何かを取り出したい場合は同様に、別の検出器を入手し、このコードの”xml_path=・・・”に入れればOK。

例えば猫を検出したかったら、以下のサイトから”xml”ファイルが入手可能。

ねこと画像処理 part 2 – 猫検出 (モデル配布) « Rest Term

試しにここから検出器を入手して

https://github.com/wellflat/cat-fancier

猫動画を処理してみると

Tf_neko01

確かに猫だらけになります。ただし、誤認識もちょっと多め。

自分で”物体検出器”を作りたくなったら、以下を参照。

OpenCVで物体検出器を作成する① ~基礎知識~ - 技術者ブログ

これをやるためには3000枚以上のサンプル画像を作る覚悟が必要ですが。

結構いろいろな”検出器”が転がってるようなので、応用はききそうですね。

Raspberry Pi3 Model B ボード&ケースセット 3ple Decker対応 (Element14版, Clear)-Physical Computing Lab

« 128×128の1.5インチOLED付Arduino互換ボード”Pixel 2.0” | トップページ | 百均のiPhoneケースもアイデア次第で豪華に!? »

パソコン系」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: OpenCVによる”アニメ顔”検出:

« 128×128の1.5インチOLED付Arduino互換ボード”Pixel 2.0” | トップページ | 百均のiPhoneケースもアイデア次第で豪華に!? »

無料ブログはココログ

スポンサード リンク

ブログ村