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.mzph.cn/news/734991.shtml

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

相关文章

踏上Python之旅:从零开始,全面解析Python安装与环境配置的必知必会

在踏入Python编程殿堂之前,首当其冲的任务就是正确安装并配置Python开发环境。本文将引导您掌握Python的安装过程、不同操作系统下的最佳实践,以及如何进行多版本管理和虚拟环境设置,为您的Python开发之路打下坚实基础。 一、Python安装 Windows系统: 访问官网下载: 打开…

休息日的思考与额外题——纯纯暴力day42

文章目录 前言动态规知识点 动规五部曲一、100233. 重新分装苹果二、100247. 幸福值最大化的选择方案总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子…

Linux 自动检测进程是否存活,如果挂掉自动拉起

以 jupyter 服务为例 1、检测脚本 vim /home/ailab/bin/check_ailab.sh #!/bin/bashPID$(ps -ef|grep -v grep|grep "jupyter" |awk {print $2})# 检查进程是否存在 if [ -z "$PID" ]; then# 进程不存在&#xff0c;启动进程echo "Jupyter Noteboo…

使用Vue.js开发前端项目

Vue.js是一个非常受欢迎的渐进式JavaScript框架&#xff0c;用于开发强大而互动的前端应用程序。Vue易于上手&#xff0c;同时拥有强大的功能库和灵活的生态系统。在本篇博客中&#xff0c;我将带你了解使用Vue.js开发项目的基本步骤&#xff0c;并提供相应的代码示例。 环境安…

自由职业者如何在Fiverr兼职赚美金

在这个忙碌的时代&#xff0c;大家都渴望在业余时间找到一份兼职&#xff0c;为自己带来额外的收入。然而&#xff0c;很多人常常感到困惑&#xff0c;不知道如何找到一份既赚钱又不耗费太多时间精力的兼职。今天&#xff0c;我想分享一个新的赚钱平台——Fiverr&#xff0c;让…

qt使用QAxObject操作excel程序关闭之后excel进程未被关闭的解决方案

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 今天突然发现电脑变得很卡,我以为内存占用率过高了一看才50%&…

软件测试 需求

文章目录 1. 需求1.1 什么是需求1.2 为什么要有需求1.3 测试人员眼中的需求1.4 如何深入理解需求 2. 测试用例的概念2.1 什么是测试用例2.2 为什么要有测试用例 3. 软件错误&#xff08;BUG&#xff09;的概念4. 开发模型和测试模型4.1 软件的生命周期4.2 瀑布模型&#xff08;…

【深度学习笔记】6_10 双向循环神经网络bi-rnn

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 6.10 双向循环神经网络 之前介绍的循环神经网络模型都是假设当前时间步是由前面的较早时间步的序列决定的&#xff0c;因此它们都将信…

STM32---IIC通信协议(含源码,小白进)

写在前面&#xff1a;在前面的学习过程中&#xff0c;我们学习了串口通信的USART&#xff08;通用同步异步收发器&#xff09;&#xff0c;本节我们将继续学习一种串行通信协议——IIC通信协议。之前我使用51单片机也分享过相关的IIC通信的知识&#xff0c;其实本质的知识是相通…

Spring Boot 整合 MongoDB:构建高效的数据驱动应用

Spring Boot 整合 MongoDB&#xff1a;构建高效的数据驱动应用 在现代软件开发中&#xff0c;数据持久化是应用程序不可或缺的一部分。MongoDB&#xff0c;作为一个流行的NoSQL数据库&#xff0c;以其灵活的数据模型和强大的扩展性赢得了众多开发者的青睐。Spring Boot&#x…

LeetCode_Hot100_栈_394字符串解码_Python

1.题目&#xff08;中等难度&#xff09; 给定一个经过编码的字符串&#xff0c;返回它解码后的字符串。 编码规则为: k[encoded_string]&#xff0c;表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 你可以认为输入字符串总是有效的&#xff1b…

去哪里找视频素材?这几个视频素材资源网您看看

朋友们&#xff0c;是不是在抖音短视频的创作过程中感觉自己的视频素材库就像饭后的草莓派&#xff0c;美好但不够充实&#xff1f;别担心&#xff0c;我这就给你们送上几个超级赞的素材网站&#xff0c;保证让你的创作素材库瞬间丰富起来 1&#xff0c;蛙学府 这个网站简直就…

激光SLAM-重定位方案预研

-----------------------------------------------------待更新--------------------------------------

Delphi 的Read 与Readln 的区别

结合运行窗口&#xff0c;你输入1 2 3 4 这是一行ReadLn在读入时把这四个数当成一行&#xff0c;read(a,b)只读入了前两个数&#xff1a;1 2&#xff0c;就准备读下一行了&#xff0c;下一行输入3&#xff0c;再下一行输入2&#xff0c;所以输出1232&#xff1b; Read是逐个读…

Python列表及其操作详解,从此不再迷茫!

在前面的文章中&#xff0c;我们详细讲了六大数据类型中的数字类型&#xff0c;字符串类型。相信大家都能够熟练的掌握了。那么今天我们来讲解列表&#xff08;list&#xff09;。 这是一种常用且重要的数据类型&#xff0c;List可以用来存储一系列的元素&#xff0c;对于后期…

怎么看待Groq

用眼睛看。 就是字面上的意思用眼睛看。 我属于第一波玩到的,先给大家一个直观的印象,Groq到底有多快。 目前Groq只能选Llama的70b,和Mixtral的MoE,那我选7*8的这个MoE模型来实验。 这么好些字大概花了不到1秒,流式响应,其实是不是流式已经没那么重要了 ,然后看每秒Toke…

MongoDB官网查看 MongoClient 驱动API 文档的详细步骤

目录 MongoDB官网查看 MongoClient 驱动API 文档的详细步骤1、先进入[mongodb的官网](https://www.mongodb.com/zh-cn)&#xff0c;点击【服务器文档】2、点击这个 [MongoDB Documentation](https://www.mongodb.com/docs/) 文档。3、然后点开【Java】的驱动文档4、先查看同步的…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度&#xff08;执行的次数&#xff09; 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一&#xff1a;未优化冒泡排序时间复杂度 例二&#xff1a;经过优化…

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】探究二叉树的奥秘

目录 1 -> 树的概念及结构 1.1 -> 树的概念 1.2 -> 树的相关概念 1.3 -> 树的表示 1.4 -> 树在实际中的运用(表示文件系统的目录树结构) 2 -> 二叉树概念及结构 2.1 -> 二叉树的概念 2.2 -> 现实中的二叉树 2.3 -> 特殊的二叉树 2.4 ->…

2024年【P气瓶充装】考试报名及P气瓶充装复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 P气瓶充装考试报名是安全生产模拟考试一点通总题库中生成的一套P气瓶充装复审考试&#xff0c;安全生产模拟考试一点通上P气瓶充装作业手机同步练习。2024年【P气瓶充装】考试报名及P气瓶充装复审考试 1、【多选题】《…