
今回はPythonとOpenCVを使って写真の顔部分に自動的にモザイクをつけていきます。
これができればブログを書くときにモザイクをかける手間が減って便利そうです。
顔認識するプログラム
まずはモザイクをかける部分を決めるために顔認識を行うプログラムを作ってみます。
OpenCVには顔認識用の学習済みのカスケードファイルがあるのでそちらを使っていきます。
カスケードファイルは環境にもよりますがAnacondaを使っている場合、
~\Anaconda3\\envs\\python3.6\\Lib\\site-packages\\cv2\\data
の中に顔を認識させるものや目を認識させるものなどが入っています。
今回は、haarcascade_frontalface_alt.xmlというファイルを使います。
顔認識を行うサンプルプログラムは以下の通りです。
import cv2
import sys
# 識別したい画像を読み込む
imageFile = "画像ファイル名"
image = cv2.imread(imageFile)
imageGs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 顔認識ファイルを読み込む
cascadeFile = "~\\Anaconda3\\envs\\python3.6\\Lib\\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml"
cascade = cv2.CascadeClassifier(cascadeFile)
# 顔認識を実行
faces = cascade.detectMultiScale(
imageGs,
scaleFactor=1.1,
minNeighbors=1,
minSize=(150, 150)
)
if len(faces) > 0:
# 顔部分を赤枠で囲む
color = (0, 0, 255)
for face in faces:
x, y, w, h = face
cv2.rectangle(image, (x, y), (x+w, y+h), color, thickness=8)
cv2.imwrite("facedetect-output1.PNG", image)
else:
print("No Face")
OpenCVのカスケードファイルは白黒画像に対してのみ顔認識を行うことができるため、一度画像をグレースケールに変換しています。
以下の画像を入力として与えると、

以下のように顔周りが赤枠で囲われた画像が出力されています。

画像を見て分かる通り顔認識ができていますね。
顔にモザイクをかける
次に顔にモザイクをかけていきます。
先ほど赤枠で囲っていた領域内にモザイクをかけるように先ほどのプログラムを改造していきましょう。
if len(faces) > 0:
以降の顔を赤枠で囲っていた処理を以下のように変えてください。
# 顔部分にモザイクをかける
mosaic_rate = 30
for(x, y, w, h) in faces:
# 顔を切り抜く
face = image[y:y+h, x:x+w]
# モザイクをかける
face = cv2.resize(face, (w//mosaic_rate, h//mosaic_rate))
face = cv2.resize(face, (w, h), interpolation=cv2.INTER_AREA)
# 元の画像に張り付ける
image[y:y+h, x:x+w] = face
cv2.imwrite("facedetect-output2.PNG", image)
モザイクをかける処理はコードを見て分かる通り、元画像を縮小した後に元の大きさにもどしてモザイクをかけています。
mosaic_rateの値が大きいほどモザイクが荒く、小さいほど細かくなります。
mosai_rateが30の場合は以下のような画像が出力されます。

まとめ
顔認識って難しいのかなとか思っていたのですがOpenCVを使えば簡単に実装することができました。
この機会にOpenCVの顔認識を使って色々と遊んでみようと思います。