借助 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()
相关推荐
量子位18 分钟前
ICLR 高分论文险遭拒,只因未引用「造假」研究???作者怒喷:对方论文用 Claude 生成
人工智能·aigc
jndingxin22 分钟前
OpenCV 图形API(23)图像和通道合成
人工智能·opencv·计算机视觉
量子位25 分钟前
GPT-4.1 偷偷开跑?神秘模型上线三天已被玩疯,网友发现大量 OpenAI 痕迹
人工智能·gpt
量子位32 分钟前
人类一生所学不过 4GB,加州理工顶刊新研究引热议
人工智能·llm
一只小闪闪37 分钟前
langchain4j搭建失物招领系统(六)---实现失物查询功能-RAG使用
java·人工智能·后端
opentrending1 小时前
Github 热点项目 Krillin AI一键横转竖+AI配音+AI精准字幕,短视频创作者必备神器,效率翻倍
人工智能·git·爬虫·github·邮箱
AIbase20241 小时前
MCP工具的配置文件格式是怎么样的?MCP教程平台推荐
人工智能·ai导航站
三唐队队长1 小时前
智能车摄像头开源—9 动态权、模糊PID、速度决策、路径优化
图像处理·人工智能·嵌入式硬件·算法·开源·边缘计算
hello_ejb31 小时前
聊聊Spring AI的Prompt
人工智能·spring·prompt
xiaomu_3472 小时前
工业相机使用笔记
笔记·数码相机·计算机视觉