- 官方文档:https://google.github.io/mediapipe/
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作为一个模块,可以首先为该模块创建一个别名,再进行具体操作文章来源:https://www.toymoban.com/news/detail-452700.html
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个关节点参数名
文章来源地址https://www.toymoban.com/news/detail-452700.html
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)
到了这里,关于mediapipe——人体姿势关节点检测(pose模块) 学习笔记(全)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!