MENU

python 人の顔に自動でモザイクをかける

f:id:hanamichi_sukusuku:20201221184155p:plain

 

説明

まずそれぞれ必要なモジュールをインポートする。

import matplotlib.pyplot as plt
import cv2
from mosaic import mosaic as mosaic

 

matplotlibはグラフを描画したり、イメージを表示するライブラリ。

cv2の部分はopencvというライブラリで画像、動画の処理機能をまとめたもの。

from mosaic import mosaic as mosaicこの部分は同じ階層にmosaic.pyという名前のファイルを作成しその中にmosaic関数を定義しておりその関数を使用できるようにしている。

 

mosaic.pyについては後述する。

カスケードファイルを指定して分類器を作成

カスケードファイルとはxmlで特微量を既に学習済みのデータの分類器のこと。

cascade_file = "haarcascade_frontalface_alt.xml"

haarcascade_frontalface_alt.xmlこれがカスケードファイル、https://github.com/opencv/opencv/tree/master/data/haarcascadesここからダウンロードした。

特微量とは特徴を数値化したもので、例えば人の顔などの特徴を数値化することでコンピューターに人の顔を判別する基準になるものと言える。

分類器は学習済みデータ(モデル)のこと。

つまりカスケードファイルは既に特徴を数値化したデータでそのデータに基づいて分類することができるものだと言える。


cascade = cv2.CascadeClassifier(cascade_file)

cv2.CascadeClassifier()で様々な物体を検出するための検出器を作成できる。第一引数にカスケードファイルを指定することで、顔パーツを検出できる。(今回は人の顔のカスケードファイルを使用しているため)

検出器は指定したカスケードファイルのデータを元に作成され、検出器に任意のデータを指定するとデータの特徴と一致するものが検出される。

画像を読み込んでグレイスケールに変換

画像を一旦グレイスケールにするのは画像の明暗によって検出を行うため。

img = cv2.imread("family.jpg")

cv2.imread()で画像読み込み


img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ここではOpenCVの関数imread( )で画像ファイルを読み込むとBGR形式なのでcv2.cvtColor( )の第二引数にcv2.COLOR_BGR2GRAYを指定することでグレイスケールに変換することができる。

顔検出を実行 

face_list = cascade.detectMultiScale(img_gray, minSize=(150,150))

CascadeClassifier.detectMultiScale( )メソッド(cascadeはCascadeClassifierで作成された検出器なので同じメソッドが使える)の第一引数にグレイスケールのデータ、第二引数にキーワード引数を利用してminSizeを指定している。これは顔と認識する範囲の最小サイズを指定していることになる。これよりも小さい物体は無視される。

 


if len(face_list) == 0: quit()

もしface_listに格納されたリストが空の時、処理を終了している。

認識した部分の画像にモザイクをかける 


for (x,y,w,h) in face_list:
 img = mosaic(img, (x, y, x+w, y+h), 10)

顔検出を実行で格納したface_listを使用しmosaic関数を呼び出している。

このmosaic関数は上述した別ファイルでmosaic.pyの中にある関数である。

mosaic.py

f:id:hanamichi_sukusuku:20201221185252p:plain

 

face_listの中身は(元画像の左上からのx座標,y座標,横幅,高さ)

mosaic.pyでしているのは一度画像を縮小することで画像のピクセル情報がなくなりモザイクがかかったようになるからである。

そして、処理を終えた画像を元の画像に重ねている。

画像を出力


cv2.imwrite("family-mosaic.png", img)

画像の保存。


plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

画像をグレイスケールからカラー表示に変更。
plt.show()

画像表示。