mediapipe 实现姿态分析——举手检测

目录

 人体姿态检测

 效果展示

举手检测

行业应用

代码实现

代码分析

效果展示

代码修改,一只手举起即可

总结


啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦^_^啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦♪(^∇^*)啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦啦


 人体姿态检测

import cv2
import mediapipe as mp# 初始化MediaPipe Pose模型
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# 读取视频流或摄像头
cap = cv2.VideoCapture(0)  # 0表示默认摄像头while cap.isOpened():ret, frame = cap.read()if not ret:break# 转换BGR图像为RGB图像rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 运行姿势估计模型results = pose.process(rgb_frame)# 绘制姿势关键点及连接线if results.pose_landmarks:mp.solutions.drawing_utils.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)# 显示结果cv2.imshow('Pose Estimation', frame)# 退出程序if cv2.waitKey(1) & 0xFF == 27:  # 按ESC键退出break# 释放资源
cap.release()
cv2.destroyAllWindows()

        我这段代码使用了MediaPipe库中的姿势估计模型,它能够从摄像头捕获图像并检测人体的关键关节。以下是对代码的详细分析:

  1. 导入库:

    • cv2: OpenCV库,用于图像和视频处理。
    • mediapipe: 包含MediaPipe库,其中包含了各种预训练的机器学习模型,包括姿势估计。
  2. 初始化姿势估计模型:

    • mp_pose = mp.solutions.pose: 导入姿势估计模型。
    • pose = mp_pose.Pose(): 创建一个姿势估计对象。
  3. 打开摄像头:

    • cap = cv2.VideoCapture(0): 打开默认摄像头,创建一个VideoCapture对象。
  4. 循环处理每一帧:

    • while cap.isOpened():: 通过循环处理摄像头捕获的每一帧。
    • ret, frame = cap.read(): 读取一帧图像,ret表示读取是否成功,frame是帧的图像。
  5. 图像处理:

    • rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB): 将BGR格式的图像转换为RGB格式,因为MediaPipe库使用RGB格式的图像。
  6. 姿势估计模型运行:

    • results = pose.process(rgb_frame): 运行姿势估计模型,获取关键关节的位置。
  7. 绘制关键点及连接线:

    • if results.pose_landmarks:: 检查是否检测到了姿势关键点。
    • mp.solutions.drawing_utils.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS): 绘制关键点及连接线在原始图像上。
  8. 显示结果:

    • cv2.imshow('Pose Estimation', frame): 显示带有姿势估计结果的图像。
  9. 退出程序:

    • if cv2.waitKey(1) & 0xFF == 27:: 检测是否按下ESC键(ASCII码27),如果是则退出循环。
  10. 释放资源:

    • cap.release(): 释放摄像头资源。
    • cv2.destroyAllWindows(): 关闭所有图像窗口。

   就是这样的,这只是软件包的基础应用。


 效果展示

比较社恐,我就先打码了

当然,如果我站起来就真没法截图了,没法翘脚,腿部也是可以识别的


那么既然已经实现了这个简单的基础小功能,那么为什么不做点什么实际的好东西出来呢??

嘿嘿(手动坏笑)

举手检测

行业应用

        举手检测在许多应用中都可以发挥作用,特别是在交互式和人机界面领域。以下是一些例子:

  1. 手势控制界面: 通过举手或特定手势来控制电子设备、计算机或应用程序,例如切换页面、调整音量、播放/暂停媒体等。

  2. 虚拟现实(VR)和增强现实(AR): 在VR和AR应用中,举手检测可以用于手势交互,改变虚拟环境中的元素,例如拾取物体、绘画等。

  3. 教育应用: 举手检测可以用于教育应用,帮助学生更直观地与教学内容进行互动,例如参与互动式课堂、学习手语等。

  4. 游戏控制: 游戏开发者可以使用举手检测来实现新颖的游戏控制方式,提供更具体的玩家交互体验。

  5. 体感运动训练: 在健身应用或体感游戏中,举手检测可以用于监测用户的运动姿势,提供实时反馈和指导。

  6. 会议和演示: 在远程会议或演示中,举手检测可以作为一种简便的手势来表达意见、提问或切换幻灯片。

  7. 无接触式交互设备: 举手检测可以在公共场所用于创建无触摸的交互设备,例如自动门、自动售货机等。

  8. 身体语言分析: 通过分析举手动作,可以进行身体语言分析,识别用户的情感状态、兴奋程度等,用于用户体验研究或情感计算。

  9. 辅助技术: 举手检测可以在辅助技术领域中用于帮助残障人士进行电脑交互,例如通过手势控制轮椅或进行文字输入。


代码实现

import cv2
import mediapipe as mp
import time# 初始化MediaPipe Pose模型
mp_pose = mp.solutions.pose
pose = mp_pose.Pose()# 读取视频流或摄像头
cap = cv2.VideoCapture(0)  # 0表示默认摄像头# 初始化FPS计算
prev_time = 0while cap.isOpened():ret, frame = cap.read()if not ret:break# 转换BGR图像为RGB图像rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 记录处理开始时间start_time = time.time()# 运行姿势估计模型results = pose.process(rgb_frame)# 记录处理结束时间end_time = time.time()# 计算FPSfps = 1 / (end_time - start_time)# 绘制姿势关键点及连接线if results.pose_landmarks:mp.solutions.drawing_utils.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)# 获取左右手关键点的坐标left_hand = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST].yright_hand = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST].y# 判断是否举手(示例:手腕高于肩部)if left_hand < results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER].y and \right_hand < results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_SHOULDER].y:cv2.putText(frame, 'Hands raised', (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 在图像上显示FPScv2.putText(frame, f'FPS: {int(fps)}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# 显示结果cv2.imshow('Pose Estimation', frame)# 退出程序if cv2.waitKey(1) & 0xFF == 27:  # 按ESC键退出break# 释放资源
cap.release()
cv2.destroyAllWindows()

代码分析

        我这段代码使用了 MediaPipe 库来实现实时的姿势估计,并通过检测手的位置来判断是否举手。以下是对代码的详细分析:

  1. 导入库:

    • cv2: OpenCV库,用于图像和视频处理。
    • mediapipe: 包含 MediaPipe 库,其中包含了各种预训练的机器学习模型,包括姿势估计。
  2. 初始化姿势估计模型:

    • mp_pose = mp.solutions.pose: 导入姿势估计模型。
    • pose = mp_pose.Pose(): 创建一个姿势估计对象。
  3. 打开摄像头:

    • cap = cv2.VideoCapture(0): 打开默认摄像头,创建一个 VideoCapture 对象。
  4. 初始化FPS计算:

    • prev_time = 0: 用于计算每秒处理的帧数(FPS)。
  5. 循环处理每一帧:

    • while cap.isOpened():: 通过循环处理摄像头捕获的每一帧。
    • ret, frame = cap.read(): 读取一帧图像,ret表示读取是否成功,frame是帧的图像。
  6. 图像处理:

    • rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB): 将 BGR 格式的图像转换为 RGB 格式,因为 MediaPipe 库使用 RGB 格式的图像。
  7. 姿势估计模型运行:

    • results = pose.process(rgb_frame): 运行姿势估计模型,获取关键关节的位置。
  8. 记录处理时间和计算FPS:

    • 记录处理开始时间和结束时间,然后计算帧率(FPS)。
  9. 绘制关键点及连接线:

    • if results.pose_landmarks:: 检查是否检测到了姿势关键点。
    • mp.solutions.drawing_utils.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS): 绘制关键点及连接线在原始图像上。
  10. 判断是否举手:

    • 获取左右手关键点的 y 坐标,并与肩部的 y 坐标进行比较,以判断是否举手。
    • 如果判断为举手,使用 cv2.putText 在图像上方显示 "Hands raised"。
  11. 在图像上显示FPS:

    • cv2.putText(frame, f'FPS: {int(fps)}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2): 在图像左上角显示当前帧率。
  12. 显示结果:

    • cv2.imshow('Pose Estimation', frame): 显示带有姿势估计结果的图像。
  13. 退出程序:

    • if cv2.waitKey(1) & 0xFF == 27:: 检测是否按下 ESC 键(ASCII码27),如果是则退出循环。
  14. 释放资源:

    • cap.release(): 释放摄像头资源。
    • cv2.destroyAllWindows(): 关闭所有图像窗口。

        小总结,这段代码通过姿势估计检测手的位置,判断是否举手,并在图像上方显示相应的提示。帧率(FPS)也会在图像左上角显示。

效果展示

举手之后就会显示hands raised

        那么细心的小伙伴就发现了,为什么是hands而不是hand,哈哈哈,因为我是两只手都举起来才有效果。

        那么也是可以修改为任意一只手举起来就显示举手的


代码修改,一只手举起即可

也很简单,将第44行的判断从and同时满足修改为or,一个满足即可

总结

        在这篇文章中,我们首先介绍了使用 MediaPipe 库进行人体姿态检测的基础应用。通过简单的代码实现,我们能够从摄像头捕获图像,利用 MediaPipe 提供的姿势估计模型检测人体关键关节的位置,并在图像上绘制出关键点和连接线,从而实现实时的姿势估计。这为后续的应用奠定了基础。

        接着,我们引入了一个更具实际应用意义的场景——举手检测。通过对姿势估计模型输出的手部关键点进行垂直位置的比较,我们实现了一个简单的举手检测系统。当两只手同时举起时,程序会在图像上方显示 "Hands raised" 的提示,为用户提供了一种直观的交互方式。

        最后,我们展示了如何通过简单的修改,将举手检测条件从要求两只手同时举起变为只需任意一只手举起即可。这样的灵活性使得代码能够适应不同的应用场景,例如在教育、会议、游戏等领域中,通过手势交互实现更加智能化的应用。

         而且什么,就是说,我还有一个邪恶的想法,把这个程序安装到教室中,老师有一个终端可以实时看见那些学生举手,不用举的太高略微超过肩部即可,这样老师就可以尽情的让学生起立回答问题啦,又克服了社恐的问题,完美!@!~~

ヾ( ̄▽ ̄)Bye~Bye~

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

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

相关文章

【数据结构】二叉树---AVL树的实现

目录 一. 什么是AVL树 二. AVL树的结点结构定义 三. AVL树的动态平衡法 1. 左单旋转 --- RL(RotateLeft) 型调整操作 2. 右单旋转 --- RR(RotateRight) 型调整操作 3. 先左后右双旋转 --- RLR (RotateLeftRight) 型调整操作 4. 先右后左双旋转 --- RRL (RotateRightL…

Day32:安全开发-JavaEE应用Servlet路由技术JDBCMybatis数据库生命周期

目录 JavaEE-HTTP-Servlet&路由&周期 JavaEE-数据库-JDBC&Mybatis&库 思维导图 Java知识点&#xff1a; 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架…

最新若依项目快速上手

最新若依项目快速上手 配套视频&#xff1a;若依项目快速上手视频 1. 下载源码 官网&#xff1a;https://ruoyi.vip/ 前端 git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git后端 git clone https://gitee.com/y_project/RuoYi-Vue.git2. 数据库 创建数据库ry-vue…

考研复习C语言初阶(3)

目录 一.函数是什么? 二.C语言中函数的分类 2.1库函数 2.2自定义函数 三.函数的参数 3.1实际参数&#xff08;实参&#xff09; 3.2 形式参数&#xff08;形参&#xff09; 四.函数的调用 4.1 传值调用 4.2 传址调用 五. 函数的嵌套调用和链式访问 5.1 嵌套调用 5…

Android中单例模式正确实现方式

1. 饿汉模式 -线程安全 在类加载时进行实例化&#xff0c; 线程安全&#xff0c;但会导致类加载时间变长。饿汉模式如果使用过多&#xff0c;可能会对App启动耗时带来不利影响。 2. 懒汉模式 -线程不安全 没有加锁&#xff0c; 因此线程不安全。 3. 两次判空 加同步锁 -线程不…

Talk|麻省理工学院李晨昊:发展式腿足智能-从模仿到生成

本期为TechBeat人工智能社区第578期线上Talk。 北京时间3月13日(周三)20:00&#xff0c;麻省理工学院博士生—李晨昊的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “发展式腿足智能-从模仿到生成”&#xff0c;向大家系统地介绍了专家示范(exper…

基于四边形网格的服装设计

前言 该篇论文对算法的描述是比较详细的&#xff0c;在Unity中复现其功能。我这边的效果是这样的。 不尽人意 正文开始 Sketch-Based Garment Design with Quad Meshes 基于草图的服装设计与四边形网格 2020/02/13 Jackdos整理翻译 Abstract摘要 Garment creation cont…

ORACLE Linux(OEL) - Primavera P6EPPM 安装及分享

引言 继上一期发布的CentOS版环境发布之后&#xff0c;近日我制作了基于ORACLE Linux的P6虚拟机环境&#xff0c;同样里面包含了全套P6 最新版应用服务 此虚拟机仅用于演示、培训和测试目的。如您在生产环境中使用此虚拟机&#xff0c;请先与Oracle Primavera销售代表取得联系…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

C++提高笔记(三)---STL容器(vector、deque)

1、vector容器 1.1vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff0…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…

qt 格式化打印 日志 QMessagePattern 格式词法语法及设置

一、qt源码格式化日志 关键内部类 QMessagePattern qt为 格式化打印日志 提供了一个简易的 pattern(模式/格式) 词法解析的简易的内部类QMessagePattern,作用是获取和解析自定义的日志格式信息。 该类在qt的专门精心日志操作的源码文件Src\qtbase\src\corelib\global\qloggi…

Seata源码流程图

1.第一阶段分支事务的注册 流程图地址&#xff1a;https://www.processon.com/view/link/6108de4be401fd6714ba761d 2.第一阶段开启全局事务 流程图地址&#xff1a;https://www.processon.com/view/link/6108de13e0b34d3e35b8e4ef 3.第二阶段全局事务的提交 流程图地址…

基于深度学习的图像去雨去雾

基于深度学习的图像去雨去雾 文末附有源码下载地址 b站视频地址&#xff1a; https://www.bilibili.com/video/BV1Jr421p7cT/ 基于深度学习的图像去雨去雾&#xff0c;使用的网络为unet&#xff0c; 网络代码&#xff1a; import torch import torch.nn as nn from torchsumm…

电脑麦克风没声音怎么设置?一步步教你设置正确!

电脑麦克风是进行语音通话、语音识别和录音等操作时必不可少的设备&#xff0c;然而有时候我们可能会遇到电脑麦克风没有声音的问题&#xff0c;导致无法正常进行语音交流或录音。在本文中&#xff0c;我们将介绍电脑麦克风没声音怎么设置的三种方法&#xff0c;以分步骤详细说…

AHU 汇编 实验一

一、实验名称&#xff1a;实验1 实验1 用Debug命令查看寄存器和内存中的内容 实验目的:求掌握使用Debug命令查看寄存器和内存的方法。 通过第2章两个简单实例认识汇编语言程序&#xff0c;初步了解程序格式&#xff1b;段定义&#xff1b;标号&#xff1b;DOS系统功能&#xf…

科技成果鉴定测试如何进行?第三方检测机构进行鉴定测试的好处

科技成果鉴定测试&#xff0c;作为科技领域中一项重要的质量检验手段&#xff0c;具有广泛的应用范围。旨在为科技成果的研发者和使用者提供客观、科学、权威的鉴定结果&#xff0c;从而评估科技成果的技术水平和市场竞争力。   科技成果鉴定测试是对科技成果进行系统、全面的…

数据结构 day2

1:思维导图 2&#xff1a;计算结构体大小 3&#xff1a;大小端存储 &#xff08;1&#xff09;&#xff1a;数据溢出 1 #include <stdio.h>2 #include <string.h>3 #include <stdlib.h>4 int main(int argc, const char *argv[])5 {6 short a 0x1234;…

自定义方法SQL注入器-DefaultSqlInjector

/*** 自定义Sql注入* author zy*/ public class SqlInjector extends DefaultSqlInjector {Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {// 注意&#xff1a;此SQL注入器继承了DefaultSqlInjector(默认注入器…

性价比高超声波清洗机推荐,热门性价比高超声波清洗机大揭秘!

在日常生活中&#xff0c;眼镜不仅是视力矫正的工具&#xff0c;也是提升个人魅力的时尚配饰。然而&#xff0c;长期佩戴眼镜的我们都面临一个共同的难题——眼镜的清洁工作。尘埃、皮肤油脂、甚至是细菌和病毒&#xff0c;都可能附着在眼镜上&#xff0c;不仅影响视觉效果&…