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

借助 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 打开的窗口。
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()


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

相关文章:

  • 2月15日星期六今日早报简报微语报早读
  • 08模拟法 + 技巧 + 数学 + 缓存(D1_模拟法)
  • html css js网页制作成品——HTML+CSS+js情人节网页设计(5页)附源码
  • vue+springboot+webtrc+websocket实现双人音视频通话会议
  • 仿 RabbitMQ 消息队列6(实战项目)
  • DeepSeek 从入门到精通学习指南,2025清华大学《DeepSeek从入门到精通》正式发布104页pdf版超全解析
  • CAS单点登录(第7版)16.模仿
  • 如何使用Three.js制作3D月球与星空效果
  • Deesek:新一代数据处理与分析框架实战指南
  • TypeScript type 和 interface 的区别
  • 1-YIUI总览
  • 基于Python豆瓣电影数据可视化分析系统的设计与实现
  • vscode调试redis
  • Uniapp 从入门到精通:数据绑定与响应式原理
  • 使用pocketpal-ai在手机上搭建本地AI聊天环境
  • 基于大数据的北京市天气数据分析系统的设计与实现
  • 今日AI和商界事件(2025-02-15)
  • .NET版Word处理控件Aspose.Words教程:使用 C# 删除 Word 中的空白页
  • GeekPad智慧屏编程控制(三)
  • 微软AutoGen高级功能——Magentic-One