Loading

基于 Haar 级联分类器进行人脸识别学习项目

一、提前准备

  1. Haar 级联分类器

    使用 Haar 识别人脸数据,Haar 来源于 Opencv 官网:https://opencv.org/releases/。

    Windows 直接下载安装即可,Linux 参考其他教程。

    img

  2. python 库

    程序用到了 opencv-python 库,终端输入:pip install opecv-python 进行安装。

二、程序

2.1 图片人脸检测

给定一张图片,然后识别图片内的人脸数据,并在人脸周围画出方框。

左原图,右结果。

img

cv2.CascadeClassifier() 里的文件地址为你安装的 haar 地址。

import cv2


def picture_face_detection(filepath):
    """图片人脸检测,并保存处理好的视频文件

    :param filepath: 图片文件路径
    """

    img = cv2.imread(filepath)  # 读取图片
    # img = cv2.resize(img, dsize=(500, 360))   # 改变图片大小尺寸
    gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)    # 生成灰度图,检测能更精准

    # 加载一个分类器,转载人脸识别
    face_detect = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml")

    # 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
    # scaleFactor:缩放,默认1.1       minNeighbors:邻居,人脸苛刻度,默认3
    # minSize:人脸最小尺寸       maxSize:人脸最大尺寸
    # faces = face_detect.detectMultiScale(gray_img, scaleFactor=1.1,
    #                                      minNeighbors=3, minSize=(80, 80), maxSize=(90, 90))
    faces = face_detect.detectMultiScale(gray_img)  # 给默认也可以,方便

    # 将人脸识别数据绘制到图像中
    for x, y, w, h in faces:
        # 画方形
        cv2.rectangle(img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=4)

        # 画圆形
        # cv2.circle(img, center=(x+w//2, y+h//2), radius=w//2, color=(0, 0, 255), thickness=2)

    cv2.imshow('result', img)   # 显示图片
    cv2.waitKey(0)  # 等待
    cv2.destroyAllWindows()     # 退出cv,删除缓存

2.2 视频文件人脸检测

识别视频每一帧的人脸(可实时预览),然后将结果导出保存到本地,生成 .mp4 文件。

cv2.CascadeClassifier() 里的文件地址为你安装的 haar 地址。

import cv2


def video_face_detection(filepath):
    """视频人脸检测,并保存处理好的视频文件

    :param filepath: 视频文件路径
    """

    video = cv2.VideoCapture(filepath)  # 读取视频文件
    width, height = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 宽高
    # 用于保存视频文件
    writer = cv2.VideoWriter(filename='Resource/output.mp4',
                             fourcc=cv2.VideoWriter_fourcc(*'MP4V'),    # 视频编码格式
                             fps=video.get(cv2.CAP_PROP_FPS),   # 视频帧率
                             frameSize=(width, height))  # 视频宽高
    face_detect_classifier = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml")
    while True:
        read_flag, image = video.read()     # 读取每一帧,flag表示是否读取成功

        if read_flag is False:
            print('视频读取完成')
            break
        if cv2.waitKey(1) == ord('q'):
            print('已停止读取视频文件')
            break
        # image = cv2.resize(image, (428, 240))   # 调整尺寸,图像小一点可以提高识别速度
        gray_img = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  # 转成灰度图,加快人脸识别速度
        faces = face_detect_classifier.detectMultiScale(image=gray_img)    # 检测人脸
        for x, y, w, h in faces:
            cv2.rectangle(image, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
        cv2.imshow('test', image)
        writer.write(image)     # 将当前帧图像写入本地

    cv2.destroyAllWindows()
    video.release()     # 释放内存
    writer.release()

2.3 摄像头实时人脸检测

调用电脑自带摄像头,实时检测人脸数据。

⚠️ Windows、Linux 笔记本电脑 cv2.VideoCapture(0) 的参数为 0,Mac 电脑参数为 1。

cv2.CascadeClassifier() 里的文件地址为你安装的 haar 地址。

import cv2


def camera_face_detection():
    """摄像头实时人脸检测"""

    cap = cv2.VideoCapture(0)   # 打开摄像头,0表示默认摄像头。也可以打开视频文件,0换成视频文件地址即可
    # 加载一个分类器,转载人脸识别
    face_detect_classifier = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")

    while True:
        flag, frame = cap.read()    # 读取当前摄像头参数,参数为:是否读取到视频、视频帧

        if not flag:    # 如果没有捕捉到摄像头,则退出检测
            print('未找到摄像头,已退出')
            break

        gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 生成灰度图像,用于人脸识别

        # 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
        # faces = face_detect_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=3)
        faces = face_detect_classifier.detectMultiScale(gray_img)  # 给默认也可以

        # 将人脸识别数据绘制到图像中,画方框
        for x, y, w, h in faces:
            cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)

        cv2.imshow('face', frame)   # 显示图片

        # 键盘输入q则退出
        if cv2.waitKey(1000//24) == ord('q'):
            break

    cv2.destroyAllWindows()    # 退出cv,删除缓存
    cap.release()    # 关闭摄像头

2.4 人脸微笑检测

逻辑和上面类似,该程序调用摄像头实时检测笑容。

cv2.CascadeClassifier() 里的文件地址为你安装的 haar 地址。

import cv2


def camera_smile_detection():
    """摄像头人脸微笑检测"""

    cap = cv2.VideoCapture(0)   # 打开摄像头,0表示默认摄像头。也可以打开视频文件,0换成视频文件地址即可
    # 加载分类器
    face_detect_classifier = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
    smile_detect_classifier = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_smile.xml")

    while True:
        flag, frame = cap.read()    # 读取当前摄像头参数,参数为:是否读取到视频、视频帧

        if not flag:    # 如果没有捕捉到摄像头,则退出检测
            print('未找到摄像头,已退出')
            break

        gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 生成灰度图像,用于人脸识别

        # 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
        # faces = face_detect_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=3)
        faces = face_detect_classifier.detectMultiScale(gray_img)  # 给默认也可以

        # 先找到人脸,然后在人脸的范围内找微笑表情,可以节省大量的资源
        for x, y, w, h in faces:
            frame = cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
            face_area = gray_img[y:y+h, x:x+w]  # 框选出人脸位置
            smiles = smile_detect_classifier.detectMultiScale(face_area, scaleFactor=1.3,
                                                              minNeighbors=55, minSize=(25, 25),
                                                              flags=cv2.CASCADE_SCALE_IMAGE)
            for ex, ey, ew, eh in smiles:
                cv2.rectangle(frame, (ex+x, ey+y), (ex+ew+x, ey+eh+y), (0, 255, 0), 1)
                cv2.putText(frame, 'Smile', (x, y-7), 3, 1.2, (0, 0, 255), 2, cv2.LINE_AA)
        cv2.imshow('face', frame)   # 显示图片

        # 键盘输入q则退出,一秒24帧,匹配摄像头视频帧数
        if cv2.waitKey(1) == ord('q'):
            break

    cv2.destroyAllWindows()    # 退出cv,删除缓存
    cap.release()    # 关闭摄像头

2.5 人眼检测

逻辑和上面类似,该程序调用摄像头实时检测眼睛位置并标注出来。

cv2.CascadeClassifier() 里的文件地址为你安装的 haar 地址。

import cv2


def camera_eye_detection():
    """摄像头人眼检测"""

    cap = cv2.VideoCapture(0)   # 打开摄像头,0表示默认摄像头。也可以打开视频文件,0换成视频文件地址即可
    # 加载分类器
    face_detect_classifier = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
    eye_detect_classifier = cv2.CascadeClassifier(
        "C:/Software/opencv/sources/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml")

    while True:
        flag, frame = cap.read()    # 读取当前摄像头参数,参数为:是否读取到视频、视频帧

        if not flag:    # 如果没有捕捉到摄像头,则退出检测
            print('未找到摄像头,已退出')
            break

        gray_img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 生成灰度图像,用于人脸识别

        # 识别人脸位置,参数:图像,缩放倍数,检测次数,默认0,人脸最小和最大的范围
        # faces = face_detect_classifier.detectMultiScale(gray_img, scaleFactor=1.1, minNeighbors=3)
        faces = face_detect_classifier.detectMultiScale(gray_img)  # 给默认也可以

        # 先找到人脸,然后在人脸的范围内找眼睛,可以节省大量的资源
        for x, y, w, h in faces:
            frame = cv2.rectangle(frame, pt1=(x, y), pt2=(x+w, y+h), color=(0, 0, 255), thickness=2)
            face_area = gray_img[y:y+h, x:x+w]  # 框选出人脸位置
            eyes = eye_detect_classifier.detectMultiScale(face_area, scaleFactor=1.3, minNeighbors=5)
            for ex, ey, ew, eh in eyes:
                cv2.rectangle(frame, (ex+x, ey+y), (ex+ew+x, ey+eh+y), (0, 255, 0), 1)
        cv2.imshow('face', frame)   # 显示图片

        # 键盘输入q则退出,一秒24帧,匹配摄像头视频帧数
        if cv2.waitKey(1000//24) == ord('q'):
            break

    cv2.destroyAllWindows()    # 退出cv,删除缓存
    cap.release()    # 关闭摄像头
posted @ 2023-02-26 14:51  滑稽果  阅读(224)  评论(0编辑  收藏  举报
浏览器标题切换
浏览器标题切换end