基于Python的MediaPipe姿态识别实现跳绳状态判别与计数功能
项目概述
本项目旨在利用Google的MediaPipe库,结合姿态识别技术,实现对跳绳动作的实时检测与计数功能。通过识别人体关键点,系统能够准确判断跳绳动作的状态,并实时统计跳绳次数。该项目适用于健身应用程序、体育训练分析等领域,为用户提供准确的运动数据支持。
技术栈
- Python:开发语言。
- MediaPipe:用于姿态识别的核心库。
- OpenCV:用于图像处理和视频流的捕获。
- NumPy:进行数值计算。
系统功能
- 姿态识别:利用MediaPipe的姿态识别功能,实时检测人体的关键点。
- 动作识别:根据关键点的位置和变化,判断是否为跳绳动作。
- 计数功能:实时统计跳绳次数,并在界面上显示。
- 实时反馈:在界面上显示当前跳绳状态和次数。
系统特点
- 高精度识别:MediaPipe提供了高精度的姿态识别能力,能够准确检测人体关键点。
- 实时处理:系统能够在视频流中实时处理每一帧图像,实时反馈跳绳状态和次数。
- 用户友好:通过图形界面,用户可以轻松启动和停止检测,并查看实时数据。
系统架构
- 输入源选择:用户可以选择摄像头作为输入源。
- 姿态检测:使用MediaPipe的姿态检测功能,实时检测人体关键点。
- 动作识别:根据关键点的变化,判断是否为跳绳动作。
- 计数功能:统计跳绳次数,并在界面上显示。
- 结果展示:在GUI界面上显示跳绳状态和次数。
关键技术
- MediaPipe姿态检测:MediaPipe提供了高精度的姿态检测功能,能够实时检测人体的多个关键点。
- 动作识别算法:通过分析关键点的位置和变化,判断是否为跳绳动作。
- 计数逻辑:根据动作识别结果,统计跳绳次数。
系统流程
- 启动摄像头:用户启动摄像头,系统开始捕获视频流。
- 姿态检测:使用MediaPipe的姿态检测功能,实时检测人体关键点。
- 动作识别:根据关键点的位置和变化,判断是否为跳绳动作。
- 计数功能:统计跳绳次数,并在界面上显示。
- 实时反馈:在GUI界面上显示跳绳状态和次数。
示例代码
以下是一个简化的代码示例,展示了如何使用MediaPipe姿态检测功能进行跳绳动作的识别和计数:
1import cv2
2import mediapipe as mp
3import numpy as np
4
5# 初始化MediaPipe姿态检测模块
6mp_drawing = mp.solutions.drawing_utils
7mp_pose = mp.solutions.pose
8
9# 初始化计数器
10count = 0
11state = "down"
12
13# 初始化摄像头
14cap = cv2.VideoCapture(0)
15
16# 设置MediaPipe姿态检测参数
17with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
18 while cap.isOpened():
19 ret, frame = cap.read()
20
21 # 转换图像颜色格式
22 image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
23 image.flags.writeable = False
24
25 # 进行姿态检测
26 results = pose.process(image)
27
28 # 重新设置图像颜色格式
29 image.flags.writeable = True
30 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
31
32 # 绘制姿态关键点
33 mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,
34 mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),
35 mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))
36
37 # 获取关键点坐标
38 try:
39 landmarks = results.pose_landmarks.landmark
40
41 # 获取肩膀和臀部的坐标
42 shoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x, landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]
43 hip = [landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x, landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y]
44
45 # 计算肩膀和臀部之间的距离
46 distance = np.sqrt((shoulder[0] - hip[0])**2 + (shoulder[1] - hip[1])**2)
47
48 # 根据距离判断跳绳状态
49 if distance > 0.5 and state == "down":
50 state = "up"
51 elif distance < 0.3 and state == "up":
52 state = "down"
53 count += 1
54
55 except Exception as e:
56 pass
57
58 # 显示计数结果
59 cv2.rectangle(image, (0, 0), (225, 73), (245, 117, 16), -1)
60 cv2.putText(image, 'Jumps: ' + str(count), (15, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), 2, cv2.LINE_AA)
61
62 # 显示图像
63 cv2.imshow('Jump Rope Counter', image)
64
65 if cv2.waitKey(10) & 0xFF == ord('q'):
66 break
67
68# 释放资源
69cap.release()
70cv2.destroyAllWindows()
总结
本项目通过结合MediaPipe的姿态识别技术和OpenCV的视频处理功能,实现了对跳绳动作的实时检测与计数。系统能够在视频流中实时检测人体关键点,并根据关键点的变化判断跳绳动作,实时统计跳绳次数。该系统具有高精度和实时性,适用于健身应用程序和体育训练分析等多个领域。