iT邦幫忙

0

Python cv2框示人臉 【基本】

運用模組cv2 Pillow HAAR特徵檔
在一張圖片上(虛擬網紅臉),標記框示人臉,並每人存成一張圖檔。
https://ithelp.ithome.com.tw/upload/images/20210825/20111373fmyC8iTu76.jpg
直接看代碼解說

# 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()

https://ithelp.ithome.com.tw/upload/images/20210825/20111373NXIIIVq0Dg.jpg
資料夾內存檔的圖片
https://ithelp.ithome.com.tw/upload/images/20210825/20111373j4dsgCjUmw.jpg


尚未有邦友留言

立即登入留言