当前位置: 首页 > article >正文

使用 Python 和 OpenCV 实现实时人脸识别

概述

人脸识别是一项重要的计算机视觉任务,广泛应用于安全监控、身份验证等领域。本文将详细介绍如何使用 Python 和 OpenCV 库实现实时人脸识别,并通过具体的代码示例来展示整个过程。

环境准备

在开始编写代码之前,确保已经安装了 OpenCV 库。可以使用以下命令安装:

pip install opencv-python
代码详解
1. 导入必要的模块
import cv2
  • import cv2:导入 OpenCV 库,用于图像处理和人脸识别。
2. 定义主函数
def main():
    # 加载Haar级联分类器
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    '''
    加载 Haar 级联分类器:
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    cv2.CascadeClassifier():这是 OpenCV 中的一个类,用于加载预先训练好的 Haar 级联分类器。
    cv2.data.haarcascades + 'haarcascade_frontalface_default.xml':这是 OpenCV 自带的预训练 Haar 级联分类器文件路径,用于检测正面人脸。
    '''
    
    # 打开默认摄像头
    cap = cv2.VideoCapture(0)
    '''
    打开默认摄像头:
    cap = cv2.VideoCapture(0)
    cv2.VideoCapture():这是 OpenCV 中的一个类,用于捕获视频。参数 0 表示打开默认摄像头。
    '''
    
    while True:
        # 读取视频流中的一帧
        ret, frame = cap.read()
        '''
        读取视频流中的一帧:
        ret, frame = cap.read()
        cap.read():从摄像头读取一帧图像。返回两个值:
        ret:布尔值,表示读取是否成功。如果读取成功,ret 为 True;否则为 False。
        frame:读取到的图像帧。
        '''
        
        if not ret:
            break
        '''
        检查读取是否成功:
        if not ret:
            break
        如果读取失败(例如摄像头断开连接),则退出循环。
        '''
        
        # 将帧转换为灰度,因为 Haar 级联分类器需要灰度图像
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        '''
        将帧转换为灰度:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.cvtColor():这是 OpenCV 中的一个函数,用于颜色空间转换。
        frame:输入图像。
        cv2.COLOR_BGR2GRAY:将 BGR 图像转换为灰度图像。
        '''
        
        # 检测人脸
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),
                                             flags=cv2.CASCADE_SCALE_IMAGE)
        '''
        检测人脸:
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30),
                                             flags=cv2.CASCADE_SCALE_IMAGE)
        face_cascade.detectMultiScale():这是 Haar 级联分类器的一个方法,用于检测图像中的人脸。
        gray:输入的灰度图像。
        scaleFactor=1.1:每次图像尺寸减小的比例。
        minNeighbors=5:每个候选矩形应保留的邻居数阈值。
        minSize=(30, 30):最小检测人脸的尺寸。
        flags=cv2.CASCADE_SCALE_IMAGE:用于优化检测过程的标志。
        '''
        
        # 在检测到的人脸周围绘制矩形
        for (x, y, w, h) in faces:
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            '''
            在检测到的人脸周围绘制矩形:
            for (x, y, w, h) in faces:
                cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
            for (x, y, w, h) in faces:遍历检测到的每个人脸。
            cv2.rectangle():这是 OpenCV 中的一个函数,用于在图像上绘制矩形。
            frame:输入图像。
            (x, y):矩形左上角的坐标。
            (x + w, y + h):矩形右下角的坐标。
            (0, 255, 0):矩形的颜色(绿色)。
            2:矩形线条的厚度。
            '''
        
        # 显示结果帧
        cv2.imshow('Face Detection', frame)
        '''
        显示结果帧:
        cv2.imshow('Face Detection', frame)
        cv2.imshow():这是 OpenCV 中的一个函数,用于显示图像。
        'Face Detection':窗口标题。
        frame:要显示的图像。
        '''
        
        # 按'q'退出循环
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        '''
        按'q'退出循环:
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        cv2.waitKey(1):等待 1 毫秒,等待用户按键。
        & 0xFF:将按键值转换为 ASCII 码。
        ord('q'):获取字符 'q' 的 ASCII 码。
        如果用户按下 'q' 键,则退出循环。
        '''
    
    # 释放摄像头并关闭所有窗口
    cap.release()
    cv2.destroyAllWindows()
    '''
    释放摄像头并关闭所有窗口:
    cap.release()
    cv2.destroyAllWindows()
    cap.release():释放摄像头资源。
    cv2.destroyAllWindows():关闭所有 OpenCV 窗口。
    '''

if __name__ == "__main__":
    main()
  • def main()::定义主函数 main
  • face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml'):加载 Haar 级联分类器,用于检测正面人脸。
  • cap = cv2.VideoCapture(0):打开默认摄像头。
  • while True::进入无限循环,实时读取摄像头图像。
  • ret, frame = cap.read():从摄像头读取一帧图像。
  • if not ret::检查读取是否成功,如果失败则退出循环。
  • gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY):将图像转换为灰度图像。
  • faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE):检测图像中的人脸。
  • for (x, y, w, h) in faces::遍历检测到的每个人脸,并在图像上绘制矩形。
  • cv2.imshow('Face Detection', frame):显示带有矩形标记的图像。
  • if cv2.waitKey(1) & 0xFF == ord('q')::按 ‘q’ 键退出循环。
  • cap.release():释放摄像头资源。
  • cv2.destroyAllWindows():关闭所有 OpenCV 窗口。
测试
  1. 确保你的摄像头正常工作。

  2. 运行脚本:

    python3 face_detection.py
    
  3. 打开摄像头后,你会看到一个窗口显示实时视频流,并且在检测到的人脸周围绘制绿色矩形。

  4. 按 ‘q’ 键退出程序。

总结

本文详细介绍了如何使用 Python 和 OpenCV 库实现实时人脸识别,并通过具体的代码示例展示了整个过程。通过使用 cv2.CascadeClassifier 加载预训练的 Haar 级联分类器,cv2.VideoCapture 打开摄像头,cv2.cvtColor 转换图像颜色空间,cv2.rectangle 绘制矩形,最终实现了在实时视频流中检测并标记人脸的功能。



http://www.kler.cn/a/383414.html

相关文章:

  • 数据结构之栈,队列,树
  • 事件驱动编程与异步编程:原理、对比及实践案例
  • FreeSql
  • Django 模型中使用选择(choices):全面指南
  • C++之红黑树模拟实现
  • 各种网站(学习资源及其他)
  • React Native使用axios会不会有问题
  • ROS话题通信机制理论模型的学习
  • 应用插件化及其进程关系梳理
  • 数据揭秘:掌握K-means聚类算法的精髓与实践
  • threejs 数字孪生,制作3d炫酷网页
  • 关于Excel的操作,数据转换
  • 大数据算法:一、损失函数
  • JVM垃圾回收详解
  • day-81 打家劫舍 II
  • Linux篇(文件管理命令)
  • 泷羽sec学习打卡-shodan扫描1
  • 【短视频矩阵系统开发指南与源码构建技术分享】
  • Django命令行操作用户(manage.py工具)
  • Golang--面向对象
  • 智能指针std::shared_ptr
  • 音频怎么转换成二维码?扫码播放音频的制作方法
  • 《XGBoost算法的原理推导》12-7损失函数经验损失项二阶泰勒展开式 公式解析
  • 归并排序:高效算法的深度解析
  • 大模型LLama3!!!Ollama下载、部署和应用(保姆级详细教程)
  • K8s小白入门