1.はじめに
PythonにてOpenCVを用いた画像処理を実施したのでまとめました。
前回からの続きで、グレースケールに変換した画像から正面から見た人の顔を検出しマスクします。
djangoの使用については、株式会社キカガク殿にて学習した内容を元に作成しました(djangoの説明については割愛します)。
2.開発環境
・Windows10
・Python 3.9.12
・opencv-python--headless==4.5.1.48
・Pillow==9.2.0
3.顔検出
顔検出を行うため、OpenCVのカスケードファイルである「haarcascade_frontalface_default.xml」という人の正面からの顔を検出する分類器を使用します。
import cv2
from PIL import Image
(省略)
# カスケードファイルの保管場所取得
cascade_path = settings.BASE_DIR + "/imgrayapp/haarcascades/
(省略)
# 元画像の保管場所取得
path = settings.BASE_DIR + obj.document.url
(省略)
# 顔検出
# 学習済みモデルの読み込み
cascade = cv2.CascadeClassifier(cascade_path)
# detectMultiScaleで顔検出
# minSizeで最小検出サイズを指定(下記(20, 20)は20ピクセル*20ピクセル以下は探さないを意味する)
# img_grayはグレースケールに変換した画像を示す
face_list = cascade.detectMultiScale(img_gray, minSize = (20, 20))
# face_listの値をまとめる
x = face_list[0][0] # X座標
y = face_list[0][1] # Y座標
w = face_list[0][2] # 横幅
h = face_list[0][3] # 縦幅
4.検出した顔をマスク
顔を検出した後、顔を隠すための画像を顔のある位置に貼り付けます(顔を隠すための画像はあらかじめ用意しておきます)。その際、画像を加工するためpythonの画像処理ライブラリであるPillowを使用します。
# 人の顔に張り付ける画像の保管場所取得
maskimage = settings.BASE_DIR + "/media/documents/maskimage.png"
# PILで画像を開く
original_image = Image.open(path)
maskim = Image.open(maskimage)
# 顔にあったサイズにマスク画像をリサイズする
resize_maskim = maskim.resize((w, h))
resize_maskimage = settings.BASE_DIR + "/media/documents/resize_maskimage.png"
resize_maskim.save(resize_maskimage)
# 元画像はそのままにしておくため、コピーを用意する
back_im = original_image.copy()
# 背景透過のためのsplit()
back_im.paste(resize_maskim, (x, y), resize_maskim.split()[3])
# 保存する
mask_image = settings.BASE_DIR + "/media/gallery/mask_image.jpg"
back_im.save(mask_image)
obj.faceimage = "gallery/mask_image.jpg"
5.結果
下の画像は、顔を検出しマスクする前と後の画像になります。
マスク前の画像
無事顔の位置を検出し、マスクすることができました。
6.Webアプリ
Djangoを使用し、人の顔をマスクするWebアプリケーションを作成してみました。
画像で顔を隠す手法以外に、検出した顔の位置のみモザイク加工をして顔を隠す手法も実施しました。