当前位置: 首页 > news >正文

《计算机视觉》—— 表情识别

  • 根据计算眼睛、嘴巴的变化,判断是什么表情
  • 结合以下两篇文章来理解表情识别的实现方法
    • 基于 dilib 库的人脸检测
      • https://blog.csdn.net/weixin_73504499/article/details/142977202?spm=1001.2014.3001.5501
    • 基于 dlib 库的人脸关键点定位
      • https://blog.csdn.net/weixin_73504499/article/details/142990867?spm=1001.2014.3001.5501
  • 完整代码如下:
    import 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) / Creturn 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:breakcv2.destroyAllWindows()
    cap.release()

http://www.mrgr.cn/news/53917.html

相关文章:

  • Unity--AssestBundles--热更新
  • 云原生后端(Cloud-Native Backend)
  • 关于Qt中进行输出的方式及对比分析
  • idea 2023 创建 springboot 项目 LTS
  • 27.3 一致性哈希算法介绍
  • 从0开始深度学习(11)——多层感知机
  • UML图画法(动态图):用例图(Use Case Diagram)
  • 高级语言源程序转换为可执行目标文件
  • Leetcode - 周赛419
  • HTB:Bashed[WriteUP]
  • 下载nltk数据
  • 详细尝鲜flutter
  • 递归神经网络(RNN)简介
  • MySQL查看当前客户端连接数的方法
  • NOIP2007年复赛
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第五十四章 Pinctrl 子系统和 GPIO 子系统
  • D-PAD论文解析
  • 虚拟机nacos部署报错数据源未设置问题解决方案
  • 逻辑之舞:C++ 内存分配与释放,在程序的舞台上,演绎着资源的分配与回收
  • 解决SolidWorks装配体无法更改透明度问题
  • 【数据结构】栈
  • 数仓建设:如何设计数据治理考评规则?
  • 类和对象(中)后面部分
  • 【note】GNN
  • Dropout为何能防止过拟合?dropout和BN 在前向传播和方向传播阶段的区别?
  • 「图::连通」详解并查集并实现对应的功能 / 手撕数据结构(C++)