您现在的位置是:首页 >技术教程 >OpenCV + mediapipe ->人体姿态估计网站首页技术教程
OpenCV + mediapipe ->人体姿态估计
简介OpenCV + mediapipe ->人体姿态估计
一、初识
MediaPipe是Google开发的一款跨平台的多媒体处理框架,它提供了一系列预训练的机器学习模型和相应的Python API,用于实现各种计算机视觉和人机交互任务。其中,人体姿态检测就是MediaPipe的一个重要功能。
通过使用MediaPipe的人体姿态检测模型,我们可以在图像或视频中准确地检测人体的关键关节位置,从而识别人体的姿态。这对于许多应用场景非常有用,如姿势分析、运动捕捉、虚拟现实、增强现实、健身跟踪等。
MediaPipe人体姿态检测模型基于机器学习技术,结合了深度学习和计算机视觉算法。它能够实时地从图像或视频中提取人体的姿态信息,并给出关键关节的坐标和置信度。
MediaPipe人体姿态检测的优点包括:
-
实时性能:该模型设计用于实时处理,可以在高帧率下进行快速姿态检测。
-
多平台支持:MediaPipe支持跨多种平台,包括PC、移动设备和嵌入式设备,使得人体姿态检测可以在不同设备上进行应用。
-
简化开发:使用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 查看。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。