原理
使用2017年8月更新的opencv最新版本舒萎,使用CascadeClassifier類分類器可以一步做出人臉檢測,在人臉檢測的基礎上做圖像分塊韭赘,可以做出更細致的眼睛揍愁、鼻子、笑容檢測冯挎。
核心代碼
import ...
def face_detect(img):
gray = color.rgb2gray(img)
faces=face_cascade.detectMultiScale(gray)
for face in faces:
x,y,w,h = face
rec = draw.polygon_perimeter([y,y,y+h,y+h],[x,x+w,x+w,x])
img[rec] = [0,0,255]
return img
face_cascade=cv2.CascadeClassifier()
face_cascade.load(...) # # you xml file path
cap = cv2.VideoCapture(0)
while True:
_,img = cap.read()
cv2.imshow('hi',face_detect(img[:,::-1,:]))
if cv2.waitKey(20) == 27:break
要點
- 這里交錯使用了cv2 和skimage底哥,因為skimage更pythonic,純粹是個人喜好房官。
- 直接調用CascadeClassifier一般是不會成功的趾徽,要使用分離器load類方法標注出xml源頭。
- cv2中的灰度化圖像函數(shù)翰守,傳入三通道彩圖得到一個0 ~ 256范圍的灰度圖附较,skimage中rgb2gray中得到的是0~1之間的浮點數(shù)數(shù)組,為了能調用cv2 的分類器潦俺,需要將數(shù)組做)0~256 的擴大和改性拒课。
gray = np.array(im,dtype='uint8')
效果
原圖
檢測后
檢測前
檢測后