Python + OpenCVで顔写真のトリミング


今年も春がやってくる。生徒の顔写真をトリミングしなければいけない。
パソコンが勝手にやってくれないかなと思いつつ、色々と検索して、やってみたら出来たので、備忘録的に書いてみようと思う。

環境はWindows10です。使うのは'Python'なのですが、名前を聞いたことあるぐらいの知識。'OpenCV'ってのを使って、顔認識させられるらしいという事が分かった。

そこで、環境の準備から。

まず、OpenCVをダウンロードします。

ここからWindows版のOpenCVを入手できます。ダウンロードしたアーカイブをダブルクリックすると、自動で解凍してくれますので、解凍された'opencv'フォルダを、Cドライブの直下に移動します。

そして、環境変数をいじって、pathを通します。

具体的には、コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数>path>新規
で、'C:\opencv\build\x64\vc15\bin'を追加しておきます。

次に、Visual Studio のインストールを行いました。

もちろん、無料のやつね。

Pythonを扱えるように、インストールします。

インストールしたら、Pythonアプリケーションを適当な名前で作成します。

作成したら、Pythonパッケージの管理で、OpenCV環境を扱えるようにします。

検索で、opencvと入れると、候補にopencv-python(バージョン番号)が現れると思うので、それを入れます。

これで、準備はOKです。

では、コードを書いていきます。

 #リソースのインポート
 import cv2
 import glob
 import os

 #trimフォルダの作成
 os.makedirs('trim', exist_ok=True)

 #カスケード型分類器に使用する分類器のデータ(xmlファイル)を読み込み
 HAAR_FILE = "C:\opencv\sources\data\haarcascades\haarcascade_frontalface_alt.xml"
 cascade = cv2.CascadeClassifier(HAAR_FILE)

 #ファイルリストの取得
 files = glob.glob("*.jpg")
 for file in files:

     #取得したファイル名の表示
     print(file)

     #画像ファイルの読み込み
     img = cv2.imread(file)

     #グレースケールに変換
     img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

     #カスケード型分類器を使用して画像ファイルから顔部分を検出する
     face = cascade.detectMultiScale(img2,scaleFactor=1.07,minNeighbors=7,minSize=(300,300))

     #顔部分を切り取り、リサイズする。
     for x,y,w,h in face:

         #横幅のエリアを1.6倍にし、縦幅のエリアを2.23倍にすることで、4:3の比率でカット
         face_cut = img[y-int(h*0.6):y+int(h*1.53), x-int(w*0.3):x+int(w*1.3)]

         #カットした画像を450*600のサイズにする。
         resize_img = cv2.resize(face_cut , dsize=(450, 600))

     #画像の出力
     cv2.imwrite('trim\\' + file , resize_img )

これで、このソースと同じフォルダにある複数のjpgファイルから顔部分だけ4:3の比率でトリミングして、450*600にリサイズして、trimという名前のサブフォルダを作成して、同じ名前で保存するという作業をしてくれるようになりました。

実行は、Pythonソースファイルを作業するフォルダにコピーして

ダブルクリックで実行できました。

参考になったページはたくさんあったのですが、自分が記事を書くとは思っていなかったので、追えませんでした…。

私と同じ仕事をしている方の助けになれば幸いです。