はじめに
この記事では以下のようなことについて書きます。
1.opencvで顔を検出
2.顔を検出して切り出し、別のファイルに保存する
環境
windows
juypter notebook
python3.6
下準備
opencvが使えない場合はjuypter notebookに以下を入力してください。
! pip install opencv-python
特徴ファイルはこちらにあります。
顔を検出
qiita.py
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
img=cv2.imread("./Lena.jpg")#画像の読み込み
image=cv2.imread("./Lena.jpg",0)
img= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#RGBに変換する
HAAR_FILE="haarcascade_frontalface_default.xml"#特徴の読み込み
cascade=cv2.CascadeClassifier(HAAR_FILE)
face=cascade.detectMultiScale(image)#顔検出
for x,y,w,h in face:
cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),3)#顔を四角で囲む
plt.grid(False)#デフォルトだとグリッドとxy軸ラベルが表示されるので非表示にする
plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
plt.imshow(img)
顔を検出して別のファイルに保存
ここからjupyter notebook使用しています
.py
import cv2
import matplotlib.pyplot as plt
import numpy as np
import sys, os
from PIL import Image
%matplotlib inline
# 入力ファイルのパスを指定
in_jpg = "in_nana/"
out_jpg = "out_nana/"
# リストで結果を返す関数
def get_file(dir_path):
filenames = os.listdir(dir_path)
return filenames
pic = get_file(in_jpg)
for i in pic:
# 画像の読み込み
image_gs = cv2.imread(in_jpg + i)
# 顔認識用特徴量ファイルを読み込む --- (カスケードファイルのパスを指定)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 顔認識の実行
face_list = cascade.detectMultiScale(image_gs,scaleFactor=1.1,minNeighbors=1,minSize=(1,1))
# 顔だけ切り出して保存
cnt= 1;
for x,y,w,h in face_list:
dst = image_gs[y:y+h,x:x+w]
#保存する時の名前
save_path = out_jpg + '/' + 'out_(' + str(i) +')' + str(no) + '.jpg'
#認識結果の保存
a = cv2.imwrite(save_path, dst)
plt.show(plt.imshow(np.asarray(Image.open(save_path))))
print(cnt)
cnt += 1
このようになりました。上手く切り出せず顔以外の画像も保存されています。
参考
大量の画像から顔の部分のみトリミングして保存する方法
OpenCVでの画像処理
おわりに
質問や間違いがありましたらコメントお願いします。