Mediapipe三维实时人体关键点检测与追踪(一)

本文涉及的产品
视觉智能开放平台,视频资源包5000点
视觉智能开放平台,图像资源包5000点
视觉智能开放平台,分割抠图1万点
简介: Mediapipe三维实时人体关键点检测与追踪(一)

1.Mediapipe简介


Google出了一个开源的、跨平台的、可定制化的机器学习解决方案工具包,给在线流媒体(当然也可以用于普通的视频、图像等)提供了机器学习解决方案。感兴趣的同学可以打开这个网址了解详情:

https://mediapipe.dev/

它提供了手势、人体姿势、人脸、物品等识别和追踪功能,并提供了C++、Python、JavaScript等编程语言的工具包以及iOS、Android平台的解决方案。

在python环境下,只需要安装三个包:


pip install mediapipe
pip install numpy 
pip opencv-python


至于python版本,建议使用python3.8以上的版本

我的mac电脑版本:


mediapipe==0.8.6
numpy==1.19.5
opencv-python==4.5.3.5


在看代码之前我们首先要知道我们人体的姿态对应到这个模块下的信息。

dc35d9f38b214af6bca0e3daaca78121.png从上图可以看到mediapipe姿态检测模块,将我们人体各部位,拆分成32个点,我们只要在模型中输出指定点的数据,就能获取到对应该点的人体部位。

我们在做姿态判断姿态是什么动作的时候,通常是判断角度:

5ccf84f4b5e9428ca3e97b06c6c69adf.png


具体动作识别判断,通常是采集不同动作下的图片,然后通过姿态检测,根据角度,对图片进行标注,将大量图片作为训练集。最后完成这个姿态行为识别判断。


2.Mediapipe姿态检测器


我们先定义一个姿态检测器类,里面包含获取姿态检测,获取姿态数据,获取姿态3个点p1-p2-p3角度


import cv2
import mediapipe as mp
import math
class PoseDetector():
    '''
    人体姿势检测类
    '''
        def __init__(self,
                 static_image_mode=False,
                 upper_body_only=False,
                 smooth_landmarks=True,
                 min_detection_confidence=0.5,
                 min_tracking_confidence=0.5):
        '''
        初始化
        :param static_image_mode: 是否是静态图片,默认为否
        :param upper_body_only: 是否是上半身,默认为否
        :param smooth_landmarks: 设置为True减少抖动
        :param min_detection_confidence:人员检测模型的最小置信度值,默认为0.5
        :param min_tracking_confidence:姿势可信标记的最小置信度值,默认为0.5
        '''
        self.static_image_mode = static_image_mode
        self.upper_body_only = upper_body_only
        self.smooth_landmarks = smooth_landmarks
        self.min_detection_confidence = min_detection_confidence
        self.min_tracking_confidence = min_tracking_confidence
        # 创建一个Pose对象用于检测人体姿势
        self.pose = mp.solutions.pose.Pose(self.static_image_mode, self.upper_body_only, self.smooth_landmarks,self.min_detection_confidence, self.min_tracking_confidence)
    def find_pose(self, img, draw=True):
        '''
        检测姿势方法
        :param img: 一帧图像
        :param draw: 是否画出人体姿势节点和连接图
        :return: 处理过的图像
        '''
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        # pose.process(imgRGB) 会识别这帧图片中的人体姿势数据,保存到self.results中
        self.results = self.pose.process(imgRGB)
        if self.results.pose_landmarks:
            if draw:
                mp.solutions.drawing_utils.draw_landmarks(img, self.results.pose_landmarks,mp.solutions.pose.POSE_CONNECTIONS)
        #三维真实物理坐标系中
        #mp.solutions.drawing_utils.plot_landmarks(self.results.pose_landmarks,mp.solutions.pose.POSE_CONNECTIONS)
        return img
    def find_positions(self, img):
        '''
        获取人体姿势数据
        :param img: 一帧图像
        :param draw: 是否画出人体姿势节点和连接图
        :return: 人体姿势数据列表
        '''
        # 人体姿势数据列表,每个成员由3个数字组成:id, x, y
        # id代表人体的某个关节点,x和y代表坐标位置数据
        self.lmslist = []
        if self.results.pose_landmarks:
            for id, lm in enumerate(self.results.pose_landmarks.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                self.lmslist.append([id, cx, cy])
        return self.lmslist
    def find_angle(self, img, p1, p2, p3, draw=True):
        '''
        获取人体姿势中3个点p1-p2-p3的角度
        :param img: 一帧图像
        :param p1: 第1个点
        :param p2: 第2个点
        :param p3: 第3个点
        :param draw: 是否画出3个点的连接图
        :return: 角度
        '''
        x1, y1 = self.lmslist[p1][1], self.lmslist[p1][2]
        x2, y2 = self.lmslist[p2][1], self.lmslist[p2][2]
        x3, y3 = self.lmslist[p3][1], self.lmslist[p3][2]
        # 使用三角函数公式获取3个点p1-p2-p3,以p2为角的角度值,0-180度之间
        angle = int(math.degrees(math.atan2(y1 - y2, x1 - x2) - math.atan2(y3 - y2, x3 - x2)))
        if angle < 0:
            angle = angle + 360
        if angle > 180:
            angle = 360 - angle
        if draw:
            cv2.circle(img, (x1, y1), 20, (0, 255, 255), cv2.FILLED)
            cv2.circle(img, (x2, y2), 30, (255, 0, 255), cv2.FILLED)
            cv2.circle(img, (x3, y3), 20, (0, 255, 255), cv2.FILLED)
            cv2.line(img, (x1, y1), (x2, y2), (255, 255, 255, 3))
            cv2.line(img, (x2, y2), (x3, y3), (255, 255, 255, 3))
            cv2.putText(img, str(angle), (x2 - 50, y2 + 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 255, 255), 2)
        return angle

3.Mediapipe图像姿态检测


def display_img(img):
  img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
  plt.imshow(img_rgb)
  plt.show()
img=cv2.imread('data.jpg')
detector=PoseDetector()
img_pose=detector.find_pose(img)
display_img(img_pose)


4.Mediapipe摄像头实时姿态检测


import cv2
import time
#获取摄像头,传入0表示获取系统默认摄像头
cap=cv2.VideoCapture(0)
detector=PoseDetector()
cap=open(0)
while cap.isOpened():
  #获取画面
  success,frames=cap.read()
  if not success:
    print("Error")
    break
  #处理帧函数
  frame=detector.find_pose(frame)
  #展示图像
  cv2.imshow('frame',frame)
  #按下键盘q或者ese退出
  if cv2.waitKey(1) in [ord('q'),27]:
    break
#关闭摄像头
cap.release()
#关闭图像窗口
cv2.destroyAllWindows()
相关文章
|
7月前
|
机器学习/深度学习 算法 计算机视觉
yolov8人脸识别-脸部关键点检测(代码+原理)
yolov8人脸识别-脸部关键点检测(代码+原理)
|
固态存储 计算机视觉 异构计算
一起来学MediaPipe(一)人脸及五官定位检测
一起来学MediaPipe(一)人脸及五官定位检测
3301 0
一起来学MediaPipe(一)人脸及五官定位检测
|
4月前
|
计算机视觉
在yolov5项目中如何使用自带摄像机不用网络摄像机进行实时检测?
这篇文章讨论了在yolov5项目中,如何避免使用网络摄像机而改用自带的本地摄像机进行实时目标检测,并提供了解决摄像头打开错误的具体步骤和代码示例。
在yolov5项目中如何使用自带摄像机不用网络摄像机进行实时检测?
|
6月前
|
机器学习/深度学习 存储 算法
基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、运动物体追踪
基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、运动物体追踪
|
6月前
|
机器学习/深度学习 存储 编解码
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计(2)
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计
|
6月前
|
机器学习/深度学习 算法 计算机视觉
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计(3)
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计
|
6月前
|
机器学习/深度学习 监控 算法
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计(1)
基于YOLOv8与ByteTrack的车辆检测追踪与流量计数系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标追踪、车辆检测追踪、过线计数、流量统计
|
6月前
|
机器人 人机交互 vr&ar
实战 | 实时手部关键点检测跟踪(附完整源码+代码详解)
实战 | 实时手部关键点检测跟踪(附完整源码+代码详解)
|
7月前
|
机器学习/深度学习 传感器 算法
目标检测+车道线识别+追踪+测距(代码+部署运行)
目标检测+车道线识别+追踪+测距(代码+部署运行)
|
存储 算法 算法框架/工具
【opencv】计算机视觉:实时目标追踪
【opencv】计算机视觉:实时目标追踪
113 0

热门文章

最新文章