
まくまく
画像処理ライブラリ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人の顔にモザイク処理することができました。ただし、画像は選びます。街中で撮影したような不特定多数が写っていて、しかも正面以外にも横向きや下向き、マスク着用などがある場合は、顔検出自体ができません。顔検出ができないと当然モザイク処理もできません。
Python OpenCVを用いた画像処理についてはこちらの記事でまとめています。>>>Python OpenCV 使い方まとめ