基于 DeepFace 与 OpenCV 的实时情绪分析器
利用计算机视觉技术实时捕捉并分析人脸表情,是许多智能交互场景的基础。本文介绍如何使用 Python 结合 OpenCV 和 DeepFace 库,快速搭建一个能够识别七种基本情绪的演示程序。
核心依赖
项目主要依赖以下几个组件:
- OpenCV (
cv2):负责视频流捕获、图像预处理及结果绘制。 - DeepFace:封装了多种深度学习模型,用于面部特征提取及属性分析。
- NumPy & Time:辅助数据处理及帧率计算。
实现思路
整个流程并不复杂,核心在于'捕获 - 分析 - 渲染'的闭环。
初始化与资源管理
首先打开默认摄像头设备,并设置好 FPS 计算的变量。为了获得更稳定的帧率显示,我们采用指数加权移动平均(EWMA)来平滑瞬时 FPS 值,避免画面跳动过大影响观感。
cap = cv2.VideoCapture(0)
prev_time = time.time()
fps = 0
alpha = 0.9 # 平滑系数
主循环与帧处理
在 while True 循环中,我们逐帧读取视频流。如果读取失败则退出。每一帧的处理包含三个关键步骤:计算当前帧率、调用 DeepFace 进行情绪分析、将结果绘制回画布。
值得注意的是,DeepFace 的分析接口可能会因为检测不到人脸而抛出异常,因此我们在调用时增加了 try-except 块,确保程序不会因单帧失败而崩溃。同时,enforce_detection=False 参数允许在没有检测到人脸时继续运行,这在某些边缘情况下很有用。
结果可视化
分析完成后,DeepFace 会返回主导情绪及其置信度。我们将这些信息绘制在人脸矩形框上方,并在左上角显示当前的 FPS。按下 q 键即可安全释放摄像头资源并关闭窗口。
完整代码
下面是整合后的完整脚本,可以直接运行测试。
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
delta_time > :
instant_fps = / delta_time
fps = alpha * fps + ( - alpha) * instant_fps
:
result = DeepFace.analyze(frame, actions=[], enforce_detection=)
face result:
x, y, w, h = face[][], face[][], face[][], face[][]
emotion = face[]
confidence = face[][emotion]
cv2.rectangle(frame, (x, y), (x + w, y + h), (, , ), )
text =
cv2.putText(frame, text, (x, y - ), cv2.FONT_HERSHEY_SIMPLEX, , (, , ), )
Exception e:
(, e)
cv2.putText(frame, , (, ), cv2.FONT_HERSHEY_SIMPLEX, , (, , ), )
cv2.imshow(, frame)
cv2.waitKey() & == ():
cap.release()
cv2.destroyAllWindows()



