Python: OpenCVを使用して顔検出をする

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, in 
    rects = 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

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です