これをリアルタイム処理できるようにする。
静止画でいいならものすごく簡単にできる。
# -*- 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()
顔だけじゃなくて目の分類器もあるので、目だけモザイクとかもできると思います。
注意点としては、リアルタイムだと結構モザイクがばがばになります。
配信で使いたいとかなら工夫がいりますね。