借助 OpenCV 库实现实时的脸部识别

代码整体功能概述

这段 Python 代码借助 OpenCV 库实现了一个实时的脸部识别程序,同时简单模拟了姿势检测功能。它会开启计算机的摄像头,持续读取视频帧,对每一帧画面进行脸部检测,若检测到脸部就绘制矩形框标记出来,并且在画面上显示检测到的类别信息,最后按 q 键可以退出程序。

代码详细说明

1. 导入必要的库

python

复制代码
import cv2
  • 功能:导入 OpenCV 库,该库是一个强大的计算机视觉库,提供了诸多图像处理和计算机视觉算法。
2. 加载脸部识别模型

python

复制代码
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
  • 功能 :使用 cv2.CascadeClassifier 类加载预训练的 Haar 级联分类器模型,此模型用于检测正面人脸。cv2.data.haarcascades 是 OpenCV 自带的 Haar 级联分类器文件所在的目录,haarcascade_frontalface_default.xml 是正面人脸检测的模型文件。
3. 打开摄像头

python

复制代码
cap = cv2.VideoCapture(0)
  • 功能 :使用 cv2.VideoCapture 类打开计算机的默认摄像头(设备编号为 0)。若存在多个摄像头,可通过修改设备编号来选择不同的摄像头。
4. 循环读取视频帧并处理

python

复制代码
while True:
    # 读取摄像头的一帧画面
    ret, frame = cap.read()
    if not ret:
        break
  • 功能 :开启一个无限循环,持续从摄像头读取视频帧。cap.read() 方法会返回两个值,ret 是一个布尔值,表示是否成功读取到帧;frame 是读取到的视频帧图像。若 retFalse,则说明无法读取到帧,此时跳出循环。
5. 将图像转换为灰度图

python

复制代码
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  • 功能 :使用 cv2.cvtColor 方法将读取到的彩色图像(BGR 格式)转换为灰度图像。因为 Haar 级联分类器在灰度图像上的检测效果更好,并且处理灰度图像的速度更快。
6. 初始化检测到的类别列表

python

复制代码
detected_classes = []
  • 功能 :创建一个空列表 detected_classes,用于存储检测到的类别信息。
7. 脸部检测

python

复制代码
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if len(faces) > 0:
    for (x, y, w, h) in faces:
        # 绘制脸部矩形框
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
    detected_classes.append("Face")
  • 功能
    • face_cascade.detectMultiScale 方法用于在灰度图像上进行脸部检测。scaleFactor=1.1 表示每次图像缩放的比例;minNeighbors=5 表示每个候选矩形框需要满足的最小邻居数;minSize=(30, 30) 表示检测到的人脸的最小尺寸。
    • 若检测到人脸(即 faces 列表的长度大于 0),则遍历 faces 列表,使用 cv2.rectangle 方法在原始彩色图像上绘制蓝色(BGR 格式为 (255, 0, 0))的矩形框来标记人脸,矩形框的左上角坐标为 (x, y),宽度为 w,高度为 h,线宽为 2。
    • 最后将 "Face" 添加到 detected_classes 列表中。
8. 姿势检测(简单模拟)

python

复制代码
if len(detected_classes) > 0:
    detected_classes.append("Possible Pose")
  • 功能 :简单模拟姿势检测功能。若检测到了脸部(即 detected_classes 列表的长度大于 0),则将 "Possible Pose" 添加到 detected_classes 列表中。需要注意的是,OpenCV 原生对姿势检测的功能较弱,这里只是给出一个提示信息,若需要更精确的姿势检测,可以使用更专业的库,如 mmpose
9. 显示检测到的类别信息

python

复制代码
if detected_classes:
    classes_text = ", ".join(detected_classes)
    cv2.putText(frame, f"Detected: {classes_text}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
  • 功能 :若 detected_classes 列表不为空,则将列表中的元素用逗号连接成一个字符串 classes_text。然后使用 cv2.putText 方法在原始彩色图像的左上角(坐标为 (10, 30))显示检测到的类别信息,字体为 cv2.FONT_HERSHEY_SIMPLEX,字体大小为 1,颜色为绿色(BGR 格式为 (0, 255, 0)),线宽为 2。
10. 显示处理后的图像

python

复制代码
cv2.imshow('Combined Detection', frame)
  • 功能 :使用 cv2.imshow 方法显示处理后的图像,窗口标题为 "Combined Detection"
11. 按 q 键退出循环

python

复制代码
if cv2.waitKey(1) & 0xFF == ord('q'):
    break
  • 功能 :使用 cv2.waitKey(1) 方法等待 1 毫秒,检测是否有按键事件发生。& 0xFF 是为了确保只获取按键的低 8 位。若按下的键是 q,则跳出循环。
12. 释放摄像头并关闭所有窗口

python

复制代码
cap.release()
cv2.destroyAllWindows()
  • 功能
    • cap.release() 方法用于释放摄像头资源。
    • cv2.destroyAllWindows() 方法用于关闭所有由 OpenCV 打开的窗口。
python 复制代码
import cv2

# 加载脸部识别模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取摄像头的一帧画面
    ret, frame = cap.read()
    if not ret:
        break

    # 将图像转换为灰度图,因为 Haar 级联分类器在灰度图上效果更好
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    detected_classes = []

    # 脸部检测
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    if len(faces) > 0:
        for (x, y, w, h) in faces:
            # 绘制脸部矩形框
            cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
        detected_classes.append("Face")

    # 姿势检测(简单模拟)
    # 这里仅作提示信息,opencv 原生对姿势检测功能弱
    # 你可以根据需求使用更专业的库如 mmpose 等实现
    if len(detected_classes) > 0:
        detected_classes.append("Possible Pose")

    # 显示检测到的类别信息
    if detected_classes:
        classes_text = ", ".join(detected_classes)
        cv2.putText(frame, f"Detected: {classes_text}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

    # 显示处理后的图像
    cv2.imshow('Combined Detection', frame)

    # 按 'q' 键退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头并关闭所有窗口
cap.release()
cv2.destroyAllWindows()
相关推荐
二川bro4 小时前
多模态AI开发:Python实现跨模态学习
人工智能·python·学习
张彦峰ZYF4 小时前
AI赋能原则1解读思考:超级能动性-AI巨变时代重建个人掌控力的关键能力
人工智能·ai·aigc·ai-native
love530love4 小时前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui
Lucky小小吴4 小时前
Google《Prompt Engineering》2025白皮书——最佳实践十四式
人工智能·prompt
AI科技星4 小时前
为什么变化的电磁场才产生引力场?—— 统一场论揭示的时空动力学本质
数据结构·人工智能·经验分享·算法·计算机视觉
青瓷程序设计4 小时前
昆虫识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
咩图4 小时前
C#创建AI项目
开发语言·人工智能·c#
深蓝海拓4 小时前
opencv的模板匹配(Template Matching)学习笔记
人工智能·opencv·计算机视觉
美林数据Tempodata4 小时前
李飞飞最新论文深度解读:从语言到世界,空间智能将重写AI的未来十年
人工智能·ai·空间智能
东哥说-MES|从入门到精通5 小时前
数字化部分内容 | 十四五年规划和2035年远景目标纲要(新华社正式版)
大数据·人工智能·数字化转型·mes·数字化工厂·2035·十四五规划