目录
利用基于Haar特征的级联分类器实现人脸检测;
目标
- 学习基于Haar特征的级联分类器(Cascade Callifiers)实现人脸检测;
- 扩展到人眼检测;
基础知识
Paul Viola、Michael Jones: Rapid Object Detection using a Boosted Cascade of Simple Features
OpenCV中提供了训练和检测两个部分;下面的代码主要是检测部分,也就是说利用OpenCV提供的训练好的模型进行检测;OpenCV提供了不少训练好的分类器模型,如人脸、眼睛、笑容,分类器文件位于;
有关训练的部分会涉及到上面那篇发表在2001年的CVPR上的文章;Haar特征,积分图,还有级联分类器等概念;
OpenCV实现人脸检测
#!/usr/bin/env python#-*- coding:utf-8 -*-# @Time : 19-4-21 下午1:08# @Author : chen"""基于Haar特征的级联分类器用于人脸检测https://docs.opencv.org/4.0.0/d7/d8b/tutorial_py_face_detection.html"""import cv2 # 下面两个文件下载地址# https://github.com/opencv/opencv/tree/master/data/haarcascadesprint("[INFO] 加载.xml文件")face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')# 读取图片,并转换成灰度图像print("[INFO] 转换成灰度图像")img = cv2.imread('face_2.jpeg')gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 在灰度图像下检测人脸print("[INFO] 人脸检测")faces = face_cascade.detectMultiScale(gray, 1.3, 5)count = 0for (x, y, w, h) in faces: print("[INFO] 检测到第{}张人脸图像".format(count)) count += 1 # 画矩形圈出人脸 cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) # 获取人脸灰度图像和彩色图像 roi_gray = gray[y:y+h, x:x+w] roi_color = img[y:y+h, x:x+w] # 在人脸灰度图像上检测眼睛位置 eyes = eye_cascade.detectMultiScale(roi_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)cv2.imshow('img', img)cv2.waitKey(0)cv2.destroyAllWindows()
从视频流中检测人脸
#!/usr/bin/env python#-*- coding:utf-8 -*-# @Time : 19-4-21 下午1:56# @Author : chen"""从视频流中检测人脸位置,眼睛位置"""# import the necessary packagesfrom imutils.video import VideoStreamfrom imutils.video import FPSimport timeimport cv2# 加载.xml文件print("[INFO] 加载.xml文件")face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')# 初始化视频流,唤醒摄像头print("[INFO] 开启摄像头")vs = VideoStream(src=0).start()time.sleep(2.0)# start the FPS throughput estimatorfps = FPS().start()# loop over frames from the video file streamwhile True: # 捕获视频帧 frame = vs.read() # 读取图片,并转换成灰度图像 # img = cv2.imread(img) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 在灰度图像下检测人脸 faces = face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: # 画矩形圈出人脸 cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 获取人脸灰度图像和彩色图像 roi_gray = gray[y:y + h, x:x + w] roi_color = frame[y:y + h, x:x + w] # 在人脸灰度图像上检测眼睛位置 eyes = eye_cascade.detectMultiScale(roi_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (ex + ew, ey + eh), (0, 255, 0), 2) # update the FPS counter fps.update() # show the output frame cv2.imshow("Frame", frame) key = cv2.waitKey(1) & 0xFF # if the `q` key was pressed, break from the loop if key == ord("q"): break # stop the timer and display FPS informationfps.stop()print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))# do a bit of cleanupcv2.destroyAllWindows()vs.stop()