今年も春がやってくる。生徒の顔写真をトリミングしなければいけない。
パソコンが勝手にやってくれないかなと思いつつ、色々と検索して、やってみたら出来たので、備忘録的に書いてみようと思う。
環境はWindows10です。使うのは'Python'なのですが、名前を聞いたことあるぐらいの知識。'OpenCV'ってのを使って、顔認識させられるらしいという事が分かった。
そこで、環境の準備から。
まず、OpenCVをダウンロードします。
ここからWindows版のOpenCVを入手できます。ダウンロードしたアーカイブをダブルクリックすると、自動で解凍してくれますので、解凍された'opencv'フォルダを、Cドライブの直下に移動します。
そして、環境変数をいじって、pathを通します。
具体的には、コントロールパネル>システムとセキュリティ>システム>システムの詳細設定>環境変数>path>新規
で、'C:\opencv\build\x64\vc15\bin'を追加しておきます。
次に、Visual Studio のインストールを行いました。
もちろん、無料のやつね。
インストールしたら、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ソースファイルを作業するフォルダにコピーして
ダブルクリックで実行できました。
参考になったページはたくさんあったのですが、自分が記事を書くとは思っていなかったので、追えませんでした…。
私と同じ仕事をしている方の助けになれば幸いです。