OpenCVを使うと、簡単に顔を検出することができます。
import cv2 cascade = cv2.CascadeClassifier('/usr/local/lib64/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml') img = cv2.imread('img/img.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) rects = cascade.detectMultiScale(gray, 1.1, 3,0, (20,20)) if len(rects) > 0: for rect in rects: cv2.rectangle(img, tuple(rect[0:2]), tuple(rect[0:2]+rect[2:4]), (0, 0,255), thickness=2) else: print("検出なし") cv2.imwrite('img/img_cascade.jpg', img)
分類器は、
cascade = cv2.CascadeClassifier('/usr/local/lib64/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml')
として指定していますが、分類器のファイルの場所は以下のようにして確認できます。
import cv2 print(cv2.__path__) #['/usr/local/lib64/python3.7/site-packages/cv2']
フォルダの中を確認してみますと、たくさんの分類器があることがわかります。今回はそのうち、「haarcascade_frontalface_default.xml」を使用していきます。
cd /usr/local/lib64/python3.7/site-packages/cv2/data ls #__init__.py haarcascade_frontalface_alt2.xml haarcascade_profileface.xml #__pycache__ haarcascade_frontalface_alt_tree.xml haarcascade_righteye_2splits.xml #haarcascade_eye.xml haarcascade_frontalface_default.xml haarcascade_russian_plate_number.xml #haarcascade_eye_tree_eyeglasses.xml haarcascade_fullbody.xml haarcascade_smile.xml #haarcascade_frontalcatface.xml haarcascade_lefteye_2splits.xml haarcascade_upperbody.xml #haarcascade_frontalcatface_extended.xml haarcascade_licence_plate_rus_16stages.xml #haarcascade_frontalface_alt.xml haarcascade_lowerbody.xml
分類器のパスを間違えていると、以下のようなエラーが出ます。
Traceback (most recent call last): File "[*.py]", line 6, inrects = cascade.detectMultiScale(gray, 1.1, 3,0, (20,20)) cv2.error: OpenCV(4.0.0) /io/opencv/modules/objdetect/src/cascadedetect.cpp:1658: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'
顔検出結果
顔検出の結果は以下の通りです。画像は写真素材 足成からいただきました。
元画像1
顔検出結果1
元画像2
顔検出結果2
元画像3
顔検出結果3
モザイク処理をする
顔検出した箇所についてぼかしを入れることもできます。
import cv2 cascade = cv2.CascadeClassifier('/usr/local/lib64/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml') img = cv2.imread('img/img.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) rects = cascade.detectMultiScale(gray, 1.1, 3,0, (20,20)) if len(rects) > 0: for rect in rects: x, y, w, h = rect face = img[y:y+h, x:x+w] dst = cv2.GaussianBlur(face, (25, 25), 0) img[y:y+h, x:x+w] = dst else: print("検出なし") cv2.imwrite('img/img_mosaic.jpg', img)
モザイク処理結果1
モザイク処理結果2
モザイク処理結果3