人脸检测

原理

使用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 

要点

  1. 这里交错使用了cv2 和skimage,因为skimage更pythonic,纯粹是个人喜好。
  2. 直接调用CascadeClassifier一般是不会成功的,要使用分离器load类方法标注出xml源头。
  3. cv2中的灰度化图像函数,传入三通道彩图得到一个0 ~ 256范围的灰度图,skimage中rgb2gray中得到的是0~1之间的浮点数数组,为了能调用cv2 的分类器,需要将数组做)0~256 的扩大和改性。
    gray = np.array(im,dtype='uint8')

效果

原图
检测后
检测前
检测后

你可能感兴趣的:(人脸检测)