如何修改实时情绪识别代码,实现单张静态图像情绪检测功能?
问题解决方案
报错原因
cv2.VideoCapture是OpenCV专门用于读取摄像头流、视频文件的接口,并不适用于读取单张静态图片。你传入图片路径后读取失败,ret返回False时frame不会是正常的图像数组,后续调用图像处理相关方法时就会触发属性不存在的报错。
可直接运行的修改后代码
from tensorflow.keras.preprocessing.image import img_to_array import cv2 from tensorflow.keras.models import load_model import numpy as np # 模型路径参数 detection_model_path = 'haarcascade_files/haarcascade_frontalface_default.xml' emotion_model_path = 'models/_mini_XCEPTION.102-0.66.hdf5' # 加载模型 face_detection = cv2.CascadeClassifier(detection_model_path) emotion_classifier = load_model(emotion_model_path, compile=False) EMOTIONS = ["angry" ,"disgust","scared", "happy", "sad", "surprised","neutral"] # 这里替换为你自己的本地图片绝对路径 img_path = 'FZKmwbkp.png' # 直接读取静态图片 frame = cv2.imread(img_path) if frame is None: print(f"错误:无法读取图片 {img_path},请检查路径是否正确") exit() # 图像处理逻辑 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_detection.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=5,minSize=(30,30),flags=cv2.CASCADE_SCALE_IMAGE) if len(faces) == 0: print("错误:未检测到图片中的人脸") exit() # 取面积最大的人脸处理 faces = sorted(faces, reverse=True, key=lambda x: (x[2] - x[0]) * (x[3] - x[1]))[0] (fX, fY, fW, fH) = faces # 提取人脸ROI做预处理 roi = gray[fY:fY + fH, fX:fX + fW] roi = cv2.resize(roi, (64, 64)) roi = roi.astype("float") / 255.0 roi = img_to_array(roi) roi = np.expand_dims(roi, axis=0) # 情绪预测 preds = emotion_classifier.predict(roi)[0] emotion_probability = np.max(preds) label = EMOTIONS[preds.argmax()] # 命令行输出结果 print("="*30) print(f"识别到的情绪:{label},置信度:{emotion_probability*100:.2f}%") print("各情绪概率明细:") for emotion, prob in zip(EMOTIONS, preds): print(f"- {emotion}: {prob*100:.2f}%") print("="*30)
注意事项
- 请把代码里的
img_path替换为你本地图片的绝对路径,避免出现路径找不到的问题 - 如果不需要显示各个情绪的明细,可自行删除对应打印逻辑
内容的提问来源于stack exchange,提问作者ajeelahmed1998
相关产品推荐
相关产品推荐

