姿态估计 MediaPipe实现手势,人体姿态,面部动作估计的用法

姿态估计 MediaPipe实现手势,人体姿态,面部动作估计的用法

在这里插入图片描述

import mediapipe as mp
import cv2
import numpy as np
import time
# 定义一个函数,计算两个点的距离
def findDis(pts1,pts2):return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5
# 创建手势检测模型
mpHands = mp.solutions.hands  # 检测人的手
hand_mode = mpHands.Hands(max_num_hands=2,min_detection_confidence=0.5,min_tracking_confidence=0.5) 
# static_image_mode:默认为False,如果设置为false, 就是把输入看作一个视频流,在检测到手之后对手加了一个目标跟踪(目标检测+跟踪),
# 无需调用另一次检测,直到失去对任何手的跟踪为止。如果设置为True,则手部检测将在每个输入图像上运行(目标检测),非常适合处理一批静态的,
# 可能不相关的图像。(如果检测的是图片就要设置成True)
# 检测手的模式参数设置,max_num_hands:可以检测到的手的数量最大值,默认是2
# min_detection_confidence: 手部检测的最小置信度值,大于这个数值被认为是成功的检测,
# min_tracking_confidence:目标踪模型的最小置信度值,大于这个数值将被视为已成功跟踪的手部,如果static_image_mode设置为true,则忽略此操作。
mpDraw = mp.solutions.drawing_utils  # 绘图cap = cv2.VideoCapture(0)while True:success,img = cap.read()img = cv2.flip(img,1)results = hand_mode.process(img)# 将图片导入模型,获取20个点的坐标进行分析if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:point4_8 = []for id,lm in enumerate(handLms.landmark):h,w,c = img.shapecx,cy = int(lm.x*w),int(lm.y*h)cv2.circle(img,(cx,cy),10,(255,0,0),-1)if id in [4,8]:# 获取点4,8的坐标point4_8.append([cx,cy])mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)# 求点4,8的坐标,进行可视化展示cv2.line(img,(point4_8[0][0],point4_8[0][1]),(point4_8[1][0],point4_8[1][1]),(0,0,255),5)distance = round(findDis((point4_8[0][0],point4_8[0][1]),(point4_8[1][0],point4_8[1][1])),2)cv2.putText(img,"distance:{}".format(distance),(50,50),cv2.FONT_HERSHEY_PLAIN, 3,(0,0,255),3)cv2.rectangle(img,(20,250),(20+10,250-int(distance)),(255,0,255),20)cv2.imshow("img",img)if cv2.waitKey(1)&0xFF == ord("q"):break
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述
2. 人体姿势识别
在这里插入图片描述

mpPose = mp.solutions.pose  # 检测人的手
pose_mode = mpPose.Pose(min_detection_confidence=0.5,min_tracking_confidence=0.5)  # 模式参数设置mpDraw = mp.solutions.drawing_utils  # 绘图cap = cv2.VideoCapture(0)
biaoji = 0
i = 0while True:success,img = cap.read()img = cv2.flip(img,1)results = pose_mode.process(img)if results.pose_landmarks:point23_25 = []for id,lm in enumerate(results.pose_landmarks.landmark):h,w,c = img.shapecx,cy = int(lm.x*w),int(lm.y*h)cv2.circle(img,(cx,cy),10,(255,0,0),-1)if id in [23,25]:point23_25.append([cx,cy])mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)cv2.line(img,(point23_25[0][0],point23_25[0][1]),(point23_25[1][0],point23_25[1][1]),(0,0,255),5)if point23_25[0][1]>point23_25[1][1]:if biaoji == 1:i += 1biaoji = 0cv2.putText(img,"Leg up--{}".format(i),(10,50),cv2.FONT_HERSHEY_PLAIN, 3,(0,0,255),3)else:biaoji = 1cv2.putText(img,"Leg down--{}".format(i),(10,450),cv2.FONT_HERSHEY_PLAIN, 3,(0,0,255),3)cv2.imshow("img",img)if cv2.waitKey(1)&0xFF == ord("q"):break
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述
3. 面部动作识别
在这里插入图片描述

def findDis(pts1,pts2):return ((pts2[0]-pts1[0])**2 + (pts2[1]-pts1[1])**2)**0.5cap = cv2.VideoCapture(0)
pTime = 0id_list = [23, 159, 130, 243, 62, 292, 12, 15]mpDraw = mp.solutions.drawing_utils
mpFaceMesh = mp.solutions.face_mesh
faceMesh = mpFaceMesh.FaceMesh(max_num_faces=2)
drawSpec = mpDraw.DrawingSpec(thickness=1, circle_radius=2)while True:success, img = cap.read()imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = faceMesh.process(imgRGB)if results.multi_face_landmarks:for faceLms in results.multi_face_landmarks:mpDraw.draw_landmarks(img, faceLms, mpFaceMesh.FACEMESH_CONTOURS,drawSpec,drawSpec)mp_data = []for id,lm in enumerate(faceLms.landmark):ih, iw, ic = img.shapex,y = int(lm.x*iw), int(lm.y*ih)if id in id_list:           #左眼[22, 23, 24, 26, 110, 157, 158, 159, 160, 161, 130, 243]:mp_data.append([x,y])cv2.circle(img,(x,y),2,(255,0,0),-1)eye_length_1 = findDis(mp_data[0],mp_data[1])eye_length_2 = findDis(mp_data[2],mp_data[3])mouth_length_2 = findDis(mp_data[4],mp_data[5])mouth_length_1 = findDis(mp_data[6],mp_data[7])
#             print(eye_length_1,eye_length_2)if ((mouth_length_1/mouth_length_2)<(98/18)):cv2.putText(img,"mouth close",(400,50),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)else:cv2.putText(img,"mouth open",(400,50),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)if (eye_length_2/eye_length_1)>18:cv2.putText(img,"eye open",(400,100),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)  else:                 cv2.putText(img,"eye close",(400,100),cv2.FONT_HERSHEY_PLAIN, 2,(0,0,255),3)  cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, f'FPS: {int(fps)}', (20, 70), cv2.FONT_HERSHEY_PLAIN,3, (255, 0, 0), 3)cv2.imshow("Image", img)if cv2.waitKey(1)&0xFF == ord("q"):cv2.imwrite("6.jpg",img)break
cap.release()
cv2.destroyAllWindows()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149438.shtml

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

相关文章

媒体行业的3D建模:在影视中创造特效纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 在本文中&#xff0c;我们将探讨 3D 建模在媒体行业中的作用&#xff0c;特别是它在影视特效创作…

反渗透水处理成套设备有哪些

反渗透水处理成套设备主要包括反渗透装置、预处理系统、控制系统等部分。 反渗透装置&#xff1a;反渗透水处理设备的核心部分&#xff0c;由反渗透膜、压力容器、膜组件等组成。反渗透膜是一种高分子材料制成的半透膜&#xff0c;能够截留水中的溶解盐、有机物、细菌等杂质&a…

(动手学习深度学习)第13章 计算机视觉---微调

文章目录 微调总结 微调代码实现 微调 总结 微调通过使用在大数据上的恶道的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要微调通常速度更快、精确度更高 微调代码实现 导入相关库 %matplotlib inline import os import torch import torchvision f…

Midjourney绘画提示词Prompt参考学习教程

一、工具 SparkAi&#xff1a; SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软…

SDL2 播放音频数据(PCM)

1.简介 这里以常用的视频原始数据PCM数据为例&#xff0c;展示音频的播放。 SDL播放音频的流程如下&#xff1a; 初始化音频子系统&#xff1a;SDL_Init()。设置音频参数&#xff1a;SDL_AudioSpec。设置回调函数&#xff1a;SDL_AudioCallback。打开音频设备&#xff1a;SD…

ML-Net:通过深度学习彻底改变多标签分类

一、说明 多标签分类是一项具有挑战性的机器学习任务&#xff0c;其中输入可以同时属于多个类。传统的多标签分类方法通常依赖于将问题转化为一系列二元分类任务或使用集成方法。然而&#xff0c;深度学习的出现开创了多标签分类的新时代&#xff0c;ML-Net 等模型突破了该领域…

02-1解析xpath

我是在edge浏览器中安装的xpath&#xff0c;需要安装的朋友可以参考下面这篇博客最新版edge浏览器中安装xpath插件 一、xpathd的使用 安装lxml pip install lxml ‐i https://pypi.douban.com/simple导入lxml.etree from lxml import etreeetree.parse() 解析本地文件 htm…

vscode的git 工具使用

vscode的git 工具使用 目录概述需求&#xff1a; 设计思路实现思路分析1.git 工具的使用2.提交代码3.查看历史提交代码 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a be…

Servlet API 详解

文章目录 前言什么是ServletHttpServletHttpServletRequest1. form表单构造POST请求2. JSON形式表示body部分 HttpServletResponse 前言 前面为大家介绍了如何使用 servlet 写一个简单的网站&#xff0c;前面只是大概了解了如何使用简单的 servlet&#xff0c;而平时网站的逻辑…

Hive Lateral View explode列为空时导致数据异常丢失

一、问题描述 日常工作中我们经常会遇到一些非结构化数据&#xff0c;因此常常会将Lateral View 结合explode使用&#xff0c;达到将非结构化数据转化成结构化数据的目的&#xff0c;但是该方法对应explode的内容是有非null限制的&#xff0c;否则就有可能造成数据缺失。 SE…

typora整理markdown笔记

效果 符号 快捷键 斜体 * * ctrlB(代表同时按) 加粗 ** ** ctrlI 竖线 > 超链接 清除样式 ctrl\ 图片 ![图片描述][图片绝对路径/相对路径] 如何在Typora中插入图像&#xff1f; ➊ 使用Markdown语法 &#xff08;不推荐&#xff0c;太慢&#xff09; ➋ 直接拷贝图…

Theory behind GAN

假如要生成一些人脸图&#xff0c;实际上就是想要找到一个分布&#xff0c;从这个分布内sample出来的图片像是人脸&#xff0c;分布之外生成的就不像人脸。而GAN要做的就是找到这个distribution。 在GAN之前用的是Maximum Likelihood Estimation。 Maximum Likelihood Estimat…

同创永益联合红帽打造一站式数字韧性解决方案

随着AI技术的快速兴起&#xff0c;IT技术已成为推动业务持续增长的重要驱动力&#xff0c;这要求企业不断尝试新事物&#xff0c;改变固有流程&#xff0c;加强IT技术与业务的合作&#xff0c;同时提升数字韧性能力&#xff0c;以实现业务目标。10月26日&#xff0c;红帽2023中…

Bert学习笔记(简单入门版)

目 录 一、基础架构 二、输入部分 三、预训练&#xff1a;MLMNSP 3.1 MLM&#xff1a;掩码语言模型 3.1.1 mask模型缺点 3.1.2 mask的概率问题 3.1.3 mask代码实践 3.2 NSP 四、如何微调Bert 五、如何提升BERT下游任务表现 5.1 一般做法 5.2 如何在相同领域数据中进…

学习UI第一天

在工作闲暇之余&#xff0c;自己画的原型图&#xff0c;再次做一次记录&#xff0c;哈哈哈 萌宠领养UI设计原型图 https://modao.cc/proto/lq2KqIVBs48xwylNZlA7OP/sharing?view_moderead_only #萌宠领养-分享 可以点击此链接&#xff0c;进行查看O(∩_∩)O哈哈~

二进制部署k8s集群-过程中的问题总结(接上篇的部署)

1、kube-apiserver部署过程中的问题 kube-apiserver.conf配置文件更改 2、calico的下载地址 curl https://docs.projectcalico.org/v3.20/manifests/calico.yaml -O 这里如果kubernetes的节点服务器为多网卡配置会产生报错 修改calino.yaml配置文件 解决方法&#xff1a; 调…

论文阅读——DiffusionDet

在目标检测上使用扩散模型 前向过程&#xff1a;真实框-->随机框 后向过程&#xff1a;随机框-->真实框 前向过程&#xff1a; 一般一张图片真实框的数目不同&#xff0c;填补到同一的N个框&#xff0c;填补方法可以是重复真实框&#xff0c;填补和图片大小一样的框&a…

Redis 学习

Redis 集群共3种集群模式&#xff1a; 1. 主从模式 &#xff08;主写从读&#xff09;&#xff0c;写请求分配到主库&#xff0c;完后数据同步到从库&#xff0c;从库主要负责读请求 同步过程&#xff1a; 从库启动向主库发送同步请求&#xff0c;数据传输的形式是RDB文件&am…

C++算法入门练习——树的带权路径长度

现有一棵n个结点的树&#xff08;结点编号为从0到n-1&#xff0c;根结点为0号结点&#xff09;&#xff0c;每个结点有各自的权值w。 结点的路径长度是指&#xff0c;从根结点到该结点的边数&#xff1b;结点的带权路径长度是指&#xff0c;结点权值乘以结点的路径长度&#x…

C语言-求一个整数储存在内存中的二进制中1的个数

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h>int main() {/*求一个整数储存在内存中的二进制中1的个数*/int number;scanf("%d", &number);int i 0;int count 0;for (i 0; i < 32; i){if (1 ((number >> i) & 1)){count;}}printf(…