健身也内卷?这届网友用 Python 掌握了做标准俯卧撑的秘诀
自己在家锻炼时,我们很难知道自己的动作是否标准。本文作者用Python写了一个可以检测俯卧撑动作是否标准的程序,一起来看看他是怎么做的。
译者 | 章雨铭
出品 | CSDN
在新加坡军队中,有一种测试叫做IPPT(个人身体素质测试)。这个测试的困难不在于它对体力的要求有多高,而在于用来计算做俯卧撑和仰卧起坐次数的电子机器。
和大多数人一样,我的俯卧撑动作总是不达标(根据机器的意见)。此外,由于缺乏参照机器标准的练习,许多NSMen(已经完成两年强制性服役的人)在IPPT测试中都难以取得好成绩。
因此,我决定使用mediapipe和OpenCV创建一个程序,跟踪我们的俯卧撑动作,确保我们每一个俯卧撑动作都达标。
由mediapipe姿势模块检测到的肢体关节
import cv2import mediapipe as mpimport mathclass poseDetector() :def __init__(self, mode=False, complexity=1, smooth_landmarks=True,enable_segmentation=False, smooth_segmentation=True,detectionCon=0.5, trackCon=0.5):self.mode = mode self.complexity = complexityself.smooth_landmarks = smooth_landmarksself.enable_segmentation = enable_segmentationself.smooth_segmentation = smooth_segmentationself.detectionCon = detectionConself.trackCon = trackConself.mpDraw = mp.solutions.drawing_utilsself.mpPose = mp.solutions.poseself.pose = self.mpPose.Pose(self.mode, self.complexity, self.smooth_landmarks,self.enable_segmentation, self.smooth_segmentation,self.detectionCon, self.trackCon)def findPose (self, img, draw=True):imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)self.results = self.pose.process(imgRGB)if self.results.pose_landmarks:if draw:self.mpDraw.draw_landmarks(img,self.results.pose_landmarks,self.mpPose.POSE_CONNECTIONS)return imgdef findPosition(self, img, draw=True):self.lmList = []if self.results.pose_landmarks:for id, lm in enumerate(self.results.pose_landmarks.landmark):#finding height, width of the image printedh, w, c = img.shape#Determining the pixels of the landmarkscx, cy = int(lm.x * w), int(lm.y * h)self.lmList.append([id, cx, cy])if draw:cv2.circle(img, (cx, cy), 5, (255,0,0), cv2.FILLED)return self.lmListdef findAngle(self, img, p1, p2, p3, draw=True): #Get the landmarksx1, y1 = self.lmList[p1][1:]x2, y2 = self.lmList[p2][1:]x3, y3 = self.lmList[p3][1:]#Calculate Angleangle = math.degrees(math.atan2(y3-y2, x3-x2) - math.atan2(y1-y2, x1-x2))if angle < 0:angle += 360if angle > 180:angle = 360 - angleelif angle > 180:angle = 360 - angle# print(angle)#Drawif draw:cv2.line(img, (x1, y1), (x2, y2), (255,255,255), 3)cv2.line(img, (x3, y3), (x2, y2), (255,255,255), 3)cv2.circle(img, (x1, y1), 5, (0,0,255), cv2.FILLED)cv2.circle(img, (x1, y1), 15, (0,0,255), 2)cv2.circle(img, (x2, y2), 5, (0,0,255), cv2.FILLED)cv2.circle(img, (x2, y2), 15, (0,0,255), 2)cv2.circle(img, (x3, y3), 5, (0,0,255), cv2.FILLED)cv2.circle(img, (x3, y3), 15, (0,0,255), 2)cv2.putText(img, str(int(angle)), (x2-50, y2+50), cv2.FONT_HERSHEY_PLAIN, 2, (0,0,255), 2)return angledef main():detector = poseDetector()cap = cv2.VideoCapture(0)while cap.isOpened():ret, img = cap.read() #ret is just the return variable, not much in there that we will use. if ret: img = detector.findPose(img)cv2.imshow('Pose Detection', img)if cv2.waitKey(10) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()if __name__ == "__main__":main()
以上是这个程序的代码。
上面的代码来源于PoseModule.py,有以下几个功能:
激活mediapipe的姿势检测模块。
检测人体。
根据模型找到人体上不同肢体关节的位置。(肢体显示在上面的图片中)。
查找关节之间的角度(取决于你选择的关节)。对于我的俯卧撑程序,我选择找到肘部、肩部和臀部的角度,因为这些对俯卧撑动作的标准至关重要。
接下来是实际的俯卧撑计数的代码。我们使用PoseModule并确定一个俯卧撑合格与否的标准。
import cv2import mediapipe as mpimport numpy as npimport PoseModule as pmcap = cv2.VideoCapture(0)detector = pm.poseDetector()count = 0direction = 0form = 0feedback = "Fix Form"while cap.isOpened():ret, img = cap.read() #640 x 480#Determine dimensions of video - Help with creation of box in Line 43width = cap.get(3) # float `width`height = cap.get(4) # float `height`# print(width, height)img = detector.findPose(img, False)lmList = detector.findPosition(img, False)# print(lmList)if len(lmList) != 0:elbow = detector.findAngle(img, 11, 13, 15)shoulder = detector.findAngle(img, 13, 11, 23)hip = detector.findAngle(img, 11, 23,25)#Percentage of success of pushupper = np.interp(elbow, (90, 160), (0, 100))#Bar to show Pushup progressbar = np.interp(elbow, (90, 160), (380, 50))#Check to ensure right form before starting the programif elbow > 160 and shoulder > 40 and hip > 160:form = 1#Check for full range of motion for the pushupif form == 1:if per == 0:if elbow <= 90 and hip > 160:feedback = "Up"if direction == 0:count += 0.5direction = 1else:feedback = "Fix Form"if per == 100:if elbow > 160 and shoulder > 40 and hip > 160:feedback = "Down"if direction == 1:count += 0.5direction = 0else:feedback = "Fix Form"# form = 0print(count)#Draw Barif form == 1:cv2.rectangle(img, (580, 50), (600, 380), (0, 255, 0), 3)cv2.rectangle(img, (580, int(bar)), (600, 380), (0, 255, 0), cv2.FILLED)cv2.putText(img, f'{int(per)}%', (565, 430), cv2.FONT_HERSHEY_PLAIN, 2,(255, 0, 0), 2)#Pushup countercv2.rectangle(img, (0, 380), (100, 480), (0, 255, 0), cv2.FILLED)cv2.putText(img, str(int(count)), (25, 455), cv2.FONT_HERSHEY_PLAIN, 5,(255, 0, 0), 5)#Feedback cv2.rectangle(img, (500, 0), (640, 40), (255, 255, 255), cv2.FILLED)cv2.putText(img, feedback, (500, 40 ), cv2.FONT_HERSHEY_PLAIN, 2,(0, 255, 0), 2)cv2.imshow('Pushup counter', img)if cv2.waitKey(10) & 0xFF == ord('q'):breakcap.release()cv2.destroyAllWindows()
有个需要注意的地方在第17-21行。确定从相机捕捉到的图像的分辨率,并在绘制俯卧撑计数的矩形时调整像素值,等等。(第68-82行)。
我们完成了!一个能确保动作标准的俯卧撑计数软件。没有完全俯下?不算数! 膝盖放在了地上?不算数!
快乐的做俯卧撑吧!
原文链接:
https://aryanvij02.medium.com/push-ups-with-python-mediapipe-open-a544bd9b4351
GitHub 地址:
https://github.com/aryanvij02/PushUpCounter
相关文章:

Linux下配置SNMP
SNMP(Simple NetworkManagement Protocol ):简单网络管理协议本案列为Linux环境搭建(CentOS-6)使用yum进行安装:yum install -y net-snmp安装完成后先查看网络配置:netstat -anupl确认161端口被…

重磅!MaxCompute助力阿里开源自研语音识别模型DFSMN,准确率高达96.04%
阿里开源语音识别模型DFSMN 在近期举行的云栖大会武汉峰会上,装有DFSMN语音识别模型的“AI收银员”在与真人店员的PK中,在嘈杂环境下准确识别了用户的语音点单,在短短49秒内点了34杯咖啡。此外,装备这一语音识别技术的自动售票机也…

全球网络拓扑图
原文出自海外一个论坛:http://board.us.ikariam.com/board16-miscellaneous/board205-discussion-board/67724-internet/InternetSo, I always take a look at these maps and also information on the workings of the internetAnd I have questions:Are there map…

Python 实现 PD 文字识别、提取并写入 CSV 文件脚本分享
作者 | 一只河马h来源 | 简说Python一、前言二、需求描述三、开始动手动脑3.1 安装相关第三方包3.2 导入需要用到的第三方库3.3 读取pdf文件,并识别内容3.4 对识别的数据进行处理,写入csv文件总结前言扫描件一直受大众青睐,任何纸质资料在扫描…

根据listObject中的某个字段排序
compareTo必须是两个对象之间的比较(比如Long,Integer...),以下例子是升序排序 private void businessSort(List<WxDailyBusinessInfo> wxDailyBusinessInfo) { //排序前for (int i 0; i < wxDailyBusinessInfo.size(); i) {System.out.println(new Gson(…

CC国内厂商现状
(1)阿里云的产品 CC攻击 攻击者攻击服务器的认证页面、登录页面、游戏论坛等。还是用饭馆的例子,CC攻击相当于,坏人霸占收银台结账、霸占服务员点菜,导致正常的客人无法享受到服务。 游戏盾如何防御CC攻击?…

网络模型 - 随机网络,无标度网络,分层网络
转自: http://www.flickr.com/photos/caseorganic/4510691991/in/set-72157624621620243小图大图Network Models - Random network, Scale-free network, Hierarchical network随机网络The Erds–Rnyi (ER) model of a random network14 (see figure, part A) start…

一文介绍机器学习中的三种特征选择方法
作者 | luanhz来源 | 小数志导读机器学习中的一个经典理论是:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。也正因如此,特征工程在机器学习流程中占有着重要地位。广义的特征工程一般可分为三个环节:特征提取、…

[转化率预估-1]引言
原文:hhttp://www.flickering.cn/ads/2014/06/%E8%BD%AC%E5%8C%96%E7%8E%87%E9%A2%84%E4%BC%B0%E2%80%94%E2%80%94%E5%BC%95%E8%A8%80/ 最近几年,“计算广告学”的概念风生水起,让我们这些从事在线广告匹配技术的程序猿着实荣耀了一把。这在参…

reportNG定制化之失败截图及日志
先从github上拉下 reportNg的源代码 reportng 拉下源码后我们使用IDEA进行导入 1、reportng.properties 增加部分类表项 这里我们直接在末尾添加 logLog Info screenshotScreen Shot durationDuration2、results.html.vm 修改结果的html,我们目前只修改fail的情况下…

基于 OpenCV 的手掌检测和手指计数
作者 | 努比 来源 | 小白学视觉 利用余弦定理使用OpenCV-Python实现手指计数与手掌检测。 手检测和手指计数 接下来让我们一起探索以下这个功能是如何实现的。 OpenCV OpenCV(开源计算机视觉库)是一个开源计算机视觉和机器学习软件库。OpenCV的构建旨在为…

side menu待研究
2019独角兽企业重金招聘Python工程师标准>>> http://fontawesome.bootstrapcheatsheets.com/ http://www.queness.com/post/14666/recreate-google-nexus-menu http://www.jqueryscript.net/demo/Sliding-Side-Menu-Panel-with-jQuery-Bootstrap-BootSideMenu/ &a…

Gitlab Issue Tracker and Wiki(一)
本节内容:创建第一个问题创建第一个合并请求接受合并请求工作里程碑在提交中引用问题创建维基百科页使用Gollum管理维基百科一. 创建问题1. 登陆Gitlab服务器2. 切换到想要创建问题的项目3. 点击Issues.4. 点击【New issue】5. 根据情况进行填写。二. 创建合并请求1…

runtime实践之Method Swizzling
利用 Objective-C 的 Runtime 特性,我们可以给语言做扩展,帮助解决项目开发中的一些设计和技术问题。这一篇,我们来探索一些利用 Objective-C Runtime 的黑色技巧。这些技巧中最具争议的或许就是 Method Swizzling 。 介绍一个技巧࿰…

网络协议关系拓扑图 很全面 很好
NETWORK ASSOCIATES GUIDE TO COMMUNICATIONS PROTOCOLS 网络协议关系拓扑图 很全面 很好 值得收藏!

一行代码搞定 Python 逐行内存消耗分析
作者 | 费弗里来源 | Python大数据分析我们即将学习的是:一行代码分析Python代码行级别内存消耗。很多情况下,我们需要对已经写好的Python程序的内存消耗进行优化,但是一段代码在运行过程中的内存消耗是动态变化的,这种时候就可以…

崛起于Springboot2.X之Mybatis-全注解方式操作Mysql(4)
为什么80%的码农都做不了架构师?>>> 1、使用注解方式对mysql增删改查,它很方便,不像一些逆向工程工具一样生成的都是乱七八糟,虽然很全的方法,完全手写sql 基于上一篇博客,我们只需要新建一个目录dao层&am…

hdu 1247
Problem DescriptionA hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.You are to find all the hat’s words in a dictionary.InputStandard input consists of a number of lowercase words, one per li…

php执行URL解析
方法一: $url"http://www.baidu.com";file_get_contents($url);方法二: // CURL 方法$url"http://www.baidu.com";$ch curl_init( );curl_setopt( $ch,CURLOPT_URL,$url );curl_setopt( $ch,CURLOPT_HEADER,0 );curl_setopt( $ch,…

Python 来分析,堪比“唐探系列”!B站9.5分好评如潮!
作者 | 菜鸟哥来源 | 菜鸟学PythonHello 小伙伴们,最近一部非常不错的悬疑侦探喜剧 电影,登上B站热榜!菜鸟哥看完之后,大呼过瘾,简直就是一本非常棒的"剧本杀"!演员都是实力派,演技超…

10进制转换为二十六进制字符串A-Z
def convert10to26(num): ...: 10进制转为26进制字母 A-Z, 输入参数10进制数num, 返回26位的字母A-Z 参数type: num: int return: str ...: ...: digit_list [] # 列表当栈使用,存储每次求余的结果 ...: while num !0: ...: digit_list.append(num%26)…

从hello world 说程序运行机制
http://www.cnblogs.com/yanlingyin/archive/2012/03/05/2379199.html 开篇 学习任何一门编程语言,都会从hello world 开始。对于一门从未接触过的语言,在短时间内我们都能用这种语言写出它的hello world。然而,对于hello world 这个简单程序…

爱耳日腾讯天籁行动再升级 助力100位青年听障人才打破“屏障”
公益是解决社会问题的重要切入口,科技是提升效率的强有力工具。当产业技术走入公益场景,科技也在发挥更大的社会价值。 《中国听力健康报告(2021)》显示,过度的噪音曝露,正让全球11亿年轻人面临听力受损的风…

IOS推送详解
为什么80%的码农都做不了架构师?>>> IOS推送详解 一.关于推送通知 推送通知,也被叫做远程通知,是在iOS 3.0以后被引入的功能。是当程序没有启动或不在前台运行时,告诉用户有新消息的一种途径,是从外部服务…

redis(4)
redis-cli -p 6380redis-cli -p 6379 info server | grep run_idpsync ? -1

PHP也玩并发,巧用curl 并发减少后端访问时间
说明:本人源自3篇博文 http://blog.csdn.net/zuiaituantuan/article/details/7048782首先,先了解下 php中的curl多线程函数:# curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getcontent# curl_multi_info_read# cur…

ADSL自动更换IP地址源代码
有些网站限制IP地址,什么一个IP地址只能一次之类的。特别是投票网址,为了防止刷票,限制1个IP只允许投票一次! 此程序采用Vs2010C#开发,提供全部源代码!方便程序猿朋友二次开发! 可以后台运行&am…

安全隐患:神经网络可以隐藏恶意软件
编译 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 凭借数百万和数十亿的数值参数,深度学习模型可以做到很多的事情,例如,检测照片中的对象、识别语音、生成文本以及隐藏恶意软件。加州大学圣地亚哥分校和伊利诺伊大学…

实现一个完美符合Promise/A+规范的Promise
原文在我的博客中:原文地址 如果文章对您有帮助,您的star是对我最好的鼓励~ 简要介绍:Promise允许我们通过链式调用的方式来解决“回调地狱”的问题,特别是在异步过程中,通过Promise可以保证代码的整洁性和…

用递归法计算斐波那契数列的第n项
斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F00,F11,FnF(n-1)F(n-2)&a…