mediapipe——人体姿势关节点检测(pose模块) 学习笔记(全)

1.1 解决方案的API,参数

API/参数 说明
STATIC_IMAGE_MOD 默认为 False,将输入图像视为视频流。它将尝试在第一张图像中检测最突出的人,并在成功检测后进一步定位姿势地标。在随后的图像中,它只是简单地跟踪那些地标,而不会调用另一个检测,直到失去对目标的跟踪,可以减少计算和延迟。若为 True,则会对每张输入图像执行人体检测方法,非常适合处理一批静态的、可能不相关的图像。
MODEL_COMPLEXITY 默认为 1,姿势地标模型的复杂度:0、1 、2。地标准确度和推理延迟通常随着模型复杂度的增加而增加。
smooth_landmarks 默认为 True,平滑图像,过滤不同的输入图像上的姿势地标以减少抖动,但如果static_image_mode也设置为 True 则忽略。
upper_body_only 默认为 False,是否只检测上半身的地标。人体姿势共有33个地标,上半身的姿势地标有25个。
enable_segmentation 默认为False。如果设置为 true,除了姿势地标之外,该解决方案还会生成分割掩码。
smooth_segmentation 默认为 True,过滤不同的输入图像上的分割掩码以减少抖动,但如果 enable_segmentation 设置为 False,或者 static_image_mode 设置为 True 则忽略。
min_tracking_confidence 默认为 0.5。来自地标跟踪模型的最小置信值 (0-1之间),用于将被视为成功跟踪的姿势地标,否则将在下一个输入图像上自动调用人物检测。将其设置为更高的值可以提高解决方案的稳健性,但代价是更高的延迟。如果 static_image_mode 为 True,则人员检测将在每帧图像上运行。
min_detection_confidence 默认为 0.5,来自人员检测模型的最小置信值 (0-1之间),高于该阈值则认为检测视为成功。

1.2 绘制关键点和连线

1.2.1 API
  • mediapipe.solutions.drawing_utils.draw_landmarks()

mediapipe.solutions.drawing_utils作为一个模块,可以首先为该模块创建一个别名,再进行具体操作

mp_drawing = mp.solutions.drawing_utils
mp_drawing.draw_landmarks()
1.2.2 函数参数
参数 说明
image 需要画图的原始图片
landmark_list 检测到的关键点坐标(results.pose_landmarks)
connections 连接线,需要把那些坐标连接起来(mpPose.POSE_CONNECTIONS),不传入该参数则不会连接起来
landmark_drawing_spec 坐标的颜色,粗细
connection_drawing_spec 连接线的粗细,颜色等
results = pose.process(image)
mpDraw.draw_landmarks(img, results.pose_landmarks, mpPose.POSE_CONNECTIONS)

1.3 姿势关节点跟踪封装模块

  • mp.solutions.pose
mpPose = mp.solutions.pose  # 姿态识别方法,创建一个别名
#调用myPose模块中的Pose类
pose = mpPose.Pose(static_image_mode=False, # 静态图模式,False代表置信度高时继续跟踪,True代表实时跟踪检测新的结果
                   #upper_body_only=False,  # 是否只检测上半身
                   smooth_landmarks=True,  # 平滑,一般为True
                   min_detection_confidence=0.5, # 检测置信度
                   min_tracking_confidence=0.5)  # 跟踪置信度

1.4 查看33个关节点坐标

1.4.1 33个关节点参数名

在这里插入图片描述

class PoseLandmark(enum.IntEnum):
  """The 33 pose landmarks."""
  NOSE = 0
  LEFT_EYE_INNER = 1
  LEFT_EYE = 2
  LEFT_EYE_OUTER = 3
  RIGHT_EYE_INNER = 4
  RIGHT_EYE = 5
  RIGHT_EYE_OUTER = 6
  LEFT_EAR = 7
  RIGHT_EAR = 8
  MOUTH_LEFT = 9
  MOUTH_RIGHT = 10
  LEFT_SHOULDER = 11
  RIGHT_SHOULDER = 12
  LEFT_ELBOW = 13
  RIGHT_ELBOW = 14
  LEFT_WRIST = 15
  RIGHT_WRIST = 16
  LEFT_PINKY = 17
  RIGHT_PINKY = 18
  LEFT_INDEX = 19
  RIGHT_INDEX = 20
  LEFT_THUMB = 21
  RIGHT_THUMB = 22
  LEFT_HIP = 23
  RIGHT_HIP = 24
  LEFT_KNEE = 25
  RIGHT_KNEE = 26
  LEFT_ANKLE = 27
  RIGHT_ANKLE = 28
  LEFT_HEEL = 29
  RIGHT_HEEL = 30
  LEFT_FOOT_INDEX = 31
  RIGHT_FOOT_INDEX = 32
1.4.2 查看某一个关节点坐标
results = pose.process(image)#将图像传给姿态识别模型
#用index保存索引,记录序号,lm为具体值
for index, lm in enumerate(results.pose_landmarks.landmark):
            
        	#print(lm)
          	"""
          	x: 0.42567315697669983
			y: 4.285938739776611
			z: 0.28193268179893494
			visibility: 0.001105456380173564
          	"""
            
            
            # 保存每帧图像的宽、高、通道数
            h, w, c = img.shape
            
            # 得到的关键点坐标x/y/z/visibility都是比例坐标,在[0,1]之间
            # 转换为像素坐标(cx,cy),图像的实际长宽乘以比例,像素坐标一定是整数
            cx, cy = int(lm.x * w), int(lm.y * h)
            
            # 打印坐标信息
            print(index, cx, cy)

1.4.3 将xy的比例坐标转换成像素坐标
  • 由于直接生成的坐标数值太小,可以将其转化为图片的像素大小单位
# 保存每帧图像的宽、高、通道数
h, w, c = img.shape
            
# 得到的关键点坐标x/y/z/visibility都是比例坐标,在[0,1]之间
# 转换为像素坐标(cx,cy),图像的实际长宽乘以比例,像素坐标一定是整数
cx, cy = int(lm.x * w), int(lm.y * h)

1.5 查看FPS

  • FPS:画面每秒传输的帧数
1.5.1 查看FPS
#循环之前pTime初始化为0
#每一次循环:
cTime = time.time() #处理完一帧图像的时间
fps = 1/(cTime-pTime)#即为FPS
pTime = cTime  #重置起始时间
1.5.2 在图片上显示FPS
# 在视频上显示fps信息,先转换成整数再变成字符串形式,文本显示坐标,文本字体,文本大小
cv2.putText(img, str(int(fps)), (70,50), cv2.FONT_HERSHEY_PLAIN, 3, (255,0,0), 3)  

猜你喜欢

转载自blog.csdn.net/weixin_63676550/article/details/128855431