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

news2024/12/28 15:45:22

随着计算机视觉技术的发展,人体姿态估计在虚拟现实、运动分析、人机交互等领域得到了广泛应用。传统的姿态估计方法通常依赖于深度学习模型,需要大量的计算资源。而 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. 结果显示:在视频帧上显示姿态分类的结果。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2064003.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

78、 ansible----playbook

一、ansible模块 11、防火墙和网络模块&#xff1a; [roottest1 ~]# ansible 192.168.168.23 -m iptables -a chainINPUT protocolICMP source192.168.168.22 jumpREJECT -b ##-b后台&#xff0c;拒绝[roottest3 ~]# yum -y install nginx[roottest3 ~]# systemctl restart …

论文合集下载丨第十九届全国人机语音通讯学术会议

2024年8月15日至18日&#xff0c;第十九届全国人机语音通讯学术会议&#xff08;NCMMSC&#xff09;暨CCF语音对话与听觉专委会2024年学术年会在新疆乌鲁木齐成功召开。 会议论文集下载方式在文末 &#x1f447; 全国人机语音通讯学术会议作为语音技术领域内的专家、学者及科研…

为什么需要文献综述模板和创建文献综述技巧

为什么需要文献综述模板&#xff1f; 文献综述模板可以作为特定主题的指南。如果您的时间有限&#xff0c;无法进行更多研究&#xff0c;文献综述大纲示例可以为您提供帮助&#xff0c;因为它可以为您提供您打算研究的内容的概述。 甚至各个领域的专业人士也依赖文学评论来了解…

易灵思FPGA-Trion的MIPI设置使用

一、MIPI简介&#xff1f; 不需要各种资料上一大堆对物理层MIPI传输协议的讲解&#xff0c;实话说&#xff0c;我也不是特别能吃透其中的时序&#xff0c;所以不多研究&#xff1b;所有的FGPA如果带MIPI &#xff0c;那就只研究控制器就行了 &#xff0c;没必要舍近求远 二、硬…

NVM安装管理node.js版本(简单易懂)

一、前言 1.1 简介 NVM&#xff08;Node Version Manager&#xff09;是 node.js 的版本管理器&#xff0c;用 shell 脚本切换机器中不同版本的 nodejs。 Nodejs为什么需要多个版本&#xff1f; 有经验的开发者可能遇到过&#xff0c;某个依赖包明确nodejs是某个版本&#…

深度学习--RNN以及RNN的延伸

循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类能够处理序列数据的神经网络&#xff0c;在自然语言处理、时间序列分析等任务中得到了广泛应用。RNN能够通过其内部的循环结构&#xff0c;捕捉到序列中前后项之间的关系。下面我将从原理、作用、应用…

【AI绘画】Midjourney提示词详解:精细化技巧与高效实践指南

文章目录 &#x1f4af;Midjourney提示词基础结构1 图片链接1.1 上传流程 2 文字描述3 后置参数 &#x1f4af;Midjourney提示词的文字描述结构全面剖析1 主体主体细节描述2 环境背景2.1 环境2.2 光线2.3 色彩2.4 氛围 3 视角4 景别构图5 艺术风格6 图片制作方法7 作品质量万能…

振动分析-20-振动三要素的理解及决定设备分析水平的因素

1 对频谱分析的定位 一般咨询一个振动问题,很多人往往是要求把各种频谱贴上来看看,却很少有人问,振动过程、检修经历、设备结构、振动位置、振动方向、负荷关系、油温变化、转速影响等等。 刚刚接触振动检测时,对有关频谱分析方面资料如饥似渴,对于早期从事振动诊断的朋…

CentOS 7使用RPM安装MySQL

MySQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;允许用户高效地存储、管理和检索数据。它被广泛用于各种应用&#xff0c;从小型的web应用到大型企业解决方案。 MySQL提供了丰富的功能&#xff0c;包括支持多个存储引擎、事务能力、数据完整性…

Google Earth Engine(GEE)——计算非监督分类的中的面积和占比

函数: aggregate_sum(property) Aggregates over a given property of the objects in a collection, calculating the sum of the values of the selected property. 对一个集合中的对象的特定属性进行聚合,计算所选属性值的总和。 Arguments: this:collection (Featur…

嵌入式初学-C语言-二九

C语言编译步骤 预处理编译汇编链接 什么是预处理 预处理就是在源文件&#xff08;如.c文件&#xff09;编译之前&#xff0c;所进行的一部分预备操作&#xff0c;这部分操作是由预处理程序自动完成&#xff0c;当源文件在编译时&#xff0c;编译器会自动调用预处理指令的解析…

2024年大厂裁员严重,软件测试行业真的饱和了吗?

这短时间以来后台有很多小伙伴说找工作难&#xff0c;并且说软件测试行业饱和了&#xff1f;竟然登上了热榜 那么我今天带大家看看真实的市场行情&#xff0c;往下看 这个是公司联合某厂的HR招聘真实情况&#xff0c;很明显【软件测试】投简历竟然高达9999沟通才1千多&#xf…

【学术会议征稿】第七届土木建筑、水电与工程管理国际学术会议(CAHEM 2024)

第七届土木建筑、水电与工程管理国际学术会议&#xff08;CAHEM 2024&#xff09; 2024 7th International Conference on Civil Architecture, Hydropower and Engineering Management (CAHEM 2024) 第七届土木建筑、水电与工程管理国际学术会议&#xff08;CAHEM 2024&…

【蓝桥杯冲刺省一,省一看这些就够了-C++版本】蓝桥杯STL模板及相关练习题

蓝桥杯历年省赛真题 点击链接免费加入题单 STL map及其函数 map<key,value> 提供一对一的数据处理能力&#xff0c;由于这个特性&#xff0c;它完成有可能在我们处理一对一数据的时候&#xff0c;在编程上提供快速通道。map 中的第一个值称为关键字(key)&#xff0c;…

河南萌新联赛2024第(六)场:郑州大学(ABCDFGHIL)

文章目录 写在前面A 装备二选一&#xff08;一&#xff09;思路code B 百变吗喽思路code C 16进制世界思路code D 四散而逃思路code F 追寻光的方向思路code G 等公交车思路code H 24点思路code I 正义从不打背身思路code L koala的程序思路code 河南萌新联赛2024第&#xff08…

Transformer总结(二):架构介绍(从seq2seq谈到Transformer架构)

文章目录 一、seq2seq应用介绍二、编码器解码器架构2.1 流程介绍2.2 原理说明 三、Transformer整体结构和处理流程3.1 Attention机制在seq2seq中的引入3.2 比较RNN与自注意力3.3 Transformer架构介绍3.4 处理流程3.4.1 编码器中处理流程3.4.2 解码器在训练阶段和预测阶段的差异…

Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明

系统要求 支持x64_64架构、aarch64架构&#xff08;需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9&#xff09;。 功能支持 Linux平台x64_64架构|aarch64架构RTMP直播推送SDK 音频编码&a…

UDP服务端、TCP的c/s模式

一、UDP服务端 socket bind //绑定 recvfrom ssize_t recvfrom(int sockfd, socket的fd void *buf, 保存数据的一块空间的地址 …

网络编程TCP与UDP

TCP与UDP UDP头&#xff1a; 包括源端口、目的地端口、用户数据包长度&#xff0c;检验和 数据。 typedef struct _UDP_HEADER {unsigned short m_usSourPort;    // 源端口号16bitunsigned short m_usDestPort;    // 目的端口号16bitunsigned short m_usLen…

一款B to B Connector的仿真结果与开发样品实测的结果对比

下面是一款B to B 连接器开发初期的CST仿真结果: 回波损耗 插入损耗 时域阻抗 开发样品出来后第三方测试机构的实测结果