基于Python的mediapipe和opencv的人体骨骼、人体姿态关键点的实时跟踪项目

随着计算机视觉技术的发展,人体姿态估计在虚拟现实、运动分析、人机交互等领域得到了广泛应用。传统的姿态估计方法通常依赖于深度学习模型,需要大量的计算资源。而 Google 开发的 MediaPipe 框架则提供了高效且易于使用的解决方案,它可以在各种设备上运行实时的多模态应用。

项目目标

本项目旨在利用 MediaPipe 和 OpenCV 实现对人体姿态关键点的实时检测和跟踪,并通过可视化这些关键点来帮助用户更好地理解人体姿态的变化。

技术栈
  • Python:主流编程语言,适合快速开发。
  • MediaPipe:Google 提供的跨平台、可扩展的框架,用于构建多模态应用。
  • OpenCV:强大的计算机视觉库,用于图像处理和视频流管理。
预期成果
  • 实时视频流处理:从摄像头或文件读取视频流,并对其进行实时处理。
  • 人体姿态检测:准确地识别并追踪人体的关键部位。
  • 关键点可视化:在视频帧中标记出人体各部位的位置。
  • 姿态分析:根据关键点位置进行初步的姿态分析(例如站立、行走等)。

示例代码

以下是一个简单的代码示例,演示如何使用 MediaPipe 和 OpenCV 实现上述功能:

复制代码
import cv2
2import mediapipe as mp
3import numpy as np
4
5# 初始化 MediaPipe 的 Pose 模块
6mp_drawing = mp.solutions.drawing_utils
7mp_pose = mp.solutions.pose
8
9# 初始化摄像头
10cap = cv2.VideoCapture(0)  # 0 表示默认摄像头
11
12# 定义姿态分类器
13class PoseClassifier:
14    def __init__(self):
15        self.threshold = 0.9
16
17    def classify(self, landmarks):
18        # 检查是否所有关键点都被检测到
19        if not all([landmark.visibility > self.threshold for landmark in landmarks]):
20            return 'Unknown'
21
22        # 计算肩膀和臀部之间的向量
23        shoulder_left = landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER]
24        shoulder_right = landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER]
25        hip_left = landmarks[mp_pose.PoseLandmark.LEFT_HIP]
26        hip_right = landmarks[mp_pose.PoseLandmark.RIGHT_HIP]
27
28        # 肩膀的平均位置
29        shoulder_pos = (shoulder_left.position + shoulder_right.position) / 2
30        # 臀部的平均位置
31        hip_pos = (hip_left.position + hip_right.position) / 2
32
33        # 计算肩膀到臀部的向量
34        vector_shoulder_to_hip = np.array([hip_pos.x - shoulder_pos.x, hip_pos.y - shoulder_pos.y])
35
36        # 姿态分类逻辑
37        if abs(vector_shoulder_to_hip[1]) < 0.05:
38            return 'Standing'
39        elif vector_shoulder_to_hip[1] > 0.1:
40            return 'Sitting'
41        else:
42            return 'Unknown'
43
44# 创建姿态分类器实例
45classifier = PoseClassifier()
46
47with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose:
48    while cap.isOpened():
49        success, image = cap.read()
50        if not success:
51            print("无法获取视频帧")
52            continue
53
54        # 将 BGR 图像转换为 RGB
55        image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
56
57        # 进行姿态检测
58        results = pose.process(image_rgb)
59
60        # 绘制姿态关键点
61        if results.pose_landmarks:
62            mp_drawing.draw_landmarks(
63                image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,
64                mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2, circle_radius=2),
65                mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2))
66
67            # 获取姿态关键点
68            landmarks = results.pose_landmarks.landmark
69
70            # 获取姿态分类
71            pose_class = classifier.classify(landmarks)
72            cv2.putText(image, f'Pose: {pose_class}', (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)
73
74        # 显示结果
75        cv2.imshow('MediaPipe Pose', image)
76
77        if cv2.waitKey(5) & 0xFF == 27:  # 按下 Esc 键退出
78            break
79
80# 释放资源
81cap.release()
82cv2.destroyAllWindows()

代码解释

  1. PoseClassifier 类:定义了一个简单的姿态分类器,用于判断用户是在站立还是坐着。这只是一个非常基础的分类逻辑,可以根据需要进一步扩展和优化。
  2. 姿态检测 :使用 results.pose_landmarks 来获取姿态关键点。
  3. 关键点绘制 :使用 mp_drawing.draw_landmarks 来绘制关键点及其连接。
  4. 姿态分类:根据关键点的位置来判断用户的姿态。
  5. 结果显示:在视频帧上显示姿态分类的结果。

内含完整代码与超级详细注解和报告:

相关推荐
只怕自己不够好42 分钟前
OpenCV 图像运算全解析:加法、位运算(与、异或)在图像处理中的奇妙应用
图像处理·人工智能·opencv
华清远见IT开放实验室2 小时前
【每天学点AI】实战图像增强技术在人工智能图像处理中的应用
图像处理·人工智能·python·opencv·计算机视觉
只怕自己不够好3 小时前
《OpenCV 图像缩放、翻转与变换全攻略:从基础操作到高级应用实战》
人工智能·opencv·计算机视觉
安静读书8 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频
小陈phd8 小时前
OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算
人工智能·opencv·计算机视觉
如若12313 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
lsjweiyi16 小时前
极简AI工具箱网站开源啦!
opencv·开源·微信支付·支付宝支付·百度ai·极简ai工具箱·ai图像处理
Jack黄从零学c++20 小时前
opencv(c++)---自带的卷积运算filter2D以及应用
c++·人工智能·opencv
饭碗、碗碗香1 天前
OpenCV笔记:图像去噪对比
人工智能·笔记·opencv·计算机视觉
是Dream呀2 天前
Python从0到100(七十三):Python OpenCV-OpenCV实现手势虚拟拖拽
开发语言·python·opencv