基于OpenCV与深度学习的人脸表情识别系统:Python编程,OpenCV与PyQt技术集成...
这玩意儿看着像电影里的黑科技,其实用Python+OpenCV+PyQt就能整出来,还能打包成exe到处跑。这项目最妙的地方在于扩展性——想改UI样式直接动PyQt的代码,要提升识别准确率就换更牛逼的模型。PyQt搭的界面主要分三块:左边是视频显示区域,中间是功能按钮,右边是表情分析结果。下次考虑做个升级版,加上姿态估计和语音情绪分析,搞个多模态情感识别,那才带劲!相关技术:python,open
基于OpenCV的人脸表情识别系统 相关技术:python,opencv,pyqt,深度学习 可编译为.exe文件。 软件说明:摄像头实时检测,加载照片,视频均 有基础的同学,可自行修改完善。 第一张和第二张为运行截图。
最近在搞一个挺有意思的项目——用摄像头实时识别人脸表情。这玩意儿看着像电影里的黑科技,其实用Python+OpenCV+PyQt就能整出来,还能打包成exe到处跑。咱直接上干货,带你看代码怎么玩转这个系统。

基于OpenCV的人脸表情识别系统 相关技术:python,opencv,pyqt,深度学习 可编译为.exe文件。 软件说明:摄像头实时检测,加载照片,视频均 有基础的同学,可自行修改完善。 第一张和第二张为运行截图。
先看界面长啥样(假装你看到了截图)。PyQt搭的界面主要分三块:左边是视频显示区域,中间是功能按钮,右边是表情分析结果。用QGridLayout搞布局比绝对定位省心多了:
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.central_widget = QtWidgets.QWidget()
self.setCentralWidget(self.central_widget)
layout = QtWidgets.QGridLayout()
self.video_label = QtWidgets.QLabel()
self.result_label = QtWidgets.QLabel()
button_layout = QtWidgets.QVBoxLayout()
# 按钮们
self.cam_btn = QtWidgets.QPushButton('打开摄像头')
self.img_btn = QtWidgets.QPushButton('打开图片')
self.video_btn = QtWidgets.QPushButton('打开视频')
button_layout.addWidget(self.cam_btn)
button_layout.addWidget(self.img_btn)
button_layout.addWidget(self.video_btn)
layout.addWidget(self.video_label, 0, 0)
layout.addLayout(button_layout, 0, 1)
layout.addWidget(self.result_label, 0, 2)
self.central_widget.setLayout(layout)
摄像头处理是重头戏。OpenCV的VideoCapture配合QTimer实现实时画面刷新,这里有个坑——直接在主线程处理视频会卡界面。咱们用多线程+信号槽解决:
class VideoThread(QtCore.QThread):
change_pixmap = QtCore.pyqtSignal(QtGui.QImage) # 画面更新信号
def run(self):
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if ret:
rgb_image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
h, w, ch = rgb_image.shape
qt_image = QtGui.QImage(rgb_image.data, w, h, ch*w, QtGui.QImage.Format_RGB888)
self.change_pixmap.emit(qt_image) # 发射信号更新UI
表情识别模型用了个轻量化的CNN,基于FER2013数据集训练。加载模型时注意OpenCV的DNN模块和Keras模型的配合:
# 加载预训练模型
emotion_model = keras.models.load_model('emotion_model.h5')
emotion_labels = ['生气', '开心', '害怕', '中性', '悲伤', '惊讶']
# 人脸检测器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
def detect_emotion(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
face_roi = gray[y:y+h, x:x+w]
resized = cv2.resize(face_roi, (48,48))
normalized = resized / 255.0
reshaped = np.reshape(normalized, (1,48,48,1))
# 预测表情
predictions = emotion_model.predict(reshaped)
max_index = np.argmax(predictions[0])
emotion = emotion_labels[max_index]
# 画框和文字
cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
cv2.putText(frame, emotion, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)
return frame
打包成exe用pyinstaller,注意隐藏深度学习库的warning。写个bat脚本省事:
pyinstaller --noconsole --hidden-import=h5py.defs --hidden-import=h5py.utils --add-data="haarcascade_frontalface_default.xml;." --add-data="emotion_model.h5;." main.py
遇到过的坑给各位提个醒:
- OpenCV和PyQt的像素格式要转RGB,否则颜色会乱
- 多线程处理视频时记得释放摄像头资源
- 模型输入尺寸(48x48)要和训练时一致
- 打包时别忘了把xml和h5模型文件带上
这项目最妙的地方在于扩展性——想改UI样式直接动PyQt的代码,要提升识别准确率就换更牛逼的模型。源码里我留了几个TODO注释,比如可以加个实时折线图显示表情变化趋势,或者保存识别记录到数据库。

完整代码已经扔Github了(假装有链接),拿回去改着玩吧。下次考虑做个升级版,加上姿态估计和语音情绪分析,搞个多模态情感识别,那才带劲!
更多推荐
所有评论(0)