Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

顔にモザイクをかける

顔検出により写真に写っている顔にモザイク処理をします。OpenCVに付属するHaar特徴ベースCascade型分類器による機械学習データ(検出器)のうち、正面の人の顔の機械学習データhaarcascade_frontalface_default.xmlを画像に適用することで顔検出を行います。モザイク処理は顔部分を縮小→元のサイズに拡大することで行います。

関連記事

写真から顔検出をする(人間、猫)
画像のモザイク処理

使った関数・メソッド
  • cv2.imread : 画像ファイルの読み出し
  • cv2.CascadeClassifier : 学習データの読みだし
  • cv2.CascadeClassifier.detectMultiScale : オブジェクトを検出し検出範囲の矩形データ(x、y、幅、高さ)を返す
  • cv2.resize : 画像サイズ変更
  • cv2.imwrite : 画像をファイルに保存
環境
  • windows10 home
  • jupyter notebook 6.3.0
  • Python 3.8.8
  • OpenCV 4.0.1
準備

画像ファイルはフリー写真素材ぱくたそからダウンロードさせていただき、jupyter notebookファイル(***.ipynb)と同じディレクトリにファイル名'girl.jpg'で保存しました。
f:id:T_A_T:20210805134351j:plain
正面の顔の特徴量学習データファイル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) # 画像を保存
実行結果

自動的に顔が検出され、モザイクがかけられました。
f:id:T_A_T:20210805134031j:plain

以下のサイトを参考にさせていただきました

Pythonの文法メモ >> 【OpenCV】画像サイズを変更するresize

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村