この記事では、Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。
  
  
  Haar Cascade
    Haar Cascadeは、Haar-like特徴から作成した複数の強識別器を連結したものです。
  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では、顔・目などを検出できるカスケード識別器の学習済みファイルを事前に用意されています。
  学習済みファイルは下記リンク先からダウンロードできます。
  【URL】https://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 件のコメント:
コメントを投稿