以下是本例的全部代码:
# coding=utf-8 # ~/learn_face/cv_dlib.py from __future__ import print_function import cv2 import dlib cameraCapture = cv2.VideoCapture(0) success, frame = cameraCapture.read() detector = dlib.get_frontal_face_detector() while success and cv2.waitKey(1) == -1: success, frame = cameraCapture.read() faces = detector(frame, 1) for k, d in enumerate(faces): frame = cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (255, 0, 0), 2) cv2.imshow("Camera", frame) cameraCapture.release() cv2.destroyAllWindows()运行上述代码后会发现dlib的效果真的比HAAR的检测效果要好很多!不管头怎么转都能瞬间识别到,画出来的矩形框都不带闪的!
特征点检测接下来我们用DLib的特征点提取器detector所识别出来的人脸轮廓点给标记出来。关键点(landmarks)提取需要一个特征提取器predictor,为了构建特征提取器,预训练模型必不可少。除了自行进行训练外,可以使用官方提供的一个模型。该模型可从dlib sourceforge 库下载,此模型是从人脸中提出64个特征点进行检测,其准确度相当高。
具体实现思路如下:
第一步:生成灰度图
第二步:生成直方图
第三步:进行检测
以下为全部代码
# coding=utf-8 # ~/learn_face/landmark.py import cv2 import dlib cameraCapture = cv2.VideoCapture(0) success, frame = cameraCapture.read() detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor( "shape_predictor_68_face_landmarks.dat") while success and cv2.waitKey(1) == -1: success, frame = cameraCapture.read() gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #生成灰度图 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) #生成直方图 clahe_image = clahe.apply(gray) detections = detector(clahe_image, 1) for k, d in enumerate(detections): shape = predictor(clahe_image, d) # 获取坐标 for i in range(1, 68): # 每张脸都有68个识别点 cv2.circle(frame, (shape.part(i).x, shape.part(i).y), 1, (0, 0, 255), thickness=2) cv2.imshow("Camera", frame) cameraCapture.release() cv2.destroyAllWindows()运行效果:
小结我在macBookPro上跑以上的代码在速度是上没有什么很大区别的,至少不会产生卡顿。但如果换将代码植到树莓3和树莓Zero上区别就明显了,HAAR分类器在树梅Zero上的运行时间平均在1.2s左右,而dlib则需要8s。至于准确率Dlib又明显会优于HAAR。