mediapipe 实现动作识别

这篇具有很好参考价值的文章主要介绍了mediapipe 实现动作识别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

环境

  • windows 10 64bit

  • mediapipe 0.8.10.1

前言

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

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

mediapipe 实现动作识别

代码实践

首先,需要安装 mediapipe

pip install -U mediapipe

接着,来看代码,部分加了注释文章来源地址https://www.toymoban.com/news/detail-514865.html

import cv2
import mediapipe as mp
import numpy as np


def 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 - angle

    return angle


def calculate_dist(a, b):
    '''
    计算欧式距离
    :param a:
    :param b:
    :return:
    '''

    a = np.array(a)
    b = np.array(b)
    dist = np.linalg.norm(a - b)
    return dist


if __name__ == '__main__':

    mp_drawing = mp.solutions.drawing_utils
    mp_pose = mp.solutions.pose

    cap = 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 = 0
    stage = None

    with 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 = True
            image = 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 += 1
                    if counter > 1:
                        stage = 'walking'
                else:
                    stage = 'standing'
                    counter = 0
            except:
                pass

            cv2.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()

到了这里,关于mediapipe 实现动作识别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python姿态检测实现多人多姿态识别python行为识别openpose行为骨骼框架检测动作识别动作检测行为动作分类

    https://download.csdn.net/download/babyai996/88741189 https://download.csdn.net/download/babyai996/88741257  https://download.csdn.net/download/babyai996/88741262  https://download.csdn.net/download/babyai996/88741266  https://download.csdn.net/download/babyai996/88741272  https://download.csdn.net/download/babyai996/88741274  视频演示: python行为

    2023年04月20日
    浏览(35)
  • 使用OpenCV和MediaPipe实现姿态识别!

    大家好,我是小F~ MediaPipe是一款由Google开发并开源的数据流处理机器学习应用开发框架。 它是一个基于图的数据处理管线,用于构建使用了多种形式的数据源,如视频、音频、传感器数据以及任何时间序列数据。 MediaPipe通过将各个感知模型抽象为模块并将其连接到可维护的

    2024年02月11日
    浏览(32)
  • 基于python+opencv+mediapipe实现手势识别详细讲解

    目录 运行环境: 一、opencv 二、meidapipe配置 三、实现手部的识别并标注 1、参数分析 1.multi_hand_landmarks  2.multi_hand_world_landmarks 3.multi_handedness 2.绘制信息点和连线 python3.9.7  opencv-python4.6.0.66  mediapipe0.8.11 运行之前先要安装opencv-python、opencv-contrib-python、mediapipe 项目可能对版本的

    2024年01月25日
    浏览(35)
  • 使用MediaPipe和OpenCV的Python实现手势识别

    手势识别技术是一种非常有用的技术,它可以将人类的手势转化为计算机可以理解的形式,从而实现更加自然、快速和直观的交互方式。本文将介绍一种基于MediaPipe和OpenCV的手势识别技术,可以实现对手势的实时识别和分析。 MediaPipe是一种开源的机器学习框架,可以用于构建

    2024年02月14日
    浏览(37)
  • MediaPipe+OpenCV 实现实时手势识别(附Python源码)

    MediaPipe官网:https://developers.google.com/mediapipe MediaPipe仓库:https://github.com/google/mediapipe MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架,用于构建视觉和感知应用程序。它提供了一系列预训练的机器学习模型和工具,使开发者能够轻松地构建基于计算机视觉和机器学习的

    2024年02月07日
    浏览(34)
  • Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js

    Node Sass could not find a binding for your current environment: Windows 64-bit with Node.js  出现这个原因是因为 Node 版本与node-sass版本不匹配导致,由于node版本的升级,原来项目中的node-sass版本过低。 可以 win + R  输入cmd 回车  查看当前node版本 查看项目中Node-sass的版本 查看node与node-sass版本

    2024年02月15日
    浏览(35)
  • qt中使用QGIS实现二次开发导入shp格式地图(MSVC2019_64bit+qt5.15+qgis)

    在qt开发过程中可能要导入自定义格式的图层地图,那么可以把这些数据导入qgis然后导出为shp格式文件,然后下载qgis源码,在qt项目中配置环境变量导入qgis有关的头文件,然后再引入shp数据格式的地图。 QGIS安装 QGIS安装 QGIS导入数据 然后保存点击Layer-save as导出为shp格式文件

    2024年02月05日
    浏览(40)
  • Photoshop Elements2023(64bit)

    Photoshop Elements2023 链接:https://pan.baidu.com/s/1Gvra_dIgVF16jI4w428BDw  提取码:8888    Adobe Photoshop Elements是Adobe公司是继Photoshop之后全新推出的图像编辑、照片修饰和 Web 图形解决方案。它界面友好,易于使用,功能强大。 1,具有简单而快捷的操作方式、直观的效果预览、图像智能

    2024年02月08日
    浏览(29)
  • 基于mediapipe的姿态识别和简单行为识别

    源码地址: 🚀🚀🚀🚀 其实这部分很简单,直接在windows命令行的环境下 就可以啦 Mediapipe是一个用于构建机器学习管道的框架,用户处理视频、音频等时间序列数据。这个跨平台框架适用于桌面/服务器、Android、ios和各类嵌入式设备。 目前mediapipe包含16个solutions,分别为 总

    2024年02月02日
    浏览(36)
  • Opencv + MediaPipe -> 手势识别

    一、概述         OpenCV(Open Source Computer Vision Library)是一个跨平台的计算机视觉库,它提供了许多用于图像和视频处理的功能,包括图像和视频的读取、预处理、特征提取、特征匹配、目标检测等。OpenCV是C++编写的,也提供了Python、Java等语言的接口,可以方便地在不同

    2024年02月05日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包