顔にモザイクをかける
顔検出により写真に写っている顔にモザイク処理をします。OpenCVに付属するHaar特徴ベースCascade型分類器による機械学習データ(検出器)のうち、正面の人の顔の機械学習データhaarcascade_frontalface_default.xmlを画像に適用することで顔検出を行います。モザイク処理は顔部分を縮小→元のサイズに拡大することで行います。
関連記事
使った関数・メソッド
- cv2.imread : 画像ファイルの読み出し
- cv2.CascadeClassifier : 学習データの読みだし
- cv2.CascadeClassifier.detectMultiScale : オブジェクトを検出し検出範囲の矩形データ(x、y、幅、高さ)を返す
- cv2.resize : 画像サイズ変更
- cv2.imwrite : 画像をファイルに保存
環境
準備
画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'girl.jpg'で保存しました。
正面の顔の特徴量学習データファイルhaarcascade_frontalface_default.xmlも同様にjupyter notebookファイルと同じディレクトリにコピーしています。
コード
import cv2 fname = 'girl.jpg' # 画像ファイル名 img = cv2.imread(fname) # 画像を読み出しimgに代入 # 特徴量学習データhaarcascade_frontalface_default.xmlを読み込みface_cascadeに代入 face_cascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml') # 学習データを元にimgに対してオブジェクト検出し、検出したオブジェクトのx,y,幅、高さのリストをfacesに代入 faces=face_cascade.detectMultiScale(img) for x, y, width, height in faces: # オブジェクトの数だけ、x,y,width,heightを取り出す # 検出した顔部分を縮小→拡大してモザイク処理 mosaic = img[y:y+height, x:x+width] mosaic = cv2.resize(mosaic, (int(width/15), int(height/15))) mosaic = cv2.resize(mosaic, (width, height)) img[y:y+height, x:x+width] = mosaic cv2.imwrite('face_mosaic.jpg', img) # 画像を保存
実行結果
自動的に顔が検出され、モザイクがかけられました。
以下のサイトを参考にさせていただきました
Pythonの文法メモ >> 【OpenCV】画像サイズを変更するresize