原理
使用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中的灰度化图像函数,传入三通道彩图得到一个0 ~ 256范围的灰度图,skimage中rgb2gray中得到的是0~1之间的浮点数数组,为了能调用cv2 的分类器,需要将数组做)0~256 的扩大和改性。
gray = np.array(im,dtype='uint8')
网友评论