-
根据计算眼睛、嘴巴的变化,判断是什么表情
-
结合以下两篇文章来理解表情识别的实现方法
-
完整代码如下:
pythonimport numpy as np import dlib import cv2 from sklearn.metrics.pairwise import euclidean_distances from PIL import Image, ImageDraw, ImageFont # 计算眼睛的宽高比 def eye_aspect_ratio(eye): A = euclidean_distances(eye[1].reshape(1, 2), eye[5].reshape(1, 2)) B = euclidean_distances(eye[2].reshape(1, 2), eye[4].reshape(1, 2)) C = euclidean_distances(eye[0].reshape(1, 2), eye[3].reshape(1, 2)) ear = ((A + B) / 2.0) / C return ear # 计算嘴的宽高比 def MAR(shape): x = shape[50] y = shape[50].reshape(1, 2) A = euclidean_distances(shape[50].reshape(1, 2), shape[58].reshape(1, 2)) B = euclidean_distances(shape[51].reshape(1, 2), shape[57].reshape(1, 2)) C = euclidean_distances(shape[52].reshape(1, 2), shape[56].reshape(1, 2)) D = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2)) return ((A + B + C) / 3) / D # 计算嘴宽度与脸颊宽度的比值 def MJR(shape): M = euclidean_distances(shape[48].reshape(1, 2), shape[54].reshape(1, 2)) # 嘴宽度 J = euclidean_distances(shape[3].reshape(1, 2), shape[13].reshape(1, 2)) # 下颌的宽度 return M / J """ 向图片中添加中文 """ def cv2AddChineseText(img, text, position, textColor=(0, 255, 0), textSize=30): if (isinstance(img, np.ndarray)): # 判断是否是OpenCV图片类型 img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) # 实现 array 到 image 的转换 draw = ImageDraw.Draw(img) # 在img图片上创建一个绘图的对象 # 字体的格式 C 盘中的 Windows/Fonts 中,复制到此文件夹下可看到文件名 fontStyle = ImageFont.truetype("simsun.ttc", textSize, encoding="utf-8") draw.text(position, text, textColor, font=fontStyle) # 绘制文本 return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) # 转换回 OpenCV 格式 # 构建脸部位置检测器 detector = dlib.get_frontal_face_detector() # 读取人脸关键点定位模型 predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat") # 打开摄像头或视频 cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() frame = cv2.flip(frame, 1) faces = detector(frame, 0) # 获取图片中全部人脸位置 for face in faces: shape = predictor(frame, face) # 获取关键点 # 将关键点转换为坐标(x,y)的形式 shape = np.array([[p.x, p.y] for p in shape.parts()]) # 计算嘴部的高宽比 mar = MAR(shape) # 计算 "最宽/脸颊宽" mjr = MJR(shape) rightEye = shape[36:42] # 右眼,关键点索引从36到41(不包含42) leftEye = shape[42:48] # 左眼,关键点索引从42到47(不包含48) rightEAR = eye_aspect_ratio(rightEye) # 计算右眼纵横比 leftEAR = eye_aspect_ratio(leftEye) # 计算左眼纵横比 ear = (rightEAR + leftEAR) / 2.0 # 均值处理 result = "正常" # 默认是正常表情 # 打印出实际值,可以根据该值更改阈值 print("mar", mar, "\tmjr", mjr, "\tear", ear) if mar > 0.5 and ear < 0.28: result = "大笑" elif mar > 0.5 and ear > 0.28: result = "愤怒" elif mjr > 0.45: result = "微笑" # 输出中文 # frame = cv2AddChineseText(frame, result, (50, 100)) # cv2.putText()#输出英文 mouthHull = cv2.convexHull(shape[48:61]) # 嘴型构造凸包 frame = cv2AddChineseText(frame, result, mouthHull[0, 0]) # 多人脸 cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1) # 画出凸包 cv2.imshow("Frame", frame) if cv2.waitKey(1) == 27: break cv2.destroyAllWindows() cap.release()
《计算机视觉》—— 表情识别
张小生1802024-10-19 23:54
相关推荐
AI人工智能+6 分钟前
应用俄文OCR技术,为跨语言交流与数字化管理提供更强大的支持UQI-LIUWJ17 分钟前
李宏毅LLM笔记: AI Agent百度Geek说30 分钟前
百度阮瑜:百度大模型应用赋能产业智变|2025全球数字经济大会大明哥_34 分钟前
最新 Coze 教程:40+ 条视频涨粉 10W+,利用 Coze 工作流 + 视频组件,一键制作爆款小人国微景动画视频SugarPPig42 分钟前
ReAct (Reason and Act) OR 强化学习(Reinforcement Learning, RL)孤狼warrior1 小时前
灰色预测模型AI生存日记1 小时前
AI 行业早报:微软发布诊断工具,上海聚焦四大应用场景神仙别闹1 小时前
基于Python实现LSTM对股票走势的预测求职小程序华东同舟求职1 小时前
龙旗科技社招校招入职测评25年北森笔试测评题库答题攻略李元豪1 小时前
【行云流水ai笔记】粗粒度控制:推荐CTRL、GeDi 细粒度/多属性控制:推荐TOLE、GPT-4RL