基于 DeepFace 与 OpenCV 的实时情绪分析
利用计算机视觉技术实时捕捉并识别面部情绪,是情感计算领域的一个经典应用场景。通过结合 OpenCV 的视频处理能力与 DeepFace 的深度学习模型,我们可以快速构建一个能够实时显示用户情绪状态(如开心、悲伤、惊讶等)的系统。
环境准备
实现这个功能主要依赖两个核心库:
- OpenCV (
cv2):负责视频流的捕获、图像预处理以及结果绘制。 - DeepFace:封装了多种预训练的面部分析模型,这里专门用于情绪识别。
此外,为了计算帧率(FPS),我们还需要 Python 标准库中的 time 模块。虽然代码中未直接调用 numpy,但它是图像处理的基础依赖,通常随 OpenCV 一同安装。
核心逻辑梳理
整个程序的运行流程其实非常直观,就像人眼观察一样:
- 初始化摄像头:打开默认设备获取视频流。
- 循环处理每一帧:读取当前画面,进行情绪分析。
- 绘制反馈:在画面上框出人脸位置,标注识别出的情绪及置信度。
- 性能监控:计算并显示当前的 FPS,确保系统流畅度。
- 退出机制:监听键盘输入,按下
q键即可安全关闭。
这里有个细节值得注意:在调用 DeepFace.analyze() 时,我们设置了 enforce_detection=False。这意味着即使某一帧没有检测到人脸,程序也不会直接报错崩溃,而是跳过该帧继续处理,这对于实时视频流来说能显著提升稳定性。
完整代码实现
下面是完整的脚本,包含了 FPS 平滑算法和异常处理逻辑。你可以直接保存为 .py 文件运行。
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 + ( - 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()


自然表情
开心
伤心
恐惧
惊讶