プログラミングの芽

面白そうな技術を使って、楽しいことやりたい

リアルタイム顔面自動モザイク

f:id:atarms:20190130143536j:plain:w400
これをリアルタイム処理できるようにする。
静止画でいいならものすごく簡単にできる。

# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt

def mosaic(src, ratio=0.1): #ratio=モザイクの強さ
    small = cv2.resize(src, None, fx=ratio, fy=ratio, interpolation=cv2.INTER_NEAREST)
    return cv2.resize(small, src.shape[:2][::-1], interpolation=cv2.INTER_NEAREST)

def mosaic_area(src, x, y, width, height, ratio=0.1):
    dst = src.copy()
    dst[y:y + height, x:x + width] = mosaic(dst[y:y + height, x:x + width], ratio)
    return dst

face_cascade_path = '~/haarcascade_frontalface_default.xml' #cv2に付属しているカスケード分類器のパス
face_cascade = cv2.CascadeClassifier(face_cascade_path)

                   
# VideoCaptureのインスタンスを作成
cap = cv2.VideoCapture(0)

while True:
    # VideoCaptureから1フレーム読み込む
    ret, frame = cap.read()
    
    src_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #グレースケールに変換
    faces = face_cascade.detectMultiScale(src_gray) #顔検出 座標(x,y,w,h)を返す
    for x, y, w, h in faces:
        #バウンディングボックスを表示する場合
        #cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) 
        #face = frame[y: y + h, x: x + w]
        #face_gray = src_gray[y: y + h, x: x + w]

  #モザイク処理をする場合 
        dst_face = mosaic_area(frame, x, y, w, h)
    
    cv2.imshow('frame', dst_face)
    # キー入力を1ms待って、k が27(ESC)だったらBreakする
    k = cv2.waitKey(1)
    if k == 27:
        break

# キャプチャをリリースして、ウィンドウをすべて閉じる
cap.release()
cv2.destroyAllWindows()


顔だけじゃなくて目の分類器もあるので、目だけモザイクとかもできると思います。
注意点としては、リアルタイムだと結構モザイクがばがばになります。
配信で使いたいとかなら工夫がいりますね。