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 = 0

while 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()

    # 计算FPS
    fps = 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].y
        right_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)

    # 在图像上显示FPS
    cv2.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.mfbz.cn/a/455814.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《深入理解springCloud与微服务》笔记

第一章 微服务介绍 1.3 微服务的不足 1.3.2 分布式事务 CAP 理论&#xff0c;即同时满足“一致性”“可用性”和“分区容错”是 件不可能的事。 Consistency &#xff1a;指数据的强一致性。如果写入某个数据成功&#xff0c;之后读取&#xff0c;读到的都是新写入的数据&a…

百度云加速即将下线

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 松松商城作为多年百度云加速代理商&#xff0c;上周接到通知&#xff1a;百度云加速产品计划于2024年4月30日下线&#xff0c;目前也无法做实名了。 同时&#xff0c;百度云加速也开始逐步迁移到百度云&#xff0…

【Sql】MVCC有关问题,以及锁,日志和主从复制原理

目录 MVCC 解决什么问题? 实现原理 隐式字段 undo log Read View(读视图) InnoDB 对 MVCC 的实现 锁 分类 锁升级&#xff1f; InnoDB 的行锁&#xff1f; 死锁避免&#xff1f; 乐观锁和悲观锁 日志 主从复制原理 主从复制的作用 MySQL主从复制解决的问题 涉…

Java基于微信小程序的校园生活互助小助手

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…

Day33:安全开发-JavaEE应用SQL预编译Filter过滤器Listener监听器访问控制

目录 JavaEE-预编译-SQL JavaEE-过滤器-Filter JavaEE-监听器-Listen 思维导图 Java知识点 功能&#xff1a;数据库操作&#xff0c;文件操作&#xff0c;序列化数据&#xff0c;身份验证&#xff0c;框架开发&#xff0c;第三方库使用等. 框架库&#xff1a;MyBatis&#…

Mysql锁与MVCC

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 exlpain字段解析ACID的原理日志引擎整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a; 乐观锁&#xff08;Optimistic Locking&#xff09;&#xff1a;假设并发操作时不会发…

C语言程序环境和预处理Pt.1 - 预处理指令|预处理操作符

电脑所能识别的语言为二进制指令&#xff0c;而我们所写的C语言代码是文本信息。为了能使计算机识别并执行C语言代码&#xff0c;就需要翻译环境&#xff0c;使C语言代码翻译为二进制的指令。 1.按下编译按钮的幕后 - 程序的翻译环境 从C语言源代码到计算机可识别的二进制文件…

MTK安卓开发板_联发科开发板评估套件_安卓主板硬件开发

在介绍开发板之前&#xff0c;让我们先来区分一下核心板和开发板的区别。核心板是一种集成度高、功能完整的计算模块&#xff0c;搭载系统&#xff0c;简化了外围接口&#xff0c;体积尺寸相对较小&#xff0c;主要适用于嵌入式系统。而开发板由核心板底板组成&#xff0c;提供…

spring中事务失效的场景有哪些?

异常捕获处理 在方法中已经将异常捕获处理掉并没有抛出。 事务只有捕捉到了抛出的异常才可以进行处理&#xff0c;如果有异常业务中直接捕获处理掉没有抛出&#xff0c;事务是无法感知到的。 解决&#xff1a;在catch块throw抛出异常。 抛出检查异常 spring默认只会回滚非检…

EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测

EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测 目录 EI级 | Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多特征分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现PCA-GCN主成分降维结合图卷积神经网络的数据多…

c/c++ | 求叶子结点个数 |构建B树 | 动态规划--找叶子结点个数

是这样的&#xff0c;一道代码题&#xff0c;根据输入数据&#xff0c;计算运行结果 #include<bits/stdc.h> using namespace std; vector<int>g[10]; int ans 0; void dfs(int x){if(g[x].size() 0){ans;return;}for(int i 0; i < g[x].size(); i){dfs(g[x]…

windows 安装 gitlab-runner CICD

点击搜索图标 手动输入PowerShell, 右键点击管理员权限打开&#xff0c; 一、安装 安装 gitlab runner 文档参考地址 1、下载exe执行文件 我这里是 win64 https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-windows-amd64.exe 2、创建 gitla…

基于java+springboot+vue实现的电影订票系统(文末源码+Lw+ppt)23-41

摘 要 随着网络科技的不断发展以及人们经济水平的逐步提高&#xff0c;计算机如今已成为人们生活中不可缺少的一部分&#xff0c;为电影订票方便管理&#xff0c;基于java技术设计与实现了一款简洁、轻便的管理系统。本系统解决了电影订票事务中的主要问题&#xff0c;包括个…

08.JavaScript中的编程思想,构造函数和原型对象

一、编程思想 学习 JavaScript 中基于原型的面向对象编程序的语法实现&#xff0c;理解面向对象编程的特征。 1.面向过程 面向过程就是分析出解决问题所需要的步骤&#xff0c;然后用函数把这些步骤一步一步实现&#xff0c;使用的时候再一个一个的依次 调用就可以了。 举个…

JAVA初阶数据结构栈(工程文件后续会上传)(+专栏数据结构练习是完整版)

1.栈的概念讲解(Stack)&#xff09; 定义&#xff1a;栈是一种先进后出的数据结构 要想拿到12就要把它头上的所有东西给移出去 2.栈的实现&#xff08;代码&#xff09; 2.1栈的方法逻辑的讲解 &#xff08;1&#xff09;新建一个测试类Frank &#xff08;2&#xff09;进…

基于STM32的智慧农业管理系统设计与实现

文章目录 一、前言1.1 项目介绍【1】项目功能【2】设计实现的功能【3】项目硬件模块组成 1.2 设计思路1.3 传感器功能介绍1.4 开发工具的选择 二、EMQX开源MQTT服务器框架三、购买ECS云服务器3.1 登录官网3.2 购买ECS服务器3.3 配置安全组3.4 安装FinalShell3.5 远程登录到云服…

后端给前端导出 数据excal表

pom <!-- 读取文档 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.poi/poi --><…

最新CLion + STM32 + CubeMX 开发环境搭建

网上有不少相关教程&#xff0c;但都是基于老版本Clion&#xff0c;新版有一些改变&#xff0c;但整体是简单了。 PS&#xff1a;本教程基于CLion 2023.3.4 安装所需工具参考&#xff1a;Clion搭建stm32开发环境&#xff08;STM32F103C8T6&#xff09;&#xff0c;有这一篇就够…

BFS(宽度优先搜索)C++(Acwing)

代码&#xff1a; #include <cstring> #include <iostream> #include <algorithm>using namespace std;typedef pair<int, int> PII;const int N 110;int n, m; int g[N][N]; int d[N][N]; PII q[N * N];int bfs() {int hh 0, tt 0;q[0] {0, 0};m…