Python玩人工智能:你的俯卧撑做对了吗?
创始人
2024-05-10 09:10:06
0

1. 准备工作

1.1 安装Python3.8.x

1.2 安装PyCharm社区版

1.3 创建项目

1.4 安装项目使用工具包

1.1 下载安装Python3.8.x版本

首先我们的电脑上要安装Python3.8.x。Python 3.8.x : https://www.python.org/downlo...

1.2 下载安装PyCharm社区版

PyCharm: https://www.jetbrains.com/pyc... 当然你也可以使用自己喜欢的IDE。

1.3 创建一个Python项目

安装好Python和PyCharm之后,我们可以启动PyCharm,创建一个新的Python项目。选择项目的存储位置,创建项目时,可以让PyCharm帮忙创建一个虚拟环境(virtualenv),虚拟环境可以理解为这个项目专属的编程环境,不会影响其他的项目。

1.4 安装项目所用的工具包

项目创建好之后,我们打开PyCharm的Terminal窗口,在这里我们可以输入以下命令来安装这个项目所需要的工具包:opencv-python mediapipe numpy pyautogui。下面的命令会从网络上下载工具包并安装,如果你看到最后有“Successfully installed...”这样的英文,表示安装成功了。

pip install opencv-python mediapipe numpy

也可以点开PyCharm的设置,看到项目的Python环境中,是否有以上的工具包,如果有就表示安装成功了。

2. 编写程序

2.1 创建poseutil.py模块

2.2 编写pushup.py

2.3 测试运行

2.1 创建poseutil.py模块

创建一个新的Python文件,取名为poseutil.py,这是我们创建的姿势识别的模块,在这个模块中有一个PoseDetector的姿势识别器类,使用它可以识别人体姿势、获取人体姿势数据以及计算人体姿势相关点的角度。

import cv2
import mediapipe as mp
import mathclass PoseDetector():'''人体姿势检测类'''def __init__(self,static_image_mode=False,upper_body_only=False,smooth_landmarks=True,min_detection_confidence=0.5,min_tracking_confidence=0.5):'''初始化:param static_image_mode: 是否是静态图片,默认为否:param upper_body_only: 是否是上半身,默认为否:param smooth_landmarks: 设置为True减少抖动:param min_detection_confidence:人员检测模型的最小置信度值,默认为0.5:param min_tracking_confidence:姿势可信标记的最小置信度值,默认为0.5'''self.static_image_mode = static_image_modeself.upper_body_only = upper_body_onlyself.smooth_landmarks = smooth_landmarksself.min_detection_confidence = min_detection_confidenceself.min_tracking_confidence = min_tracking_confidence# 创建一个Pose对象用于检测人体姿势self.pose = mp.solutions.pose.Pose(self.static_image_mode, self.upper_body_only, self.smooth_landmarks,self.min_detection_confidence, self.min_tracking_confidence)def find_pose(self, img, draw=True):'''检测姿势方法:param img: 一帧图像:param draw: 是否画出人体姿势节点和连接图:return: 处理过的图像'''imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)# pose.process(imgRGB) 会识别这帧图片中的人体姿势数据,保存到self.results中self.results = self.pose.process(imgRGB)if self.results.pose_landmarks:if draw:mp.solutions.drawing_utils.draw_landmarks(img, self.results.pose_landmarks,mp.solutions.pose.POSE_CONNECTIONS)return imgdef find_positions(self, img):'''获取人体姿势数据:param img: 一帧图像:param draw: 是否画出人体姿势节点和连接图:return: 人体姿势数据列表'''# 人体姿势数据列表,每个成员由3个数字组成:id, x, y# id代表人体的某个关节点,x和y代表坐标位置数据self.lmslist = []if self.results.pose_landmarks:for id, lm in enumerate(self.results.pose_landmarks.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)self.lmslist.append([id, cx, cy])return self.lmslistdef find_angle(self, img, p1, p2, p3, draw=True):'''获取人体姿势中3个点p1-p2-p3的角度:param img: 一帧图像:param p1: 第1个点:param p2: 第2个点:param p3: 第3个点:param draw: 是否画出3个点的连接图:return: 角度'''x1, y1 = self.lmslist[p1][1], self.lmslist[p1][2]x2, y2 = self.lmslist[p2][1], self.lmslist[p2][2]x3, y3 = self.lmslist[p3][1], self.lmslist[p3][2]# 使用三角函数公式获取3个点p1-p2-p3,以p2为角的角度值,0-180度之间angle = int(math.degrees(math.atan2(y1 - y2, x1 - x2) - math.atan2(y3 - y2, x3 - x2)))if angle < 0:angle = angle + 360if angle > 180:angle = 360 - angleif draw:cv2.circle(img, (x1, y1), 20, (0, 255, 255), cv2.FILLED)cv2.circle(img, (x2, y2), 30, (255, 0, 255), cv2.FILLED)cv2.circle(img, (x3, y3), 20, (0, 255, 255), cv2.FILLED)cv2.line(img, (x1, y1), (x2, y2), (255, 255, 255, 3))cv2.line(img, (x2, y2), (x3, y3), (255, 255, 255, 3))cv2.putText(img, str(angle), (x2 - 50, y2 + 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 255), 2)return angle

2.2 编写pushup.py

编写下面的代码,调用poseutil模块,获取人体姿势数据,并计算人体中肩膀、臀部、膝盖三个点以及肩膀、手肘、手腕构成的角度,通过这2个角度来判断俯卧撑是否标准。

# 导入opencv工具包
import cv2
# 导入numpy
import numpy as np
# 导入姿势识别器
from poseutil import PoseDetector# 打开视频文件
cap = cv2.VideoCapture('videos/pushup.mp4')
# 姿势识别器
detector = PoseDetector()# 方向与个数
dir = 0  # 0为下,1为上
count = 0# 视频宽度高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 录制视频设置
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('videos/pushupoutput.mp4', fourcc, 30.0, (width, height))while True:# 读取摄像头,img为每帧图片success, img = cap.read()if success:h, w, c = img.shape# 识别姿势img = detector.find_pose(img, draw=True)# 获取姿势数据positions = detector.find_positions(img)if positions:# 获取俯卧撑的角度angle1 = detector.find_angle(img, 12, 24, 26)angle2 = detector.find_angle(img, 12, 14, 16)# 进度条长度bar = np.interp(angle2, (45, 150), (w // 2 - 100, w // 2 + 100))cv2.rectangle(img, (w // 2 - 100, h - 150), (int(bar), h - 100), (0, 255, 0), cv2.FILLED)# 角度小于50度认为撑下if angle2 <= 50 and angle1 >= 165 and angle1 <= 175:if dir == 0:count = count + 0.5dir = 1# 角度大于125度认为撑起if angle2 >= 125 and angle1 >= 165 and angle1 <= 175:if dir == 1:count = count + 0.5dir = 0cv2.putText(img, str(int(count)), (w // 2, h // 2), cv2.FONT_HERSHEY_SIMPLEX, 10, (255, 255, 255), 20, cv2.LINE_AA)# 打开一个Image窗口显示视频图片cv2.imshow('Image', img)# 录制视频out.write(img)else:# 视频结束退出break# 如果按下q键,程序退出key = cv2.waitKey(1)if key == ord('q'):break# 关闭视频保存器
out.release()
# 关闭摄像头
cap.release()
# 关闭程序窗口
cv2.destroyAllWindows()

2.3 测试运行

在实际运行测试时,我们设置的俯卧撑角度是50度到125度之间,可以根据拍摄角度来调整,另外我们要求臀部角度在165度到175度之间,这个也是可以调整的。建议拍摄视频或者使用摄像头时更多的放在人体的侧上部分,这样检测的会比较准确。

 

 

相关内容

热门资讯

规则之下谋共赢 中欧电动汽车贸...   中欧电动汽车贸易磋商,迎来关键转折。  1月12日,中国商务部用一则不到400字的通报,介绍了中...
“快递发货”“送货上门”……这... 岁末年初烟花爆竹进入销售旺季线上售卖、快递运输……警惕这些都是违法行为! 违法售卖、违法运输、寄递...
神舟二十号航天员“换乘”飞船返...   中新网北京1月16日电 (马帅莎 占康)1月16日,中国航天员科研训练中心在北京航天城举行神舟二...
尹锡悦紧急戒严系列案件首场宣判...   △韩国前总统尹锡悦(资料图)  当地时间16日下午,韩国首尔中央地方法院将就前总统尹锡悦发动紧急...
从概念到落地,“物理AI”的“...   “‘物理人工智能(物理AI)’的‘ChatGPT时刻’已经到来。”在不久前落下帷幕的美国拉斯维加...
精准滴灌中小民企,夯实经济内生...   1月15日,中国人民银行副行长邹澜在国新办新闻发布会上宣布,将合并使用支农支小再贷款与再贴现额度...
中方祝贺乌拉圭接任77国集团2...   中新网北京1月16日电 (记者 谢雁冰)中国外交部发言人郭嘉昆16日主持例行记者会。  有记者提...
一根细丝扛千钧   【瞧!我们的前沿科技】  国产高性能碳纤维量产落地——  一根细丝扛千钧  光明日报记者 崔兴毅...
从保障到服务:星相守与金医保的... 先看保障责任的核心导向,这是两者最直观的区别。星相守更偏向“基础保障的全面性”,核心责任覆盖住院、手...