今までやってきたことを応用して、アメ横を行き交う人々の顔にモザイクをかけていきます。
すべてのフレームについて、それぞれ顔検出をし、モザイクをかけていきます。
import cv2 import numpy as np cascade = cv2.CascadeClassifier('/usr/local/lib64/python3.7/site-packages/cv2/data/haarcascade_frontalface_alt2.xml') def mosaic(img): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) rects = cascade.detectMultiScale(gray, 1.1, 1, 0, (5,5)) if len(rects) > 0: for rect in rects: x, y, w, h = rect face = img[y:y+h, x:x+w] dst = cv2.GaussianBlur(face, (25, 25), 10) img[y:y+h, x:x+w] = dst return img cap = cv2.VideoCapture('./img.MOV') fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('output.m4v', fourcc, fps, (height, width)) while True: ret, frame = cap.read() if ret: frame270 = np.rot90(frame, 3) out.write(mosaic(frame270)) else: break cap.release() out.release()
実行してみましたが、角度によって顔として検出されない場合があり、モザイクがチカチカしてしまいます。そこで、少し強引な手法ですが、顔検出した位置について、その後の15フレームについてモザイクをかけるようにしました。
import cv2 import numpy as np cascade = cv2.CascadeClassifier('/usr/local/lib64/python3.7/site-packages/cv2/data/haarcascade_frontalface_alt2.xml') def mosaic(img, rects_list): gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) rects = cascade.detectMultiScale(gray, 1.1, 1, 0, (5,5)) rects_list.append(rects) for rects in rects_list: for rect in rects: x, y, w, h = rect face = img[y:y+h, x:x+w] dst = cv2.GaussianBlur(face, (25, 25), 10) img[y:y+h, x:x+w] = dst return img, rects cap = cv2.VideoCapture('./img.MOV') fps = cap.get(cv2.CAP_PROP_FPS) width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v') out = cv2.VideoWriter('output.m4v', fourcc, fps, (height, width)) rects_list = [] while True: ret, frame = cap.read() if ret: frame270 = np.rot90(frame, 3) mosaiced_frame, rects = mosaic(frame270, rects_list[-15:]) rects_list.append(rects) out.write(mosaiced_frame) else: break cap.release() out.release()
結果は以下の通りです。
Python関連の記事を更新しました。
【Python: OpenCVを使用して、アメ横を行き交う人々の顔にモザイクをかける】https://t.co/Ar2FHwwGYl pic.twitter.com/ZgPBxQ5Lz9— oliverSI/Python芸人 (@oliverSI7) January 17, 2019
無事モザイクをかけることができました。