Object Detection: Face Detection using Haar Cascades


  利用基于Haar特征的级联分类器实现人脸检测;官方教程


目标

  • 学习基于Haar特征的级联分类器(Cascade Callifiers)实现人脸检测;
  • 扩展到人眼检测;

基础知识

Paul Viola、Michael Jones: Rapid Object Detection using a Boosted Cascade of Simple Features

  OpenCV中提供了训练和检测两个部分;下面的代码主要是检测部分,也就是说利用OpenCV提供的训练好的模型进行检测;OpenCV提供了不少训练好的分类器模型,如人脸、眼睛、笑容,分类器文件位于GitHub

  有关训练的部分会涉及到上面那篇发表在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/haarcascades
print("[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 = 0
for (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 packages
from imutils.video import VideoStream
from imutils.video import FPS
import time
import 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 estimator
fps = FPS().start()

# loop over frames from the video file stream
while 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 information
fps.stop()
print("[INFO] elasped time: {:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS: {:.2f}".format(fps.fps()))

# do a bit of cleanup
cv2.destroyAllWindows()
vs.stop()
posted @ 2019-04-21 20:28  chenzhen0530  阅读(263)  评论(0编辑  收藏  举报