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

news2024/11/17 3:49:36

目录

 人体姿态检测

 效果展示

举手检测

行业应用

代码实现

代码分析

效果展示

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

总结


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


 人体姿态检测

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.coloradmin.cn/o/1507017.html

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

相关文章

计算机网络 —— 运输层

运输层 5.1 运输层概述 运输层的主要任务是&#xff0c;如何为运行在不同主机上的应用进程提供直接的通信服务。运输层协议又称为端到端协议。 根据应用需求的不同&#xff0c;因特网的运输层为应用层提供了两种不同的运输协议&#xff0c;即面向连接的TCP和无连接的UDP 5.2…

VBA(学习笔记)

1. 数据类型 变量定义&#xff1a;Dim 变量名 As 数据类型 变量赋值&#xff1a;变量名 值 1.1 数值型 1.1.1 整数 (1) Byte&#xff1a;1字节&#xff08;0~255&#xff09; (2) Integer&#xff1a;2字节&#xff08;-32768~32767&#xff09; (3) Long&#xff1a;4…

ubuntu18.04下zookeeper安装与简单使用

下载与解压 官网下载地址 Apache ZooKeeper 解压 tar -zxvf zookeeper-3.4.10.tar.gz 环境准备 zookeeper基于java开发&#xff0c;因此首先需要安装java的jdk包 sudo apt-get install openjdk-8-jdk修改配置 进入解压目录里的conf文件夹内 mv zoo_sample.cfg zoo.cfg …

表单进阶(6)-字段集

带框的字段集用fieldse &#xff0c;字段集标头用legent 选中的样式&#xff1a; 圆点用radio&#xff0c;方框用checkbox <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" cont…

Qt QListwidget与QStackedWidget或QTableWidget实现多界面切换的效果

文章目录 效果图使用QStackedWidget实现使用QTableWidget实现总结 效果图 使用QStackedWidget实现 QStackedWidget提供了一种堆栈式的界面布局方式。功能&#xff1a;QStackedWidget允许开发者在一个固定区域内显示多个子窗口或页面&#xff0c;但同时只显示其中一个子窗口&am…

腾讯云轻量服务器流量用完了怎么办?还能继续用吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额部分的流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xf…

【大厂AI课学习笔记NO.75】人工智能产业的就业岗位分布

见上图&#xff0c;这是详细的人工智能产业的就业岗位分布情况。 就业领域包括物联网、智能芯片、机器学习、深度学习、计算机视觉CV、自然语言处理NLP、智慧语音、机器人、知识图谱等领域。 人工智能作为当今科技革命与产业变革的重要驱动力量&#xff0c;其就业岗位分布广泛…

什么是Python网络爬虫

Python网络爬虫是一种自动化获取网页内容的程序。它可以通过发送HTTP请求&#xff0c;获取网页的HTML代码&#xff0c;并从中提取所需的数据。下面是一个简单的概述&#xff0c;帮助您理解Python网络爬虫的基本原理。 导入所需的库&#xff1a; 在Python中&#xff0c;我们可以…

系统架构设计师精讲班视频教程

本课程将深入探讨系统架构设计原理及实际应用。学员将学习高可用性、扩展性和安全性等方面的设计技巧&#xff0c;掌握微服务架构、云计算和容器化等最新趋势。通过案例分析和项目实践&#xff0c;帮助学员成为系统架构设计领域的专家。 课程大小&#xff1a;7G 课程下载&…

20240310-1-Java后端开发知识体系

Java 基础 知识体系 Questions 1. HashMap 1.8与1.7的区别 1.71.8底层结构数组链表数组链表/红黑树插入方式头插法尾插法计算hash值4次位运算5次异或运算1次位运算1次异或运算扩容、插入先扩容再插入先插入再扩容扩容后位置计算重新hash原位置或原位置旧容量 (1) 扩容因子…

SpringMVC09、Ajax

9、Ajax 9.1、简介 AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 是一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。 Ajax 不是一种新的编程语言&#xff0c;而是一种用于创建更好更快以及交互…

第十五届蓝桥杯模拟考试III_物联网设计与开发

编程题 一、基本要求 使用大赛组委会提供的四梯/国信长天物联网省赛套装&#xff08;基于STM32L071KBU微控制器设计&#xff09;&#xff0c;完成本试题的程序设计与调试。程序编写、调试完成后&#xff0c;选手需提交两个LoRa终端对应的hex文件&#xff0c;LoRa终端A对应的文…

解决轻松解决谷歌浏览器火狐浏览器主页被360导航篡改问题浏览器启动页被篡改为360导航栏等

重置Chrome浏览器设置 尝试重置chrome浏览器全部设置。进入Chrome设置页&#xff0c;点击最下方的“高级设置”。 将鼠标滚到最底部&#xff0c;点击“重置设置” 然后关闭浏览器&#xff0c;重新打开即可。 包括ie几乎所有浏览器都可以重置... 重置火狐浏览器设置 设置——主…

VUE+HBuilder的uniapp技术路线开发应用使用总结

使用总结 本来想做一个记录日常数据的应用&#xff0c;主要在Android端使用&#xff0c;后来发现在uniapp中使用sqllite数据库不是像原生中那样简单(所以当前准备去进行另一个路线&#xff0c;就是给我使用的电脑都安装一个portalble的服务端&#xff0c;用来记录数据&#xf…

linux环境下线程的介绍和POSIX线程接口应用实例

目录 概述 1 线程概念 1.1 线程的特性 1.2 线程的运行状态 2 线程API 2.1 pthread的数据类型 2.2 pthread函数的返回值 2.3 POSIX线程接口 2.3.1 创建线程函数pthread_create 2.3.2 终止线程 2.3.3 线程ID 2.3.4 连接已终止线程 2.3.5 线程分离 3 线程VS进程 4 线…

电子电器架构 —— 车载网关路由表和刷写场景

电子电器架构 —— 车载网关路由表和刷写场景 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有…

leetcode 热题 100_搜索二维矩阵

题解一&#xff1a; 二叉搜索树&#xff1a;从矩阵右上角观察&#xff0c;结构类似二叉搜索树&#xff0c;因此可以用类似的解法来做。具体做法是双指针从右上角开始&#xff0c;向左下角逐步搜索&#xff0c;如果当前值比目标值大&#xff0c;则向下移动&#xff0c;如果当前值…

MQ高可用相关设置

文章目录 前言MQ如何保证消息不丢失RabbitMQRocketMQKafkaMQ MQ如何保证顺序消息RabbitMQRocketMQKafka MQ刷盘机制/集群同步RabbitMQRocketMQKafka 广播消息&集群消息RabbitMQRocketMQ MQ集群架构RabbitMQRocketMQKafka 消息重试RabbitMQRockeMqKafka 死信队列RocketMQKaf…

Linux网络套接字之TCP网络程序

(&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨&#xff01;你好这里是ky233的主页&#xff1a;这里是ky233的主页&#xff0c;欢迎光临~https://blog.csdn.net/ky233?typeblog 点个关注不迷路⌯▾⌯ 目录 一、接口介绍 1.socket 2.listen 3.accept…

conda 设置国内源 windows+linux

默认的conda源连接不好&#xff0c;时好时坏&#xff0c;而且速度很慢&#xff0c;可以使用国内的源 如果没有安装conda&#xff0c;可以参考&#xff1a; miniconda安装&#xff1a;链接 anaconda安装winlinux&#xff1a;链接 windows使用命令提示符&#xff0c;linux使用…