Python版OpenCVで顔に自動でモザイク処理

この記事では、Python+OpenCVでHaar Cascade識別器(分類器)を実装し、画像から顔を検出する方法をソースコード付きで解説します。

Haar Cascade

Haar Cascadeは、Haar-like特徴から作成した複数の強識別器を連結したものです。
計算処理が高速なため、リアルタイムな顔検出などに利用されています。

詳細記事
原理はこちら Haar Cascadeによる顔検出の原理
顔検出はこちら Python版OpenCVで顔検出(Haar Cascade)

今回は、これらを応用して顔画像に自動でモザイクをかけてみました。

ソースコード(Python3 + OpenCV3)

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# モザイク処理
def mosaic(img):
    # 画像の高さと幅
    w = img.shape[1]
    h = img.shape[0]

    # 縮小→拡大でモザイク加工
    img = cv2.resize(img,(int(w/10), int(h/10)))
    img = cv2.resize(img,(w, h), interpolation=cv2.INTER_NEAREST)

    return img

def main():
    # カスケード型識別器の読み込み
    cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

    # 動画の読み込み
    cap = cv2.VideoCapture(0)

    # 動画終了まで繰り返し
    while(cap.isOpened()):
        # フレームを取得
        ret, frame = cap.read()

        # グレースケール変換
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        # 顔領域の探索
        face = cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=3, minSize=(30, 30))
    
        # 顔領域を赤色の矩形で囲む
        for (x, y, w, h) in face:
            # 顔部分を切り出してモザイク処理
            frame[y:y+h, x:x+w] = mosaic(frame[y:y+h, x:x+w])
            
        # フレームを表示
        cv2.imshow("Flame", frame)

        # qキーが押されたら途中終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

    
if __name__ == '__main__':
    main()

実行結果

サンプルプログラムの実行結果です。

関連記事
1 PythonでOpenCV入門 サンプル集
2 【Python】画像処理プログラミング入門
3 【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!