您现在的位置是:首页 >技术教程 >OpenCV + mediapipe ->人体姿态估计网站首页技术教程

OpenCV + mediapipe ->人体姿态估计

大大Cameo 2024-06-17 10:13:42
简介OpenCV + mediapipe ->人体姿态估计

一、初识

MediaPipe是Google开发的一款跨平台的多媒体处理框架,它提供了一系列预训练的机器学习模型和相应的Python API,用于实现各种计算机视觉和人机交互任务。其中,人体姿态检测就是MediaPipe的一个重要功能。

通过使用MediaPipe的人体姿态检测模型,我们可以在图像或视频中准确地检测人体的关键关节位置,从而识别人体的姿态。这对于许多应用场景非常有用,如姿势分析、运动捕捉、虚拟现实、增强现实、健身跟踪等。

MediaPipe人体姿态检测模型基于机器学习技术,结合了深度学习和计算机视觉算法。它能够实时地从图像或视频中提取人体的姿态信息,并给出关键关节的坐标和置信度。

MediaPipe人体姿态检测的优点包括:

  1. 实时性能:该模型设计用于实时处理,可以在高帧率下进行快速姿态检测。

  2. 多平台支持:MediaPipe支持跨多种平台,包括PC、移动设备和嵌入式设备,使得人体姿态检测可以在不同设备上进行应用。

  3. 简化开发:使用MediaPipe的人体姿态检测模型,无需从头开始训练自己的模型,可以直接使用预训练的模型和API进行快速开发。

二、实战

(1)安装环境

pip install opencv-python
pip install mediapipe==0.8.3.1

(2)加载视频、保存视频

代码:

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture('PoseVideo/ctrl.mp4') # 加载视频
pTime = 0

# fps2 = cap.get(cv2.CAP_PROP_FPS) #获取视频的帧率

# 获取图像宽度、高度
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

# 创建保存视频的对象
out = cv2.VideoWriter('PoseVideo/outpy.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10, (frame_width, frame_height))
while True:
    success, img = cap.read()
   
    cTime = time.time()
    fps = 1 / (cTime - pTime) #帧数
    pTime = cTime
    cv2.putText(img, str(int(fps)), (70, 50), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 3)
    cv2.imshow('Image', img)
    out.write(img) #写入视频
    cv2.waitKey(1)

(3)人体姿态检测

代码:

import cv2
import mediapipe as mp
import time

pTime = 0
cap = cv2.VideoCapture('PoseVideo/ctrl2.mp4')
mpDraw = mp.solutions.drawing_utils  # drawing_utils模块,绘制特征点和边界框
mpPose = mp.solutions.pose  # 引入姿态估计模型
pose = mpPose.Pose()  # 创建姿势估计对象

# 获取图像高度、宽度
frame_width = int(cap.get(3))
frame_height = int(cap.get(4))

# 创建保存视频的对象
out = cv2.VideoWriter('PoseVideo/outpy.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 10,
                      (frame_width, frame_height))

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 图像从BGR转换为RGB
    results = pose.process(imgRGB)  # 检测人体姿势
    # print(results.pose_landmarks) #人体关键关节信息
    if results.pose_landmarks:
        mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)  # 绘制节点
        for id, lm in enumerate(results.pose_landmarks.landmark):  # 遍历节点信息
            h, w, c = img.shape
            print(id, lm)  # 打印节点id和位置信息
            cx, cy = int(lm.x * w), int(lm.y * h)  # 关节在图像中的位置
            cv2.circle(img, (cx, cy), 5, (255, 0, 0), cv2.FILLED)  # 将节点绘实心圆

    cTime = time.time()
    fps = 1 / (cTime - pTime)  # 帧数
    pTime = cTime
    cv2.putText(img, str(int(fps)), (70, 50), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 3)
    cv2.imshow('Image', img)
    out.write(img)  # 视频写入
    cv2.waitKey(1)

效果:

蔡老师辛苦了ㄟ(⊙ω⊙ㄟ)哈

三、最后

MediaPipe人体姿态估计模块通常使用的是COCO关节点集,其中包括了32个人体坐标点,如下:

详情可点击mediapipe pose.md 查看。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。