LoginSignup
17
27

More than 5 years have passed since last update.

【Python】フォルダ内のすべての画像に対してOpenCVで顔検出を行う

Last updated at Posted at 2018-09-12

以前に投稿した記事です
【Python】OpenCVの顔認証するときにとあるWebサイトを参考にしてつまった方、ご覧ください
【OpenCV】つながりで、今回はフォルダ内に無数にある画像データに対して
顔検出をかけるコードを掲載します。

書いてることは、以前の記事にFor文を追加しただけなので
大したことしてないです。

今回はデスクトップにpicというフォルダを作りその中に入っている画像を対象として実施します。
画像はフリー素材サイトからお借りしました。
samplePic.PNG

実際のソースコードは以下となります。

faceDetection.py
import cv2
import numpy as np
import glob

face_cascade = cv2.CascadeClassifier('C:\ProgramData\Anaconda3\pkgs\libopencv-3.4.1-h875b8b8_3\Library\etc\haarcascades\haarcascade_frontalface_alt.xml')
#要注意ポイント ここでつまったら、以前の投稿をご覧ください。

#ディレクトリ名などは適切に書き換えてください
files =glob.glob("C:\\Users\\user\\Desktop\\pic\\*")
#picフォルダの後のアスタリスクがポイント
#ここでfilesにフォルダ内のファイル名が代入される
#フォルダ名などに日本語がなどが入っているとエラーになる可能性が高いです。半角英数字で対応してください。

for fname in files:    #あとはForで1ファイルずつ実行されていく
    bgr = cv2.imread(fname, cv2.IMREAD_COLOR)
    gray = cv2.cvtColor(bgr, cv2.COLOR_BGR2GRAY)
    face_rects = face_cascade.detectMultiScale(gray, 1.1, 3)
    if len(face_rects) > 0:
        for (x,y,w,h) in face_rects:
            cv2.rectangle(bgr, (x,y), (x+w,y+h), (255,0,0), 3)  
                        #(255,0,0)→枠の色は青
                        #最後の引数は太さ(-1にすると塗りつぶし)!
        cv2.imwrite(fname, bgr) 

cv2.destroyAllWindows()

前回と違うのは、顔の検出ができなかった場合、printで【no faces】表示をさせていましたが
省いています。

こちらをエディターなどにコピペ&ディレクトリを編集し
Picフォルダ内でもいいですし、任意のフォルダに保存します。
コマンド画面で、カレントフォルダを先ほどソースコードを保存したファイルがあるディレクトリをしていし
以下のコマンドを実行

コマンド画面
!ディレクトリをご自身のディレクトに合わせてください!
C:\Users\user\Desktop\pic> Python faceDetection.py

実行結果
samplePic2.PNG

1つだけ認識されなかったものがあります。
白い中に顔があったりすると認識が悪くなる傾向があるようです。

face_cascadeへはhaarcascade_frontalface_alt.xml以外に別のものを代入、検出することができます。
OpenCVには予めHaar-like特徴分類器がいくつか用意されています。
(以下はその一部です)

ファイル名 内容
haarcascade_eye.xml
haarcascade_smile.xml 笑顔
haarcascade_fullbody.xml 全身
haarcascade_upperbody.xml 上半身
haarcascade_lowerbody.xml 下半身

Haar-like特徴分類器に関してちょっとイミフって方は以下のリンクをご覧になってください。
Slideshare 図が多くて分かりやすい
百聞より一見 haar-like特徴分類器可視化動画

もちろん検出以外のいろいろな用途でOpenCVは使われていますし、
オライリーからは鈍器のような分厚くデカい専門書籍も出版されています。

もし認識した部分を塗りつぶしたい(マスク加工)のであれば
cv2.rectangle(bgr, (x,y), (x+w,y+h), (255,0,0), 3)

cv2.rectangle(bgr, (x,y), (x+w,y+h), (255,255,255), -1)

変更すればできますし、
モザイク加工など、画像で遊んでみるにはうってつけです。

出来たら近所に住んでるおばちゃんとかに
「人工知能の開発とかできるんだぜ~」って自慢してみるのもいいかもしれません。
これもれっきとした人工知能プログラムを使った作業なのです。

【参考資料】(SpecialThanks)
Python + OpenCV で顔検知のWebサイト

17
27
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
17
27