当前位置: 首页 > news >正文

俯卧撑计数器(Python)

 

通过 MediaPipe 检测人体姿态,计算俯卧撑角度和计数,并在图像上进行可视化展示

需要有cv2库和mediapipe库

mediapipe库:

MediaPipe是Google开源的机器学习框架,用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的模型和工具,帮助开发人员快速构建和部署计算机视觉和音频处理应用。MediaPipe库的特点包括实时性能、多平台兼容性、灵活性和易用性。

MediaPipe库的主要功能包括:

1. 视频和图像处理:提供了各种预训练的模型和工具,用于视频流分析和处理,例如人脸检测、姿态估计、手势识别等。

2. 音频处理:提供了模型和工具,用于音频流的实时处理,例如语音识别、语音分割、声音增强等。

3. 数据流图:使用数据流图构建和组合多个模块,以实现复杂的音频、视频和多媒体处理应用程序。

4. 跨平台支持:支持多种平台,包括Android、iOS、Linux、Windows等。

5. 开发者工具:提供了一些工具,用于开发和调试MediaPipe应用程序,例如模型训练和调优、性能分析等。

总之,MediaPipe库是一个功能强大的机器学习框架,用于实时音频、视频和多媒体处理应用程序的开发和部署。它提供了丰富的预训练模型和工具,使开发人员能够快速搭建高性能的应用程序。

目录

定义计算角度的函数:

初始化MediaPipe Pose实例: 

 打开视频:

读取视频帧:

计算个数:

 绘制图像:

完整代码: 

定义计算角度的函数:

def calculate_angle(a, b, c):# 将输入点转换为numpy数组a = np.array(a)b = np.array(b)c = np.array(c)# 计算两个向量的角度差(弧度)radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])# 转换为角度(度)angle = np.abs(radians * 180.0 / np.pi)# 确保角度在0到360度之间if angle > 180.0:angle = 360 - anglereturn angle

初始化MediaPipe Pose实例: 

# 初始化MediaPipe Pose实例
pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
'''
min_detection_confidence:表示检测到人体姿态的最小置信度阈值。当检测到的姿态置信度低于该阈值时,可能会被视为无效检测。
min_tracking_confidence:表示跟踪人体姿态的最小置信度阈值。在跟踪过程中,如果姿态的置信度低于该阈值,可能会重新进行检测。
'''

 打开视频:

cap = cv2.VideoCapture("D:\\桌面\\1.mp4")

读取视频帧:

ret, frame = cap.read()

计算个数:

 # 尝试获取姿态关键点try:landmarks = results.pose_landmarks.landmark# 获取左肩、左肘和左腕的坐标shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x, landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]# 计算并显示肘部到肩部的角度angle = calculate_angle(shoulder, elbow, wrist)cv2.putText(image, str(angle),tuple(np.multiply(elbow, [640, 480]).astype(int)),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)print(angle)# 根据角度更新俯卧撑计数if angle > max_angle:stage = "down"if angle < min_angle and stage == 'down':stage = "up"counter += 1print(counter)except:pass

 

 绘制图像:

 # 在图像上绘制矩形框,用于显示计数和阶段cv2.rectangle(image, (0, 0), (225, 73), (245, 117, 16), -1)# 在矩形框内显示计数和阶段cv2.putText(image, 'COUNTER', (15, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, str(counter),(35, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)cv2.putText(image, 'STAGE', (135, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, stage,(130, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)# 在图像上绘制关键点和连接线mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))# 显示处理后的图像cv2.imshow('Mediapipe Feed', image)# 检查是否按下'q'键退出if cv2.waitKey(10) & 0xFF == ord('q'):break

完整代码: 

#coding:utf-8
# 导入必要的库
import cv2
import mediapipe as mp  #通过 MediaPipe 检测人体姿态,计算俯卧撑角度和计数,并在图像上进行可视化展示
import numpy as np
import logging# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')# 记录日志信息
logging.info('这是一条信息日志')
logging.warning('这是一条警告日志')
logging.error('这是一条错误日志')# 定义计算角度的函数
"""计算三个点之间的角度参数:a (list):第一个点的坐标b (list):第二个点的坐标c (list):第三个点的坐标返回:float:三个点之间的角度(度)"""
def calculate_angle(a, b, c):# 将输入点转换为numpy数组a = np.array(a)b = np.array(b)c = np.array(c)# 计算两个向量的角度差(弧度)radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])# 转换为角度(度)angle = np.abs(radians * 180.0 / np.pi)# 确保角度在0到360度之间if angle > 180.0:angle = 360 - anglereturn angle# 导入MediaPipe的绘图工具和Pose解决方案
mp_drawing = mp.solutions.drawing_utils
mp_pose = mp.solutions.pose# 初始化MediaPipe Pose实例
pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)
'''
min_detection_confidence:表示检测到人体姿态的最小置信度阈值。当检测到的姿态置信度低于该阈值时,可能会被视为无效检测。
min_tracking_confidence:表示跟踪人体姿态的最小置信度阈值。在跟踪过程中,如果姿态的置信度低于该阈值,可能会重新进行检测。
'''# 打开视频
cap = cv2.VideoCapture("D:\\桌面\\1.mp4")# 计数器变量
counter = 0
# 当前动作阶段
stage = None
# 完成俯卧撑的最大角度
max_angle = 160
# 准备开始俯卧撑的最小角度
min_angle = 60while cap.isOpened():# 读取视频帧ret, frame = cap.read()# BGR图像转为RGB,便于MediaPipe处理image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)image.flags.writeable = False# 使用MediaPipe进行姿态检测results = pose.process(image)# 重新转为BGRimage.flags.writeable = Trueimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)# 尝试获取姿态关键点try:landmarks = results.pose_landmarks.landmark# 获取左肩、左肘和左腕的坐标shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]elbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x, landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]wrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x, landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]# 计算并显示肘部到肩部的角度angle = calculate_angle(shoulder, elbow, wrist)cv2.putText(image, str(angle),tuple(np.multiply(elbow, [640, 480]).astype(int)),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2, cv2.LINE_AA)print(angle)# 根据角度更新俯卧撑计数if angle > max_angle:stage = "down"if angle < min_angle and stage == 'down':stage = "up"counter += 1print(counter)except:pass# 在图像上绘制矩形框,用于显示计数和阶段cv2.rectangle(image, (0, 0), (225, 73), (245, 117, 16), -1)# 在矩形框内显示计数和阶段cv2.putText(image, 'COUNTER', (15, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, str(counter),(35, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)cv2.putText(image, 'STAGE', (135, 22),cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, stage,(130, 60),cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA)# 在图像上绘制关键点和连接线mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))# 显示处理后的图像cv2.imshow('Mediapipe Feed', image)# 检查是否按下'q'键退出if cv2.waitKey(10) & 0xFF == ord('q'):break# 释放视频资源,关闭所有OpenCV窗口
cap.release()
cv2.destroyAllWindows()

相关文章:

俯卧撑计数器(Python)

通过 MediaPipe 检测人体姿态&#xff0c;计算俯卧撑角度和计数&#xff0c;并在图像上进行可视化展示 需要有cv2库和mediapipe库 mediapipe库&#xff1a; MediaPipe是Google开源的机器学习框架&#xff0c;用于构建实时音频、视频和多媒体处理应用程序。它提供了一组预训练的…...

UVA12342 Tax Calculator 题解

题目传送门 题目大意 题目描述 某国所得税计算十分复杂。该国政府指定你制作一个自动计算所得税的程序。以下是该国计算所得税的规则&#xff1a; 所得税免征额为 180000 180000 180000 元。应纳税额中不超过 300000 300000 300000 元的所得额&#xff0c;按 10 % 10\% …...

WebKit中Websockets的全面支持:实现高效实时通信

WebKit中Websockets的全面支持&#xff1a;实现高效实时通信 Websockets是一种网络通信协议&#xff0c;它允许在单个TCP连接上进行全双工通信&#xff0c;从而实现服务器与客户端之间的实时数据交换。WebKit作为许多流行浏览器的底层引擎&#xff0c;对Websockets提供了全面的…...

微信小程序的智慧物流平台-计算机毕业设计源码49796

目 录 摘要 1 绪论 1.1 研究背景 1.2 研究意义 1.3研究方法 1.4开发技术 1.4.1 微信开发者工具 1.4.2 Node.JS框架 1.4.3 MySQL数据库 1.5论文结构与章节安排 2系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 用户登录流程 2.2.2 数据删除流程 2.3 系统功能分…...

旅游 | 西岳华山

得到了再失去&#xff0c; 总比从来没有得到更伤人。 ——胡赛尼《追风筝的人》 目录 旅游 | 西岳华山00 | 旅游导图01 | 旅游路线1.1 北上西下&#xff08;徒步&#xff09;1.2 北上西下&#xff08;索道&#xff09;1.3 西上北下&#xff08;索道&#xff09;1.4 西上西下&am…...

如何优化Java中的内存占用?

如何优化Java中的内存占用&#xff1f; 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 理解Java内存管理机制 Java的内存管理主要由JVM负责&#xff0c;开发人员在编写代码时需要注意如何有效地…...

2024这三家上海闵行装修公司,值得一看

在繁华的上海闵行区&#xff0c;随着居民对生活品质追求的提升&#xff0c;越来越多人开始重视居住环境的打造。然而&#xff0c;面对众多装修公司的选择&#xff0c;不少消费者往往感到迷茫和困惑。今天&#xff0c;我们就来揭晓闵行区口碑与实力兼备的三家装修公司。 1、首先…...

K8S学习教程(三):在PetaExpress KubeSphere 容器部署 Wiki 系统 wiki.js 并启用中文全文检索

背景 wiki.js 是非常优秀的开源 Wiki 系统&#xff0c;尽管在与 xwiki 功能相比 &#xff0c;还不算完善&#xff0c;但也在不断进步。 常用的功能还是比较实用的&#xff0c;如&#xff1a;Wiki 写 作、分享、权限管理功能还是非常实用的&#xff0c;UI 设计非常的漂亮&#x…...

服务器该如何抵御CC攻击

CC攻击也是分布式拒绝服务攻击的一种类型&#xff0c;同时CC攻击也属于网络流量攻击&#xff0c;但是CC攻击主要是用来攻击网站页面的&#xff0c;向着目标网络服务器发送一些请求&#xff0c;以此来消耗目标网络服务器的资源&#xff0c;导致目标服务器无法响应正常请求&#…...

关于centos7自带的nginx1.20.1开启https后,XP系统的IE6和IE8无法显示网页的问题

CentOS7自带的nginx-1.20.1是支持HTTP/2和TLS1.3的。 软件包名称&#xff1a;nginx-1.20.1-10.el7.x86_64 CentOS7默认开启了HTTP/2&#xff0c;但没有开启TLS1.3&#xff0c;以及IE6和IE8的https访问。 开启方法&#xff1a; ssl_ciphers HIGH:!aNULL:!MD5;改为ssl_ciphers…...

Zotero软件翻译插件Translate for Zotero的API接入方法--百度垂直领域翻译

首先注册通用文本翻译API的token:百度翻译开放平台 (baidu.com)&#xff08;可以免费认证 升级为高级版&#xff09; 之后点击管理控制台&#xff0c;选择总览右侧最下方可以看到个人的id和密码 点击文档与支持&#xff0c; 在这里可以选择领域。 支持传入值描述支持语言方向…...

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码&#xff1a; 优点&#xff1a;代码灵活方便缺点&#xff1a;学习成本高 工具&#xff1a; 优点&#xff1a;易上手缺点&#xff1a;灵活度低&#xff0c;有局限性。 总结&#xff1a; 功能脚本&#xff1a;工…...

如何提问 如何回答

如何提问 如何回答 如何提出一个好问题 1、选择合适的平台或专家&#xff1a;选择合适的论坛&#xff0c;或者能够给你答案的地方或者人 2、清晰描述问题背景&#xff1a;描述问题的背景&#xff0c;清楚明确地表达你的问题以及需求&#xff0c;不需要加过多的语气助词&#…...

计算机图形学入门26:高级光线传播

1.有偏与无偏 在做光线追踪很多方法都是用蒙特卡洛积分去估计&#xff0c;蒙特卡洛积分有些是无偏的(Unbiased)&#xff0c;所谓无偏估计就是无论使用多少个样品&#xff0c;所估计的期望值都是正确的。那么&#xff0c;所有其他情况都是有偏的(Biased)&#xff0c;就是估计的期…...

STM32蓝牙HID实战:打造低功耗、高性能的客制化键盘

一、项目概述 本项目旨在使用STM32单片机打造一款功能强大的蓝牙客制化键盘&#xff0c;它拥有以下特点&#xff1a; 九键布局&#xff0c;小巧便携: 满足日常使用需求&#xff0c;方便携带。全键可编程: 所有按键和旋钮均可通过电脑软件自定义快捷键&#xff0c;实现个性化功…...

C++ STL容器:序列式容器-队queue,deque

摘要&#xff1a; CC STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;在C编程中的重要性不容忽视&#xff0c;STL提供了一系列容器、迭代器、算法和函数对象&#xff0c;这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

简谈设计模式之单例模式

上一篇博客已经介绍了设计模式及其设计原则, 在这篇博客中笔者会介绍一下单例模式, 也是最简单的一种设计模式 单例模式 单例模式属于创建型模式. 它涉及到一个单一的类, 该类负责创建自己的对象, 同时确保只有单个对象被创建, 这个类提供了一种访问其唯一对象的方式, 可以直…...

在Spring Boot中实现多线程任务调度

在Spring Boot中实现多线程任务调度 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. Spring Boot中的任务调度 Spring Boot通过集成Spring框架的Task Execution和Scheduling支持&#xff0c;提供…...

dify/api/models/account.py文件中的数据表

源码位置&#xff1a;dify\api\models\account.py accounts 表结构 字段英文名数据类型字段中文名字备注idStringUUIDIDnameString名称emailString邮箱passwordString密码password_saltString密码盐avatarString头像interface_languageString界面语言interface_themeString界…...

SQLAlchemy迁移数据库

SQLAlchemy迁移数据库 目录 SQLAlchemy迁移数据库安装Alembic配置Alembic编辑 alembic.ini编辑env.py生成迁移文件建表语句示例修改迁移文件命名格式 安装Alembic pip install alembic配置Alembic 执行初始化后会创建一个 alembic 目录&#xff0c;包含Alembic的配置文件 ale…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...