mediapipe 实现动作识别

article/2025/10/16 6:16:59

环境

  • windows 10 64bit

  • mediapipe 0.8.10.1

前言

本文使用 google 家的 mediapipe 机器学习框架,结合 opencvnumpy,实现了一个实时识别 站立坐下走动挥手 共4个动作的简单系统。

mediapipe 能做的事情非常多,感兴趣的童鞋可以去研究研究。

b461a3f1c14003a739efa9abf3656c75.png

代码实践

首先,需要安装 mediapipe

pip install -U mediapipe

接着,来看代码,部分加了注释

import cv2
import mediapipe as mp
import numpy as npdef calculate_angle(a, b, c):'''计算角度:param a::param b::param c::return:'''a = np.array(a)b = np.array(b)c = np.array(c)radians = np.arctan2(c[1] - b[1], c[0] - b[0]) - np.arctan2(a[1] - b[1], a[0] - b[0])angle = np.abs(radians * 180.0 / np.pi)if angle > 180.0:angle = 360 - anglereturn angledef calculate_dist(a, b):'''计算欧式距离:param a::param b::return:'''a = np.array(a)b = np.array(b)dist = np.linalg.norm(a - b)return distif __name__ == '__main__':mp_drawing = mp.solutions.drawing_utilsmp_pose = mp.solutions.posecap = cv2.VideoCapture('liuruoying.mp4')# 分辨率frame_width = int(cap.get(3))frame_height = int(cap.get(4))# 保存结果视频out = cv2.VideoWriter("result.mp4", cv2.VideoWriter_fourcc(*'mp4v'), 30, (frame_width, frame_height))counter = 0stage = Nonewith mp_pose.Pose(min_detection_confidence=0.3, min_tracking_confidence=0.8) as pose:while cap.isOpened():ret, frame = cap.read()if not ret:break# 转换下颜色空间image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 这里设置为不可写image.flags.writeable = False# 检测results = pose.process(image)# 这里设置为可写,颜色也转换回去image.flags.writeable = Trueimage = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)# 提取关键点try:landmarks = results.pose_landmarks.landmark# 获取相应关键点的坐标lshoulder = [landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value].y]lelbow = [landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].x,landmarks[mp_pose.PoseLandmark.LEFT_ELBOW.value].y]lwrist = [landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].x,landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value].y]lhip = [landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].x,landmarks[mp_pose.PoseLandmark.LEFT_HIP.value].y]lankle = [landmarks[mp_pose.PoseLandmark.LEFT_ANKLE.value].x,landmarks[mp_pose.PoseLandmark.LEFT_ANKLE.value].y]lknee = [landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].x,landmarks[mp_pose.PoseLandmark.LEFT_KNEE.value].y]rshoulder = [landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value].y]relbow = [landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_ELBOW.value].y]rwrist = [landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value].y]rhip = [landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_HIP.value].y]rankle = [landmarks[mp_pose.PoseLandmark.RIGHT_ANKLE.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_ANKLE.value].y]rknee = [landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value].x,landmarks[mp_pose.PoseLandmark.RIGHT_KNEE.value].y]# 计算角度langle = calculate_angle(lshoulder, lelbow, lwrist)rangle = calculate_angle(rshoulder, relbow, rwrist)lsangle = calculate_angle(lhip, lshoulder, lelbow)rsangle = calculate_angle(rhip, rshoulder, relbow)ankdist = calculate_dist(lankle, rankle)rwdist = calculate_dist(rhip, rwrist)lwdist = calculate_dist(lhip, lwrist)rhangle = calculate_angle(rshoulder, rhip, rknee)lhangle = calculate_angle(lshoulder, lhip, lknee)rkangle = calculate_angle(rankle, rknee, rhip)lkangle = calculate_angle(lankle, lknee, lhip)# 这块是具体的业务逻辑,各个数值,可根据自己实际情况适当调整if ((rhangle > 80 and lhangle > 80) and (rhangle < 110 and lhangle < 110) and (lkangle < 100 and rkangle < 100)):stage = 'sitting'elif (langle < 160 and langle > 40) or (rangle < 160 and rangle > 40):if ((lsangle > 20 or rsangle > 20) and (lwdist > 0.3 or rwdist > 0.3)):stage = "wave"elif ((ankdist > 0.084) and (langle > 150) and (rangle > 150)):counter += 1if counter > 1:stage = 'walking'else:stage = 'standing'counter = 0except:passcv2.rectangle(image, (0, 0), (225, 73), (245, 117, 16), -1)cv2.putText(image, 'STAGE', (65, 12), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1, cv2.LINE_AA)cv2.putText(image, stage, (60, 60), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), 2, cv2.LINE_AA)# 画骨骼关键点mp_drawing.draw_landmarks(image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS,mp_drawing.DrawingSpec(color=(245, 117, 66), thickness=2, circle_radius=2),mp_drawing.DrawingSpec(color=(245, 66, 230), thickness=2, circle_radius=2))# 显示结果帧cv2.imshow('mediapipe demo', image)# 保存结果帧out.write(image)# 按q退出if cv2.waitKey(10) & 0xFF == ord('q'):break# 资源释放cap.release()cv2.destroyAllWindows()

http://chatgpt.dhexx.cn/article/K75DxkgF.shtml

相关文章

行为动作识别

一、跌倒检测数据集 随着计算机学科与人工智能的发展和应用&#xff0c;视频分析技术迅速兴起并得到了广泛关注。视频分析中的一个核心就是人体行为识别&#xff0c;行为识别的准确性和快速性将直接影响视频分析系统后续工作的结果。因此&#xff0c;如何提高视频中人体行为识别…

基于骨骼的动作识别:PoseConv3D

Revisiting Skeleton-based Action Recognition解读 摘要1. 简介2. Related Work2.1 基于3D-CNN的rgb视频动作识别2.2 基于GCN的骨骼动作识别2.3 基于CNN的骨骼动作识别 3. Framework3.1 Pose Extraction3.2 From 2D Poses to 3D Heatmap Volumes3.3 基于骨骼的动作识别3D-CNN3…

视频动作识别调研(Action Recognition)

视频动作识别调研&#xff08;Action Recognition&#xff09; 本文首发于微信公众号“ StrongerTang”&#xff0c;可打开微信搜一搜&#xff0c;或扫描文末二维码&#xff0c;关注查看更多文章。 原文链接&#xff1a;( https://mp.weixin.qq.com/s?__bizMzg3NDEzOTAzMw&…

动作识别概况

文章目录 一、动作识别二、动作识别的难点三、动作识别现在常用的方法四、行为识别的两个方向五、常用数据集六、常用框架介绍 一、动作识别 主要目标是判断一段视频中人的行为的类别&#xff0c;所以也可以叫做 Human Action Recognition。 二、动作识别的难点 1.类内和类之…

动作/行为识别调研

动作识别调研 1. 简介1.1 基本概念1.2 难点 2. 人体动作识别系统2.1 传统方法2.1.1 iDT框架 2.2 深度学习方法2.2.1 Two-Stream双流架构2.2.2 3D卷积架构2.2.3 CNNLSTM架构2.2.4 GCN架构 相关文献 1. 简介 动作识别(Action Recognition)&#xff0c;就是从视频片段&#xff08…

2022广州大学计算机网络实验--使用网络协议分析器捕捉和分析协议数据包

广州大学学生实验报告 开课学院及实验室&#xff1a;计算机科学与工程实验室 2022年**月**日 学院 计算机科学与教育软件 年级、专业、班 ****** 姓名 **** 学号 *******39 实验课程名称 计算机网络实验 成绩 实验项目名称 使用网络协议分析器…

五个好用的网络协议分析工具(附下载地址)

Network Packet Analyzer&#xff0c;是一种网络分析程序&#xff0c;可以帮助网络管理员捕获、交互式浏览网络中传输的数据包和分析数据包信息等。这里给出了5个最好的网络数据包分析工具&#xff0c;具体如下&#xff1a; 1. Wireshark 相信大家都很熟悉&#xff0c;就不多…

网络协议安全分析

网络安全层次结构 物理层 在通信线路上保障不被搭线&#xff0c;不被偷听&#xff0c;尽可能检测出来。 数据链路层 a.点对点的链路上可以采用通信保密机进行加解密。 b.由第层硬件完成&#xff0c;对上层透明。 c.缺陷&#xff1a;无法适应多个路由器的网络&#xff0c;尤其I…

各网络协议分析

IP ip头 ![Image][IPstr] Wireshark ![Image][IPstr2] 名称值含义可选值占位IP版本0100IPV40110:IPV64bit头部长度010120bytes(5)可表示的最大值为1111(60bytes(15))4bit服务类型0x00默认转发(DF)8bit总长度52首部和数据之和最大为2^16-165535字节16bit标识0x239d它是一个…

网络协议分析(结合版)

初识协议 1.什么是协议&#xff1f; 数据从源地点传输到目的地点&#xff0c;网络上所有设备需要“讲”相同的“语言”。 描述网络通信中如何规范使用“语言” 的一组规则就是协议。 2.数据通信协议: 决定数据的格式和数据的传输的一组规则或者一组惯例 协议分层 ARP协议 …

计算机网络--使用网络协议分析器捕捉和分析协议数据包

实验目的 &#xff08;1&#xff09;、 熟悉ethereal的使用 &#xff08;2&#xff09;、 验证各种协议数据包格式 &#xff08;3&#xff09;、 学会捕捉并分析各种数据包。 实验环境 Window 10&#xff0c;ethereal&#xff0c;winpcap 实验内容 &#xff08;1&#xff…

网络协议分析-TCP协议分析

目录 一 . TCP协议的应用二 . TCP包结构三 . 实例化 一 . TCP协议的应用 二 . TCP包结构 源端口号&#xff08; 16 位&#xff09;&#xff1a;它&#xff08;连同源主机 IP 地址&#xff09;标识源主机的一个应用进程。 目的端口号&#xff08; 16 位&#xff09;&#xff1a…

计算机网络 实验三 使用网络协议分析器捕捉和分析协议数据包

学院 计算机学院 年级、专业、班 软件工程 姓名 涂山 学号 170****** 实验课程名称 计算机网络实验 成绩 实验项目名称 使用网络协议分析器捕捉和分析协议数据包 指导老师 &#xff08;1&#xff09;实验目的…

实例:使用网络分析仪进行电缆测试

本应用测试针对非标称50Ω的线缆&#xff0c;包括同轴、双绞线、差分高速数据线的测试&#xff0c;包括阻抗参数、S参数&#xff08;插损、驻波、Smith图等等&#xff09;&#xff0c;也可以绘制眼图。 根据电缆的性能&#xff0c;如频率范围、长度、是否差分&#xff0c;设置…

协议数据分析

实验目的 了解协议分析仪的使用方法和基本特点。 增强对网络协议的理解。 实验要求 要求在进行协议数据分析后&#xff0c;能够将网络数据与具体的网络操作相互映证&#xff0c;如实的记录实验结果&#xff0c;完成实验 实验环境 1&#xff0e;一台运行Windows 2000的计…

五个好用的网络协议分析工具

Network Packet Analyzer&#xff0c;是一种网络分析程序&#xff0c;可以帮助网络管理员捕获、交互式浏览网络中传输的数据包和分析数据包信息等。这里给出了5个最好的网络数据包分析工具&#xff0c;具体如下&#xff1a; 1. Wireshark 相信大家都很熟悉&#xff0c;就不多介…

【计算机网络】IP协议分析

实验目的 应用所学知识&#xff1a; ①熟悉IP报文格式以及关键字段含义。 ②掌握IP地址的分配方法。 ③理解路由器转发IP数据报的流程。 实验步骤与结果 1.任务一&#xff1a;观察路由表 打开Router0命令行输入指令查看路由表&#xff1a; Router0存在三条直接路由&#xf…

网络协议分析总结

网络协议分析 ARP协议协议格式工作原理 TCP/IP协议簇的层次及OSI/RM模型的网络层次及各层的主要作用及各层的主要协议TCP/IP协议簇的层次物理层&#xff1a;数据链路层网络层传输层应用层 OSI七层参考模型ISO/OSI参考模型与TCP/IP协议模型中各层的对应关系 面向连接、无连接的最…

计算机网络实验三:使用网络协议分析器捕捉和分析协议数据包

一、实验目的 (1) 熟悉 ethereal 的使用 (2) 验证各种协议数据包格式 (3) 学会捕捉并分析各种数据包。 二、使用仪器、器材 Wireshark软件&#xff0c;window10系统计算机 三、实验内容及原理 &#xff08;1&#xff09; 安装 ethereal 软件 &#xff08;2&#xff09; 捕捉…

计算机网络-实验三:使用网络协议分析器捕捉和分析协议数据包

一、实验目的 (1) 熟悉ethereal的使用 (2) 验证各种协议数据包格式 (3) 学会捕捉并分析各种数据包。 二、实验环境 安装了TCP/IP协议的Windows系统&#xff0c;包含实用的网络工具。 三、实验内容 &#xff08;1&#xff09; 安装ethereal软件 &#xff08;2&#xff09; 捕捉数…