Python OpenCV 顔検出してモザイク処理 複数人を同時処理する方法

OpenCVを用いて、複数人の顔検出&モザイク処理を実施してみようと思います。

先日の記事「Python OpenCV 画像から顔検出を行う方法」では3種類のカスケードファイルを試してみましたが、今回はそのなかの「haarcascade_frontalface_alt2」を使用して検出を実施しようと思います。

カスケードファイルのダウンロードはこちら。
https://github.com/opencv/opencv/tree/master/data/haarcascades

元画像はこちら


4人の家族写真を用いて処理を実施しようと思います。

出力


プログラムで処理することで、4人の顔検出およびモザイク処理が実施されました。

プログラム

#ライブラリをインポート
import cv2

#画像読み込み
img = cv2.imread("test.jpg")
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_con = img.copy()

#モザイク関数
def mosaic(img, ratio=0.1):
    small = cv2.resize(img, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, img.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

#モザイクエリア
def mosaic_area(img, x, y, width, height, ratio=0.1):
    dst = img.copy()
    dst[y:y+height, x:x+width] = mosaic(dst[y:y+height, x:x+width], ratio)
    return dst

# カスケードファイル読み込み
cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt2.xml')
#顔検出
faces = cascade.detectMultiScale(img_gray)
#検出した顔にモザイク処理
if len(faces) > 0:
    for face in faces:
        x, y, w, h =face
        img_con = mosaic_area(img_con,x, y, w, h)
#ファイル書き出し
cv2.imwrite("mosaic_face.jpg", img_con)

まとめ

for文を使用して4人の顔にモザイク処理することができました。ただし、画像は選びます。街中で撮影したような不特定多数が写っていて、しかも正面以外にも横向きや下向き、マスク着用などがある場合は、顔検出自体ができません。顔検出ができないと当然モザイク処理もできません。

タイトルとURLをコピーしました