以前に投稿した記事です
【Python】OpenCVの顔認証するときにとあるWebサイトを参考にしてつまった方、ご覧ください
【OpenCV】つながりで、今回はフォルダ内に無数にある画像データに対して
顔検出をかけるコードを掲載します。
書いてることは、以前の記事にFor文を追加しただけなので
大したことしてないです。
今回はデスクトップにpicというフォルダを作りその中に入っている画像を対象として実施します。
画像はフリー素材サイトからお借りしました。
実際のソースコードは以下となります。
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
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サイト