2018年3月5日月曜日

Python版OpenCVで顔検出(Haar Cascade)

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

Haar Cascade

Haar Cascadeは、Haar-like特徴から作成した複数の強識別器を連結したものです。
Haar Cascade
の詳細は下記事で解説しています。

参考記事

原理はこちら

Haar Cascadeによる顔検出の原理

このアルゴリズムは、OpenCVを使うと簡単に実装できます。
今回はOpenCVの「cv2.CascadeClassifier」「cascade.detectMultiScale」を使って入力画像から顔を検出してみました。

書式

cascade = cv2.CascadeClassifier(path)
face = cascade.detectMultiScale(src, scaleFactor, minNeighbors, minSize)

パラメータ名

説明

path

使用するカスケード識別器のファイルパス

src

入力画像

scaleFactor

画像スケールにおける縮小量

minNeighbors

矩形を要素とするベクトル

minSize

探索窓の最小サイズ(これより小さい対象は無視)

face

探索結果(見つかった場所の左上座標・幅・高さを格納したリスト)

カスケード型識別器のファイル

OpenCVでは、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。
学習済みファイルは下記リンク先からダウンロードできます。

URLhttps://github.com/opencv/opencv/tree/master/data/haarcascades

今回は顔検出のために「haarcascade_frontalface_default.xml」を使います。

ファイル名

検出対象

haarcascade_eye.xml

haarcascade_eye_tree_eyeglasses.xml

眼鏡

haarcascade_frontalcatface.xml

猫の顔(正面)

haarcascade_frontalcatface_extended.xml

猫の顔(正面)

haarcascade_frontalface_alt.xml

顔(正面)

haarcascade_frontalface_alt2.xml

顔(正面)

haarcascade_frontalface_alt_tree.xml

顔(正面)

haarcascade_frontalface_default.xml

顔(正面)

haarcascade_fullbody.xml

全身

haarcascade_lefteye_2splits.xml

左目

haarcascade_licence_plate_rus_16stages.xml

ロシアのナンバープレート(全体)

haarcascade_lowerbody.xml

下半身

haarcascade_profileface.xml

顔(証明写真)

haarcascade_righteye_2splits.xml

右目

haarcascade_russian_plate_number.xml

ロシアのナンバープレート(数字)

haarcascade_smile.xml

笑顔

haarcascade_upperbody.xml

上半身

ソースコード(Python3

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

# -*- coding: utf-8 -*-
import cv2
 
def main():
    # 入力画像の読み込み
    img = cv2.imread("test.png")
    
    # カスケード型識別器の読み込み
    cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.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.imshow("result.jpg",img)
 
    
if __name__ == '__main__':
    main()

実行結果

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

 

0 件のコメント:

コメントを投稿