引言
情绪识别是计算机视觉中一个有趣且实用的方向。通过摄像头捕捉人脸,利用深度学习模型分析面部表情,我们不仅能看到技术落地的可能性,还能将其应用到心理健康评估、用户体验研究等实际场景中。
本项目使用 Python 编写,核心依赖 DeepFace 进行情感分析,OpenCV 处理视频流和图像绘制。下面我将带你一步步拆解实现过程。
环境准备
除了基础的 Python 环境外,你需要安装以下库:
- OpenCV (
cv2):负责摄像头捕获、图像处理及界面绘制。 - DeepFace:基于深度学习的 API,提供年龄、性别、情绪等属性预测。
- NumPy & Time:用于数值计算和时间戳管理(FPS 计算)。
安装命令通常如下:
pip install opencv-python deepface numpy
核心逻辑解析
1. 初始化与视频流
程序启动后,首先调用 cv2.VideoCapture(0) 打开默认摄像头。这里需要注意,如果系统有多个摄像头设备,可能需要调整索引值。
2. FPS 帧率计算
为了监控程序性能,我们需要计算每秒帧数(FPS)。简单的做法是记录两帧之间的时间差,但直接显示瞬时值会跳动剧烈。因此,我采用滑动平均算法(Exponential Moving Average),通过权重参数 alpha 来平滑数据,让显示的 FPS 更稳定。
3. 情绪分析与绘制
这是最关键的部分。在每一帧循环中:
- 读取当前画面。
- 调用
DeepFace.analyze()并指定actions=['emotion']。 - 遍历返回结果,提取人脸区域坐标、主导情绪及置信度。
- 使用 OpenCV 的绘图函数在画面上框出人脸,并在上方标注情绪名称和百分比。
如果遇到无人脸或识别失败的情况,代码中加入异常捕获机制,避免程序直接崩溃,同时打印错误信息以便调试。
4. 交互控制
主循环中使用 cv2.waitKey(1) 监听键盘输入。按下 q 键即可退出程序,释放摄像头资源并关闭窗口。
完整代码
将上述逻辑整合在一起,完整的脚本如下。注意代码中的注释,它们解释了关键步骤的设计意图。
import cv2
import time
import numpy as np
from deepface import DeepFace
# 打开摄像头,0 代表默认设备
cap = cv2.VideoCapture(0)
# FPS 计算相关变量
prev_time = time.time()
fps = 0
alpha = 0.9 # 滑动平均权重,越大越平稳
while True:
ret, frame = cap.read()
if not ret:
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()







