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

用 DeepFace 和 OpenCV 搭一个实时情绪检测器

用 Python 快速搭建一个实时情绪识别系统,主要依赖 OpenCV 处理视频流、DeepFace 进行面部情绪分析。代码几十行:打开摄像头,逐帧计算平滑后的 FPS,调用 DeepFace.analyze 检测每个人脸的主导情绪并标注置信度,最后在窗口显示结果。可识别开心、伤心、恐惧、惊讶等常见表情,准确度尚可,适合作为情绪识别基础框架扩展更多功能。

remedios发布于 2026/6/300 浏览
用 DeepFace 和 OpenCV 搭一个实时情绪检测器

情绪识别这玩意儿这几年用得越来越多,算不上多高深,但随手搭一个出来玩玩还挺有意思。这篇就聊聊怎么用 DeepFace 和 OpenCV 快速整一个实时情绪分析的小应用。

摄像头捕捉的人脸情绪识别效果

能用来干什么

说一些常见的落地场景,不一定都靠谱,但思路可以借鉴:

  • 心理健康:长期监控情绪变化,辅助医生做评估,不过准确度这块还得打个问号。
  • 用户体验研究:看用户试用产品时的表情,比问卷来得直接。
  • 游戏和 VR:根据玩家情绪动态调整难度,沉浸感会强一些。
  • 安防监控:在公共场所检测异常情绪,但容易有误报。
  • 教育:老师能大致了解学生听课状态,上课走神一眼就能看出来?没那么神。
  • 智能助手:设备感知到你不耐烦了,就少说废话。
  • 疲劳驾驶:配合其他传感器,情绪也算一个维度。

用了哪些轮子

硬件就是普通摄像头,笔记本自带的就行。

软件方面:

  • OpenCV:处理视频流、画框写字。
  • DeepFace:封装了人脸分析和情绪预测,省得自己训模型。
  • Python 标准库,比如 time 算帧率。

代码怎么跑的

逻辑很简单:打开摄像头 → 抓帧 → 算 FPS → 调 DeepFace 分析 → 把结果画到画面上 → 按 q 退出。

初始化

先导库,然后打开默认摄像头。prev_time 记录上一帧时间,fps 是当前帧率,用指数移动平均(alpha 0.9)平滑一下,否则数字跳得没法看。

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

cap = cv2.VideoCapture(0)
prev_time = time.time()
fps = 0
alpha = 0.9

主循环与 FPS

每帧计算时间差,求瞬时 FPS 再平滑。写了个简单的滑动平均,alpha 越大曲线越稳,但响应会慢。

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

    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

情绪分析

调用 DeepFace.analyze(),只跑情绪 (actions=['emotion']),关闭强制人脸检测(enforce_detection=False)防止没检测到人脸时程序崩溃。返回结果里取坐标和主导情绪,画个绿框,把情绪和置信度标在框上方。

    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,按 q 键退出,释放摄像头。

    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()

完整代码

把上面的片段拼起来就是一个完整的脚本:

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

cap = cv2.VideoCapture(0)
prev_time = time.time()
fps = 0
alpha = 0.9

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

    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)

    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()

效果图

下面是我自己跑出来的几张截图,DeepFace 对常见表情的识别还算稳定,不过真人情绪复杂,偶尔会识别成'neutral'。

不同表情的识别示例

自然状态

自然表情识别为 neutral

开心

识别为 happy

伤心

识别为 sad

恐惧

识别为 fear

惊讶

识别为 surprise

收尾

核心就是 OpenCV 读视频 + DeepFace 做推理,几十行代码就能跑起来。如果想更实用,可以加个日志记录情绪变化,或者把结果推到后端做进一步分析。DeepFace 还能检测年龄、性别、种族,有兴趣可以自己改 actions 参数试试。

目录

  1. 能用来干什么
  2. 用了哪些轮子
  3. 代码怎么跑的
  4. 初始化
  5. 主循环与 FPS
  6. 情绪分析
  7. 显示和退出
  8. 完整代码
  9. 效果图
  10. 收尾
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • CARRY4进位链在TDC中的行为仿真:从抽头延迟到温度计码
  • Spring Boot 用户模块实战:注册登录、JWT 认证与敏感数据加密
  • 在 Python 和 REST API 中使用 AutoGen Studio 导出的团队配置
  • 华为交换机初始配置实录:Console 登录、管理 IP 与 Web 网管开通
  • 从后端到前端:AI Agent 跨语言全栈项目实战记录(Java + Python + Vue3)
  • 在银河麒麟 V10 上使用 Docker 和 Compose 部署 .NET 8 WebAPI
  • 从零构建国产电视剧评分数据集:一个爬虫实战记录
  • WebSocket 客户端实践:重连、心跳与可靠通信
  • 从零搭建一个能调用 API 的 AI Agent
  • 汉诺塔问题的递归与非递归 C++ 解法
  • 7款国内AI助手横评:豆包、元宝、千问、Kimi、DeepSeek、MiniMax、GLM
  • 2026 算法求职:为什么我劝你深耕多模态大模型
  • 2023年网络安全趋势观察:十个绕不开的方向
  • Star-Office-UI:用像素办公室可视化AI工作状态
  • 用 MGeo 和 Neo4j 搭建中文地址语义知识图谱
  • Temperature 和 Top-P 调参手记:从输出翻车到稳定产出的经验
  • 在 OpenHarmony 上跑通 tflite_web:WASM 推理适配要点
  • 用 webdav-server 搭一个轻量文件共享服务
  • pycdc 上手指南:从 .pyc 还原 Python 源码
  • GitHub 仓库配置与推送:从 SSH 到冲突解决

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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