借助 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()
相关推荐
蹦蹦跳跳真可爱5895 分钟前
Python----计算机视觉处理(opencv:图片灰度化)
人工智能·python·opencv·计算机视觉
岛屿旅人8 分钟前
基于生成式人工智能的网络安全主动防御技术(上)
网络·人工智能·安全·web安全·网络安全
A林玖12 分钟前
KNN算法原理及python代码实现
人工智能·机器学习
喵叔哟1 小时前
AI落地:走入生活--引言
人工智能·生活
GIS数据转换器1 小时前
空间遥感智能处理技术发展现状与趋势
大数据·人工智能·gis·智慧城市
六边形战士DONK1 小时前
03_NLP常用的文本数据分析处理方法
人工智能·自然语言处理·数据分析
梦丶晓羽1 小时前
自然语言处理:主题模型
人工智能·python·自然语言处理·lda·主题模型
_zwy1 小时前
通义万相2.1 图生视频:为AI绘梦插上翅膀,开启ALGC算力领域新纪元
人工智能·深度学习·计算机视觉·ai作画
数字供应链安全产品选型1 小时前
新一代开源数字供应链安全审查与治理平台:悬镜源鉴SCA
网络·人工智能·安全·开源·开源软件
虾球xz1 小时前
游戏引擎学习第149天
人工智能·学习·游戏引擎