運用模組cv2 Pillow HAAR特徵檔
在一張圖片上(虛擬網紅臉),標記框示人臉,並每人存成一張圖檔。
直接看代碼解說
# detect face --> tag --> crop --> save
import cv2
from PIL import Image
# 臉部特徵檔 安裝cv2後,在\Anaconda3\Lib\site-pakages\cv2\data\ 內
# 複製存放到現在資料夾內
casc_path = 'haarcascade_frontalface_default.xml'
# 辨識器
faceCascade = cv2.CascadeClassifier(casc_path)
# 讀取一張,由GAN產生的'虛擬網紅臉'
filename = 'fakeFaces.jpg'
imagename = cv2.imread(filename)
'''偵測人臉 ( 可試試不同設定,會產生什麼變化 )
scaleFactor 偵測窗口之大小倍數,minNeighbors 誤判參數
minSize 窗口之最小尺寸
本例之圖片內,臉部尺寸都大於400,如果maxSize太小,就偵測不出了
或許不設定 maxSize ?
'''
minWnd = (30,30)
maxWnd =(400,400)
sFactor = 1.1
faces = faceCascade.detectMultiScale(imagename, scaleFactor=sFactor, minNeighbors=5,
minSize=minWnd, maxSize = maxWnd)
# 找到幾張臉 len(faces)
cv2.putText(imagename,f'{len(faces)} faces found',
(20,60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
#--- 截取每張臉,存檔
pImage = Image.open(filename)
i = 1
for (x,y,w,h) in faces:
#--- 標記 crop 位置
cv2.rectangle(imagename,(x,y),(x+w, y+h),(0,0,255),2)
#--- 每張臉存一張圖
fileNa = 'crop%s.jpg' % (i)
img1 = pImage.crop((x, y, x+w, y+h))
img2 = img1.resize((300, 300), Image.ANTIALIAS)
img2.save(fileNa)
#--- 在原圖上 標註號碼
cv2.putText(imagename,f'No {i}',(x+5,y+h+15),cv2.FONT_HERSHEY_SIMPLEX,
0.5, (255,255,255), 2)
i += 1
# 顯示成果
cv2.namedWindow("Face detect")
cv2.imshow("Face detect", imagename)
cv2.waitKey(0)
cv2.destroyAllWindows()
資料夾內存檔的圖片