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

  • 根据计算眼睛、嘴巴的变化,判断是什么表情
  • 结合以下两篇文章来理解表情识别的实现方法
    • 基于 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.mzph.cn/bicheng/56928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

闪迪sd卡如何恢复删除的内容?这3种方法很实用

在数字时代&#xff0c;闪迪SD卡因其便携性、高容量和稳定性&#xff0c;成为我们日常生活中不可或缺的数据存储设备。然而&#xff0c;数据丢失的风险也如影随形&#xff0c;一个不小心的误删除、格式化或是其他意外情况&#xff0c;都可能让我们珍贵的照片、视频、文档等重要…

Vue详细入门(语法【一】)

今天滴学习目标&#xff01;&#xff01;&#xff01; Vue1. 什么是Vue.js2. Vue是怎么使用的嘞3. MVVM是什么嘞&#xff1f;4. Vue有哪些指令1. v-bind2.v-model3.v-if 和 v-else4. v-for5. v-show6. v-on 咱们先了解一下什么是Vue&#xff0c;Vue是怎么使用的嘞&#xff0c;V…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19目录1. What makes your model a low-empathy or warmth person: Exploring theOrigins of Personality in LLMs摘要研究背景算…

小公司团队管理:8个你需要知道的要点

小公司要想管理好团队&#xff0c;关键在于明确的目标与愿景、有效的沟通机制、灵活的激励制度、培养团队协作精神、领导者以身作则。其中&#xff0c;有效的沟通机制尤为重要。建立畅通的沟通渠道&#xff0c;不仅可以提高工作效率&#xff0c;还能及时发现并解决问题&#xf…

MatLab Desired port was :31515解决方案

前言&#xff1a;使用的MatLabR2022b今天突然出现了错误&#xff0c;在程序中打不开文件。后尝试了下面的方法&#xff0c;可以解决。 解决方法一&#xff1a; 搜索栏输入&#xff1a;firewall.cpl 找到相关项&#xff0c;右键属性&#xff0c;设置为允许。 之后就可以了…

MySQL笔试面试题之AI答(1)

文章目录 1. MySQL 如何优化SQL查询语句?1. **使用索引**2. **优化查询语句**3. **优化表结构**4. **使用缓存**5. **分析执行计划**6. **调整MySQL配置**7. **避免锁争用**8. **使用批量操作**9. **定期维护**10. **监控和调优** 2. 简述优化MySQL数据库的方法&#xff1f;一…

【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步

文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能&#xff0c;因此安装好软件&#xff0c;只需确认设备信息是否对应即可2.1.2. 如果没有发现到&#xff0c;可以通过设备ID连接2.1.3. 设置GUI身份验证用户&#xff0c;让无关设备…

FloodFill 算法(DFS)

文章目录 FloodFill 算法&#xff08;DFS&#xff09;图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 FloodFill 算法&#xff08;DFS&#xff09; 漫水填充(Flood Fi)算法是一种图像处理算法&#xff0c;在计算机图形学和计算机视觉中被广泛…

阿里开源Multi-(llm)Agent应用框架: Agentscope探究与学习

1. 架构图 2. 核心概念 Core Concepts 2.1 Message&#xff08;消息&#xff09; 是信息的载体&#xff08;例如指令、多模态数据和对话内容&#xff09;。在AgentScope中&#xff0c;消息是Python字典的子类&#xff0c; 具有name和content作为必要字段&#xff0c;url作为可…

[项目详解][boost搜索引擎#1] 概述 | 去标签 | 数据清洗 | scp

目录 一、前言 二、项目的相关背景 三、搜索引擎的宏观原理 四、搜索引擎技术栈和项目环境 五、正排索引 VS 倒排索引--原理 正排索引 分词 倒排索引 六、编写数据去除标签和数据清洗模块 Parser 1.数据准备 parser 编码 1.枚举文件 EnumFile 2.去标签ParseHtml(…

简单实现通过电脑操作手机

通过电脑操作手机&#xff0c;支持单击&#xff0c;拖抓事件&#xff0c;延时有1-2秒。 具体步骤&#xff1a; 1、从手机截图到sdcard 2、将图片导出到PC 3、从PC加载展示图片 4、开启定时器 5、设置点击、滚动事件 1、 private static void takeScreenshot(String path)…

【CSS in Depth 2 精译_048】7.2 CSS 响应式设计中的媒体查询原则(中):页面断点(breakpoint)样式的添加

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

「数学::快速幂」矩阵快速幂运算|快速斐波那契数列 / LeetCode 509(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 LeeCode 509&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff…

linux--库指令

ldd ldd 可执行文件路径 显示依赖的库的查找路径以及是否查找到了。

思迅商云8修改最大找零金额

执行如下语句前请备份数据库 -POS收银找零金额最大数 --把下面SQL中的 1000.00 改成你想要的金额数&#xff0c;再到查询分析器中执行&#xff1a; --总店 use hbposv8 go insert t_sys_system (sys_var_id, sys_var_value, sys_var_name) values (pos_max_givchg, 1000.00, 最…

zookeeper问题

启动zk的时候&#xff0c;发现zk起来就秒挂 2024-10-11 15:12:58,532 [myid:1]- ERROR [main:QuorumPeer692] - Unable to load database on disk java.io.I0Exception: The current epoch, 6, is older than the last zxid, 30064771079 at org.apache.zookeeper.server.quoru…

Java基础系列-一文搞懂自定义排序

java自定义排序 自定义排序的理解&#xff1a; 我们首先看需求&#xff1a;一个二维数组 [[1,3],[8,10],[15,18],[2,6]] 我们的需求是根据集合&#xff08;二维数组取出来的数据&#xff09; 左边小的左边这种方式排序 例如1<8 排序方式就是[1,3],[8,10] 此时我们就需…

Dockerfile 中,把多个 RUN 合并在一起,能减少镜像尺寸吗?

先说结论&#xff1a; 有些时候能&#xff0c;有些时候不能&#xff0c;但你要明白原理 – Docker 使用 UnionFS&#xff0c;镜像尺寸随着层数增多&#xff0c;是单调非减的。 问题 看到一个 Dockerfile&#xff1a; FROM python:3.17.7-alpine3.20 RUN pip3 install pillow…

Unity3D 同步怪物实体到客户端详解

在游戏开发中&#xff0c;经常会遇到需要同步怪物实体到客户端的需求。本文将详细介绍如何在Unity3D中实现怪物实体的同步&#xff0c;并给出技术详解以及代码实现。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;大家可以点击进来一起交流一下开发经验呀&#xff…

Request2:Post请求和Json

百度翻译拿到自己想看的数据&#xff0c;下图查看请求到数据的请求 preview提前看下 取出对应的RequestUrl &#xff0c;看出来要使用的话得用post请求 #!/usr/bin/env python # -*- coding:utf-8 -*- import requests import json if __name__ "__main__":#1.指定…