跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

基于 DeepFace 与 OpenCV 的情绪分析器实现

综述由AI生成使用 DeepFace 深度学习库结合 OpenCV 实现实时情绪分析系统。通过调用摄像头获取视频流,利用深度学习模型对每一帧人脸进行情绪识别,并在画面上标注检测到的情绪类型、置信度及当前帧率。文章详细阐述了硬件组件、软件依赖及功能模块,提供了完整的 Python 代码示例,涵盖导入库、初始化变量、主循环处理、FPS 计算及结果展示等关键步骤,适用于心理健康评估、用户体验研究及互动娱乐等场景。

PgDevote发布于 2026/2/4更新于 2026/5/313.3K 浏览
基于 DeepFace 与 OpenCV 的情绪分析器实现

效果展示

自然的

文章配图

开心的

文章配图

伤心的

文章配图

恐惧的

文章配图

惊讶的

文章配图

应用场景

应用场景比较广泛,尤其是在需要了解和分析人类情感反应的场合:

  1. 心理健康评估:在心理健康领域,可以通过长期监控和分析一个人的情绪变化来辅助医生进行诊断或治疗效果评估。
  2. 用户体验研究:在产品设计、广告制作或网站开发过程中,通过观察用户在使用过程中的情绪反应,来优化产品的用户体验。
  3. 互动娱乐:在游戏或虚拟现实应用中,根据玩家的情绪状态动态调整游戏难度或故事情节,以增加沉浸感和互动性。
  4. 安全监控:在公共安全领域,通过情绪识别技术可以早期发现异常行为或潜在威胁,例如在机场安检区域或者大型公共活动场所。
  5. 教育与培训:帮助教师了解学生在学习过程中的情绪状态,以便及时调整教学方法;也可用于职业培训中,通过模拟不同情境下的情绪反应来进行针对性训练。
  6. 智能助手:集成到智能家居系统或个人助理设备中,让设备能够感知用户的情绪状态,并据此提供更加个性化的服务或响应。
  7. 疲劳驾驶预测:对于司机情绪的分析,可以监控和作为一种影响因子判断出司机的驾驶状态,以至于安全的驾驶。

总之,随着人工智能技术的发展,情绪识别作为一种重要的交互方式,在许多领域都有着巨大的潜力和广阔的应用前景。

实现组件

1. 硬件组件
  • 摄像头:用于捕捉实时视频流,通常为电脑内置的摄像头或外接 USB 摄像头。
2. 软件库与依赖
  • OpenCV (cv2):一个开源的计算机视觉和机器学习软件库。它提供了大量的图像处理和计算机视觉算法,这里主要用于捕获摄像头视频流、处理图像以及在图像上绘制矩形框和文字。
  • time:Python 标准库的一部分,用于计算时间间隔,进而计算 FPS(每秒帧数)。
  • numpy (np):虽然在这段代码中没有直接使用,但它是进行科学计算的基础库,通常与 OpenCV 一起用于更复杂的图像处理任务。
  • DeepFace:这是一个深度学习库,专门用于面部识别及其相关任务(如年龄、性别、情绪等属性的预测)。在这个应用中,DeepFace 被用来对每一帧视频中的人脸进行情绪分析。
3. 功能模块
  • 视频捕捉与处理模块:使用 cv2.VideoCapture(0) 打开摄像头,并通过循环不断读取视频帧。对每一帧图像进行处理,包括计算 FPS、进行情绪分析以及在图像上标注结果。
  • FPS 计算模块:利用 time.time() 获取当前时间戳,通过计算连续两帧之间的时间差来计算瞬时 FPS,并采用滑动平均方法平滑 FPS 值。
  • 情绪分析模块:调用 DeepFace.analyze() 函数对每一帧中的所有人脸进行情绪分析。分析结果包含每个人脸的位置、主导情绪及置信度。
  • 结果显示模块:使用 OpenCV 提供的绘图函数(如 cv2.rectangle() 和 cv2.putText())在视频帧上标记出人脸位置、显示情绪信息及置信度,并展示当前的 FPS 值。
  • 用户交互模块:通过监听键盘输入(cv2.waitKey(1)),允许用户按下 q 键退出程序。

代码详解(实现思路)

主要是通过摄像头捕捉实时视频流,然后使用深度学习模型对捕捉到的每一帧进行情绪分析,然后在视频上标记出检测到的情绪和置信度,并显示当前的 FPS(每秒帧数)。下面是对代码各个部分的详细解释:

导入必要的库
import cv2
import time
import numpy as np
from deepface import DeepFace
  • cv2:OpenCV 库,用于处理图像和视频流。
  • time:用于计算时间间隔,进而计算 FPS。
  • numpy:虽然在这段代码中没有直接使用,但通常与 OpenCV 一起用于图像处理。
  • DeepFace:一个基于深度学习的面部识别和分析库。
打开摄像头并初始化变量
cap = cv2.VideoCapture(0)
prev_time = time.time()
fps = 0
alpha = 0.9
  • cv2.VideoCapture(0):打开默认摄像头(0 代表第一个摄像头设备)。
  • prev_time 和 fps:用于计算 FPS 的变量。prev_time 保存上一帧的时间戳,而 fps 保存当前帧率。
  • alpha:用于滑动平均计算 FPS 的权重值。
主循环
while True:
    ret, frame = cap.read()
    if not ret:
        break
    # ... 处理逻辑 ...
    cap.release()
    cv2.destroyAllWindows()
  • 这个无限循环不断从摄像头读取帧 (cap.read())。如果读取失败 (ret 为 False),则退出循环。
  • 循环体内部实现了帧的获取、FPS 计算、情绪分析、结果绘制以及画面显示。
FPS 计算
current_time = time.time()
delta_time = current_time - prev_time
prev_time = current_time
if delta_time > 0:
    instant_fps = 1.0 / delta_time
    fps = alpha * fps + (1 - alpha) * instant_fps
  • 计算自上次迭代以来经过的时间 (delta_time),然后根据这个时间差计算瞬时 FPS (instant_fps)。
  • 使用滑动平均更新总体 FPS (fps)。
情绪分析及结果展示
result = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
# 遍历结果并绘制
for face in result:
    x, y, w, h = face['region']['x'], face['region']['y'], face['region']['w'], face['region']['h']
    emotion = face['dominant_emotion']
    confidence = face['emotion'][emotion]
    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    text = f'{emotion} ({confidence:.2f}%)'
    cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
  • 对每一帧调用 DeepFace.analyze() 方法进行情绪分析。actions=['emotion'] 指定只执行情绪分析。
  • 遍历返回的结果,在画面上标出人脸的位置 (cv2.rectangle) 和识别出的情绪信息 (cv2.putText)。
显示 FPS 和图像
cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)
cv2.imshow("Emotion Detection", frame)
  • 在图像上显示当前的 FPS。
  • 使用 cv2.imshow() 显示带有标注的图像。
退出条件
if cv2.waitKey(1) & 0xFF == ord('q'):
    break
  • 如果按下键盘上的 q 键,则退出循环结束程序。

最后,释放摄像头资源 (cap.release()) 并关闭所有窗口 (cv2.destroyAllWindows())。

完整代码

import cv2
import time
import numpy as np
from deepface import DeepFace

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

# FPS 计算参数
prev_time = time.time()
fps = 0
alpha = 0.9  # 滑动平均权重,数值越大,FPS 越平稳

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 计算 FPS
    current_time = time.time()
    delta_time = current_time - prev_time
    prev_time = current_time
    if delta_time > 0:
        instant_fps = 1.0 / delta_time
        fps = alpha * fps + (1 - alpha) * instant_fps

    try:
        # 进行表情识别
        result = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False)
        for face in result:
            x, y, w, h = face['region']['x'], face['region']['y'], face['region']['w'], face['region']['h']
            emotion = face['dominant_emotion']
            confidence = face['emotion'][emotion]  # 获取表情的置信度

            # 绘制人脸矩形框
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

            # 在人脸上方显示情绪信息
            text = f'{emotion} ({confidence:.2f}%)'
            cv2.putText(frame, text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
    except Exception as e:
        print("无法检测到人脸:", e)

    # 显示 FPS(平滑更新)
    cv2.putText(frame, f'FPS: {fps:.2f}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 255), 2)

    # 显示图像
    cv2.imshow("Emotion Detection", frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

总结

核心在于结合了 OpenCV 进行视频处理和 DeepFace 进行面部情绪分析的能力。通过这些组件,实现从摄像头实时捕捉视频、分析视频中人物的情绪状态并在视频画面上直观地展示分析结果的功能。

这不仅展示了如何利用现有的 AI 库快速构建实用的应用程序,也为进一步开发基于情感识别的复杂系统提供了基础框架或者是组件。

目录

  1. 效果展示
  2. 自然的
  3. 开心的
  4. 伤心的
  5. 恐惧的
  6. 惊讶的
  7. 应用场景
  8. 实现组件
  9. 1. 硬件组件
  10. 2. 软件库与依赖
  11. 3. 功能模块
  12. 代码详解(实现思路)
  13. 导入必要的库
  14. 打开摄像头并初始化变量
  15. 主循环
  16. FPS 计算
  17. 情绪分析及结果展示
  18. 遍历结果并绘制
  19. 显示 FPS 和图像
  20. 退出条件
  21. 完整代码
  22. 打开摄像头
  23. FPS 计算参数
  24. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Pixel Shuffle 与 Unshuffle 原理及算法流程
  • GitHub Agent HQ 实战:Copilot Pro 接入与代码库全生命周期管理
  • Apache Guacamole 远程桌面网关部署与配置指南
  • 利用 AIGC 技术生成古诗意境图的方法与实践
  • OpenClaw 多 Agent 与多飞书机器人配置指南
  • KaiwuDB 3.1.0 在 Ubuntu 22.04 部署实战:TLS 配置与性能基线
  • GitHub 生成 SSH 密钥配置指南
  • VSCode Python venv 环境加载失败排查与解决指南
  • QGroundControl 跨平台无人机地面站安装指南
  • Telegram 机器人 Token 与 ChatID 获取实战指南
  • Vue3 自定义 v-model 高级用法:从基础到实战
  • 软件开发并非易事:低代码与零基础的真相
  • Flutter EWS 组件适配鸿蒙实战:Exchange 邮件日历同步方案
  • 数据库连接池配置策略:高并发下的性能优化实践
  • Stack-Chan 机器人开发指南:基于 M5Stack 与 JavaScript 的互动构建
  • Cursor AI 编程工具深度解析与技术架构
  • 牛客 NC221681 dd 爱框框 滑动窗口算法解析
  • Ubuntu 22.04 中的版本控制系统 Git 实战
  • 现代 C++ 类型推导与别名模板在元编程中的应用
  • B 站生态观察:从二次元社区到 AI 创新孵化器

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online