基于mediapipe的人体33个关键点坐标(BlazePose)
前言
什么是BlazePose
BlazePose是一种轻量化的卷积神级网络架构,适用于单人的关键点检测,在人体身上标注33个关键点,在单个中层手机CPU上的执行速度要比OpenPose在20核桌面CPU[5]上快25-75倍。
人体33个关键点
33个关键点如下图所示
33个关键点坐标代码实现
导入库
import cv2 import mediapipe as mp from tqdm import tqdm import time import matplotlib.pyplot as plt %matplotlib inline
导入模型
mp_pose=mp.solutions.pose mp_drawing=mp.solutions.drawing_utils pose=mp_pose.Pose(static_image_mode=True,#选择静态图片还是连续视频帧 model_complexity=2,#选择人体姿态关键点检测模型,0性能差但快,2性能好但慢,1介于之间 smooth_landmarks=True,#是否选择平滑关键点 min_detection_confidence=0.5,#置信度阈值 min_tracking_confidence=0.5)#追踪阈值
读入图像
img=cv2.imread(C:\Users\123\Desktop\2022-6-28.jpg) img_RGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)#BGR转RGB
关键点检测结果
results=pose.process(img_RGB) results.pose_landmarks
此时会输出关键点检测结果,如下图所示
关键点连接(人体骨架)
mp_pose.POSE_CONNECTIONS
输出如图所示 求关键点的归一化坐标,可用数字表示
results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW] 或 results.pose_landmarks.landmark[13]
获取坐标值
results.pose_landmarks.landmark[13].x
求指定关键点像素坐标
h=img.shape[0] w=img.shape[1] results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW].x*w results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_ELBOW].x*h
解析指定关键点的真实物理坐标
results.pose_world_landmarks.landmark[mp_pose.PoseLandmark.NOSE] 或 results.pose_world_landmarks.landmark[23]
将33个关键点坐标汇总
import numpy as np coords=np.array(results.pose_landmarks.landmark) #汇总所有点的XYZ坐标 def get_x(each): return each.x def get_y(each): return each.y def get_z(each): return each.z #分别获取关键点XYZ坐标 points_x=np.array(list(map(get_x,coords))) points_y=np.array(list(map(get_y,coords))) points_z=np.array(list(map(get_z,coords))) #将三个方向坐标合并 points=np.vstack((points_x,points_y,points_z)).T
此时points就变成了33行3列,如下图所示
下一篇:
阿里版 ChatGPT 突然上线!