首页 > 其他分享 >使用Mediapipe和OpenPose进行人体动作分析、计数以及3D姿态估计

使用Mediapipe和OpenPose进行人体动作分析、计数以及3D姿态估计

时间:2024-08-24 14:25:26浏览次数:10  
标签:Mediapipe angle image pose cv2 mp 3D 姿态 OpenPose

 

人体步数统计,俯卧撑计数,仰卧起坐计数,引体向上计数,人体动作分析,动作计数,mediapipe,openpose,人体3d姿态分析,3d姿态估计。

本项目旨在开发一个基于计算机视觉的人体运动分析系统,能够准确地识别和计数诸如步行、俯卧撑、仰卧起坐、引体向上等多种常见体育锻炼动作。系统利用先进的深度学习技术,特别是Mediapipe和OpenPose等开源工具,来实时捕捉和分析人体姿态,从而实现动作的精确计数和分析。

关键技术

  1. Mediapipe
    • 2D姿态估计:使用Mediapipe的Pose模块来检测人体的关键点,包括头部、躯干、四肢等部位。
    • 3D姿态估计:利用深度摄像头或立体视觉技术来获取三维姿态信息,增强动作分析的准确性。

  1. OpenPose
    • 多人姿态检测:能够同时检测多个个体的姿态,适用于健身房等场景。
    • 手部和面部关键点检测:提供额外的手部和面部关键点信息,对于分析复杂的动作非常有用。

功能特点

  • 动作识别:能够准确识别多种体育动作,包括步行、俯卧撑、仰卧起坐和引体向上等。
  • 动作计数:根据动作模式自动计数,无需人工干预。
  • 3D姿态分析:提供3D姿态估计,使动作分析更加精细。
  • 实时反馈:通过视频流实时显示动作分析结果,为用户提供即时反馈。
  • 多平台支持:支持多种设备,包括智能手机、电脑和平板电脑等。

技术实现

  • 数据采集:使用普通摄像头或深度摄像头(如Kinect、Intel RealSense等)来捕获视频流。
  • 姿态估计:Mediapipe和OpenPose分别用于2D和3D姿态估计。
  • 动作识别:基于姿态变化和关键点位置变化来识别特定的动作。
  • 计数逻辑:通过设定阈值和连续帧间的姿态变化来实现计数。
  • 用户界面:开发图形用户界面,显示动作计数和分析结果。

开发流程

  1. 数据准备:收集和标注训练数据,包括各种动作的视频片段。
  2. 模型训练:使用Mediapipe和OpenPose训练姿态估计模型。
  3. 算法开发:开发算法来识别和计数特定动作。
  4. 系统集成:将各个组件整合成一个完整的系统。
  5. 用户界面设计:设计友好的用户交互界面。
  6. 测试与优化:进行全面测试,并根据用户反馈不断优化。

使用案例

  • 健身教练:为个人训练者提供专业指导。
  • 体育训练:帮助运动员监测训练效果。
  • 康复治疗:协助物理治疗师评估患者的康复进度。
  • 智能家居:集成到智能家庭系统中,监测家庭成员的健康活动。

结论

本项目通过结合先进的计算机视觉技术和机器学习方法,实现了对人体动作的有效分析与计数。它不仅能够帮助个人用户监控自己的锻炼情况,还为专业人士提供了有效的工具来评估和改进体育训练。

首先,确保已经安装了必要的Python库:

1pip install mediapipe opencv-python

接下来是具体的代码实现:

1. 导入必要的库

1import cv2
2import mediapipe as mp
3import math

2. 初始化姿态检测器

1mp_drawing = mp.solutions.drawing_utils
2mp_pose = mp.solutions.pose
3
4# 初始化姿态检测模型
5pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)

3. 定义姿态检测和动作计数的函数

1def detect_pose_and_count_pushups(image, pushup_count=0, state=""):
2    # 转换图像格式
3    image.flags.writeable = False
4    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
5    results = pose.process(image)
6
7    # 绘制姿态检测结果
8    image.flags.writeable = True
9    image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
10    mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,
11                            mp_drawing.DrawingSpec(color=(245,117,66), thickness=2, circle_radius=2),
12                            mp_drawing.DrawingSpec(color=(245,66,230), thickness=2, circle_radius=2))
13
14    # 获取关键点坐标
15    landmarks = results.pose_landmarks.landmark
16    if landmarks:
17        shoulder = [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y]
18        elbow = [landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value].y]
19        wrist = [landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].y]
20        
21        # 计算角度
22        angle = calculate_angle(shoulder, elbow, wrist)
23
24        # 角度阈值
25        angle_threshold_up = 160
26        angle_threshold_down = 70
27
28        # 根据角度判断状态
29        if angle > angle_threshold_up:
30            state = "up"
31        if angle < angle_threshold_down and state == "up":
32            state = "down"
33            pushup_count += 1
34
35    # 显示计数和状态
36    cv2.rectangle(image, (0,0), (225,73), (245,117,16), -1)
37    cv2.putText(image, 'PUSH UPS', (15,12), 
38                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1, cv2.LINE_AA)
39    cv2.putText(image, 'COUNT', (10,40), 
40                cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2, cv2.LINE_AA)
41    cv2.putText(image, str(pushup_count), 
42                (10,70), 
43                cv2.FONT_HERSHEY_SIMPLEX, 2, (255,255,255), 2, cv2.LINE_AA)
44    
45    # 显示状态
46    cv2.rectangle(image, (0,73), (225,163), (245,66,230), -1)
47    cv2.putText(image, 'STATE', (15,110), 
48                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,0), 1, cv2.LINE_AA)
49    cv2.putText(image, state.upper(), 
50                (10,140), 
51                cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 2, cv2.LINE_AA)
52    
53    return image, pushup_count, state
54
55def calculate_angle(a, b, c):
56    a = np.array(a) # 第一个点
57    b = np.array(b) # 中间点
58    c = np.array(c) # 第三个点
59    
60    radians = np.arctan2(c[1]-b[1], c[0]-b[0]) - np.arctan2(a[1]-b[1], a[0]-b[0])
61    angle = np.abs(radians*180.0/np.pi)
62    
63    if angle > 180.0:
64        angle = 360-angle
65        
66    return angle

4. 主函数

1def main():
2    cap = cv2.VideoCapture(0)  # 打开默认摄像头
3    pushup_count = 0
4    state = ""
5
6    while cap.isOpened():
7        ret, frame = cap.read()
8        
9        if not ret:
10            break
11        
12        image, pushup_count, state = detect_pose_and_count_pushups(frame, pushup_count, state)
13        
14        # 显示结果
15        cv2.imshow('Pushup Counter', image)
16        
17        if cv2.waitKey(10) & 0xFF == ord('q'):
18            break
19
20    # 清理
21    cap.release()
22    cv2.destroyAllWindows()
23    pose.close()
24
25if __name__ == "__main__":
26    main()

这段代码将打开摄像头并实时检测用户的姿态,计算俯卧撑的次数。请注意,简化版的示例,实际应用中可能需要更多的调试和优化来提高精度和稳定性。

标签:Mediapipe,angle,image,pose,cv2,mp,3D,姿态,OpenPose
From: https://blog.csdn.net/2401_83580557/article/details/141448499

相关文章

  • CodeForces - 1353D Constructing the Array
    CodeForces-1353D这道题也可能比较简单,主要是要想到优先队列要怎么使用,这一点如果用递归会写不了但是因为对优先队列不太熟悉,只有被提示可以用优先队列才想到要怎么用,还是很重要的STL注意运算符的重构应该反着来写其他的思维很朴素,运算符的重构就是,先比较长度,优先用长度长......
  • Open3D mesh 裁剪
    目录一、概述1.1常用裁剪方法1.2应用场景二、代码实现2.1 轴对齐包围盒(AABB)裁剪2.2有向包围盒(OBB)裁剪2.3 平面裁剪Open3D点云算法汇总及实战案例汇总的目录地址:Open3D点云算法与点云深度学习案例汇总(长期更新)-CSDN博客一、概述        在三......
  • Open3D 计算点云的面状指数
    目录一、概述1.1原理1.2实现步骤步骤1:确定邻域点步骤2:计算协方差矩阵步骤3:特征值分解步骤4:计算面状指数步骤5:可视化与应用1.3应用领域二、代码实现2.1关键函数2.2完整代码三、实现效果3.1原始点云3.2面状指数可视化Open3D点云算法汇总及实战案例汇总的......
  • 《黑神话:悟空》游戏崩溃提示“缺少X3DAudio1_7.dll”文件该怎么解决?黑神话悟空游戏闪
    若《黑神话:悟空》崩溃提示缺“X3DAudio1_7.dll”,可更新DirectX,下载安装程序按指示操作后重启;也可运行系统文件检查工具;还可使用DLL修复工具。若仍不行,可寻求专业支持,操作前记得备份重要数据。本篇将为大家带来的内容,感兴趣的小伙伴们一起来看看吧,希望能够帮助到大家。本篇将为......
  • Adobe Substance 3D Sampler v4.2.2 下载及安装教程(3D材质管理软件)
    前言Substance3DSampler简称“Sa”是一款由Adobe新推出的3D真实材质贴图制作软件。允许用户通过调整和混合现有材料,或通过扫描(单个或多个图像)中提取新材料来创建和迭代材料集合,从而轻松将真实的图片转换为具有真实感的表面或HDR环境,为用户创作出更为丰富的材质贴图。一、下载......
  • echarts 3D 柱状图
    今天开发一个驾驶舱大屏,里面有柱状图的图表,而且是3D的,搜索可视化社区,有找到一个示例【https://www.makeapie.cn/echarts_content/xH0E6KFMcG.html】,纵向的柱子,但我开发的大屏,柱状图有横向、纵向两种,所以在此记录一下,便于下一次开发。注意:示例中是直接把echarts挂在了window上,作为......
  • 探索风扇产品模型的3D可视化魅力
    在这个科技日新月异的时代,每一个细微的创新都能为我们的生活带来前所未有的便捷与享受。今天,就让我们一起踏入一场视觉与科技的盛宴,探索风扇产品模型如何通过3D可视化技术,重新定义家居生活的舒适与美学。 想象一下,在炎炎夏日,你无需亲临实体店,只需轻点鼠标或滑动指尖,就能全方位......
  • 企业市值排名3D可视化,重塑商业版图新维度
    在这个数据驱动的时代,每一个数字背后都蕴藏着无限的可能与机遇。企业市值,作为衡量企业综合实力与市场认可度的关键指标,其动态变化不仅是投资者关注的焦点,也是全球商业竞争格局的晴雨表。 当枯燥的数据表格被转化为生动的3D场景,全球数千家企业的市值排名不再只是冷冰冰的数字列......
  • 前端3d动画-----平移 transform: translate3d()
     必须加这个属性:transform-style:preserve-3d;  perspective:900px; 设置了景深才能感到近大远小的感觉       <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible&quo......
  • 未来购物新境界:商品样机3D展示可视化引领潮流
    在这个日新月异的数字时代,科技的每一次飞跃都在深刻改变着我们的生活方式,尤其是购物体验。从传统的实体店选购到线上商城的便捷浏览,再到如今商品样机3D展示可视化的兴起,消费者正逐步踏入一个前所未有的沉浸式购物新时代。 想象一下,无需亲临现场,只需轻点鼠标或滑动屏幕,就能360度......