はじめに
個人識別に厳しい昨今、ラズパイのカメラで撮影する際に不用意に顔写真を保存したくない状況もあるんじゃないかなと思います。
自分や家族の写真を撮影した際、プライバシーに配慮して顔にスタンプを上書きした状態でSNSなどに投稿している方がいますが、同じようなことを自動でやるようにできないかと思い、MTCNNの顔検出を使ってやってみました。
やったこと
ラズパイのカメラで撮影したキャプチャデータを保存する前に顔検出にかけて、顔の部分を塗りつぶします。目鼻口の位置だけ書いてあげることでどこを向いているかくらいはわかるようにしてみました。
撮影した画像は「privacy_camera.jpg」というファイル名で出力します。
import cv2
from mtcnn import MTCNN
filename = "privacy_camera.jpg"
detector = MTCNN()
# 画像の取得
capture = cv2.VideoCapture(0)
ret, frame = capture.read()
capture.release()
# 顔の検出
detect_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
result = detector.detect_faces(detect_image)
# 顔を検出している場合描画する
if len(result) > 0:
#検出した顔の数だけ繰り返し
for i in range(len(result)):
bounding_box = result[i]['box']
keypoints = result[i]['keypoints']
# 顔を隠す
cv2.rectangle(detect_image,
(bounding_box[0], bounding_box[1]),
((bounding_box[0]+bounding_box[2]), (bounding_box[1]+bounding_box[3])),
(0, 0, 0), thickness=-1)
cv2.circle(detect_image,(keypoints['left_eye']), 2, (0, 155, 255), 2)
cv2.circle(detect_image,(keypoints['right_eye']), 2, (0, 155, 255), 2)
cv2.circle(detect_image,(keypoints['nose']), 2, (0, 155, 255), 2)
cv2.line(detect_image, (keypoints['mouth_left']), (keypoints['mouth_right']),
(0, 155, 255), thickness=4, lineType=cv2.LINE_AA)
# 画像を保存する
cv2.imwrite(filename, cv2.cvtColor(detect_image, cv2.COLOR_RGB2BGR))
print(result)
やった結果
ラズパイには、このような画像で保存されます。
多少左の方を向いていることと、ぼろぼろのパーカーを着ていることはわかりますが、顔はわからないようになっています。
顔がたくさん映っている場合も顔検出できれば全員プライバシーに配慮した形で保存されるようにしてみました。