zoukankan      html  css  js  c++  java
  • 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()
    
  • 相关阅读:
    synchronized底层实现学习
    [Alink漫谈之三] AllReduce通信模型
    Alink漫谈(二) : 从源码看机器学习平台Alink设计和架构
    Alink漫谈(一) : 从KMeans算法实现不同看Alink设计思想
    [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码生成 (修订版)
    从"UDF不应有状态" 切入来剖析Flink SQL代码生成
    [源码分析] 带你梳理 Flink SQL / Table API内部执行流程
    [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林
    [源码分析] 从FlatMap用法到Flink的内部实现
    Ceph 14.2.5-K8S 使用Ceph存储实战 -- <6>
  • 原文地址:https://www.cnblogs.com/chenzhen0530/p/10746731.html
Copyright © 2011-2022 走看看