python仰卧起坐计数
时间: 2023-11-08 09:06:05 浏览: 112
可以使用Python编写一个简单的仰卧起坐计数程序,代码如下:
```python
count = 0
while True:
action = input("请进行仰卧起坐动作(按q退出):")
if action == "q":
break
elif action == "up":
count += 1
print("当前计数:", count)
elif action == "down":
count -= 1
print("当前计数:", count)
else:
print("无效的动作,请重新输入!")
print("最终计数:", count)
```
该程序会不断循环,直到用户输入"q"退出。用户可以输入"up"或"down"来增加或减少计数。程序会在每次操作后输出当前计数。
相关问题
仰卧起坐计数python
### 仰卧起坐计数程序的实现
开发一个基于Python的仰卧起坐计数程序,可以分为以下几个部分:姿态估计模型的设计与训练、关键帧和关键点的检测、计数算法的实现以及用户界面的构建。以下是对这些部分的具体说明:
#### 1. 姿态估计模型
姿态估计模型是仰卧起坐计数的核心部分,用于识别人体的关键点(如头部、肩膀、膝盖等)并检测动作的变化。可以使用深度学习框架PyTorch来构建姿态估计模型[^2]。
```python
import torch
import torchvision.transforms as transforms
from torch.utils.data import DataLoader
from torchvision.models.detection import keypointrcnn_resnet50_fpn
# 加载预训练的姿态估计模型
model = keypointrcnn_resnet50_fpn(pretrained=True)
model.eval()
# 定义数据预处理步骤
transform = transforms.Compose([
transforms.ToTensor()
])
# 函数:对单张图像进行姿态估计
def estimate_pose(image):
image_tensor = transform(image)
with torch.no_grad():
predictions = model([image_tensor])
keypoints = predictions[0]['keypoints'].cpu().numpy()
return keypoints
```
#### 2. 关键帧和关键点检测
通过姿态估计模型输出的关键点数据,可以进一步分析人体动作的变化。例如,可以通过比较头部和膝盖的角度变化来判断是否完成了一次仰卧起坐。
```python
import numpy as np
# 函数:计算两个向量之间的角度
def calculate_angle(a, b, c):
ba = a - b
bc = c - b
cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
angle = np.arccos(cosine_angle)
return np.degrees(angle)
# 函数:判断是否完成一次仰卧起坐
def is_situp_complete(keypoints):
head = keypoints[0]
shoulder = keypoints[5]
knee = keypoints[13]
angle = calculate_angle(head, shoulder, knee)
if angle < 90: # 根据实际需求调整阈值
return True
return False
```
#### 3. 计数算法
根据姿态估计模型的输出结果,设计一个计数算法来统计仰卧起坐的次数。可以通过状态机的方式记录动作的变化。
```python
class SitupCounter:
def __init__(self):
self.state = "START"
self.count = 0
def update(self, keypoints):
if self.state == "START" and is_situp_complete(keypoints):
self.state = "DOWN"
elif self.state == "DOWN" and not is_situp_complete(keypoints):
self.state = "UP"
self.count += 1
elif self.state == "UP" and is_situp_complete(keypoints):
self.state = "DOWN"
def get_count(self):
return self.count
```
#### 4. 用户界面
为了提高用户体验,可以构建一个友好的系统界面,让用户能够实时查看仰卧起坐的计数结果。可以使用OpenCV库来显示视频流,并在界面上显示计数信息。
```python
import cv2
# 初始化计数器
counter = SitupCounter()
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 进行姿态估计
keypoints = estimate_pose(frame)
# 更新计数器
counter.update(keypoints)
# 显示计数结果
cv2.putText(frame, f"Count: {counter.get_count()}", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Situp Counter", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
### 注意事项
- 确保安装了必要的依赖库,如`torch`, `torchvision`, `opencv-python`。
- 可以根据实际需求调整姿态估计模型的参数和计数算法的逻辑。
- 在实际应用中,可能需要对模型进行微调或重新训练,以适应特定的场景和人群。
基于python使用OpenCV和MediaPipe通过人体姿态检测实现对标准的仰卧起坐的计数的代码
### 使用 Python、OpenCV 和 MediaPipe 进行人体姿态检测以实现仰卧起坐计数
为了实现对人体姿态的检测以及仰卧起坐次数的统计,下面提供了一个完整的代码示例。此代码会读取摄像头输入或视频文件中的每一帧图像,并通过MediaPipe库来识别出人体的关键部位位置。
#### 导入必要的模块
```python
import cv2
import mediapipe as mp
import math
```
#### 初始化 Mediapipe Pose Model
```python
mp_pose = mp.solutions.pose
pose = mp_pose.Pose(static_image_mode=False, min_detection_confidence=0.5, model_complexity=1)
mp_drawing = mp.solutions.drawing_utils
```
#### 定义辅助函数用于计算两个向量之间的角度
```python
def calculate_angle(a, b, c):
ba = a - b
bc = c - b
cosine_angle = np.dot(ba, bc) / (np.linalg.norm(ba) * np.linalg.norm(bc))
angle = np.arccos(cosine_angle)
return round(math.degrees(angle), 2)
```
#### 主循环处理每帧数据
```python
cap = cv2.VideoCapture(0) # 或者加载本地视频 cap = cv2.VideoCapture('path_to_video.mp4')
counter = 0
stage = None
pTime = 0
while True:
ret, frame = cap.read()
if not ret:
break
imgRGB = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = pose.process(imgRGB)
try:
landmarks = results.pose_landmarks.landmark
shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
hip = [landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y]
knee = [landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].x,
landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].y]
angle = calculate_angle(np.array(shoulder),
np.array(hip),
np.array(knee))
per = np.interp(angle, (90, 170), (0, 100)) # 将角度映射到百分比范围
bar = np.interp(angle, (90, 170), (280, 100)) # 映射进度条高度
color = (255, 0, 255) if angle >= 160 else (0, 255, 0)
if angle <= 130 and stage != 'up':
counter += 0.5
stage = 'up'
elif angle > 160 and stage == 'up':
counter += 0.5
stage = 'down'
cv2.rectangle(frame, (335, int(bar)), (355, 280), color, cv2.FILLED)
cv2.putText(frame, f'{int(per)}%', (300, 75), cv2.FONT_HERSHEY_PLAIN, 2, color, 2)
cv2.putText(frame, str(int(counter)), (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)[^1]
except Exception as e:
pass
mp_drawing.draw_landmarks(
image=frame,
landmark_list=results.pose_landmarks,
connections=mp_pose.POSE_CONNECTIONS,
landmark_drawing_spec=mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),
connection_drawing_spec=mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2)
)
cv2.imshow('Mediapipe Feed', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
```
上述代码实现了从摄像头捕获画面并使用MediaPipe的人体模型进行分析的功能。当检测到特定的身体姿势变化时(即完成了一次有效的仰卧起坐动作),则增加计数值[^1]。
阅读全文
相关推荐















