2026/2/9 16:22:10
网站建设
项目流程
技术支持 东莞网站建设 轴承,注册网站需要多少,家装设计网站开发,企业设备管理系统MediaPipe Pose实战教程#xff1a;33个关节红点标注与白线连接原理
1. 引言#xff1a;AI人体骨骼关键点检测的工程价值
随着计算机视觉技术的发展#xff0c;人体姿态估计#xff08;Human Pose Estimation#xff09;已成为智能健身、动作捕捉、虚拟试衣、人机交互等…MediaPipe Pose实战教程33个关节红点标注与白线连接原理1. 引言AI人体骨骼关键点检测的工程价值随着计算机视觉技术的发展人体姿态估计Human Pose Estimation已成为智能健身、动作捕捉、虚拟试衣、人机交互等场景的核心支撑技术。传统方法依赖复杂的深度学习模型和GPU推理环境部署成本高且响应延迟大。本教程聚焦于Google MediaPipe Pose 模型的实际落地应用带你从零掌握如何利用轻量级CPU环境实现高精度33关节检测并深入解析其可视化中“红点标注”与“白线连接”的生成逻辑。文章不仅提供完整可运行的WebUI实践方案更揭示背后的技术原理帮助开发者真正理解——为什么是这33个点线是如何连的颜色和样式如何控制通过本文你将获得 - ✅ 可本地运行、无需联网的MediaPipe Pose完整部署方案 - ✅ 关键点检测 骨架连线的全流程代码实现 - ✅ 33个关节点命名体系与拓扑结构详解 - ✅ 自定义关键点样式颜色/大小与连接规则的方法2. 核心技术解析MediaPipe Pose的33个关键点是什么2.1 什么是MediaPipe PoseMediaPipe Pose 是 Google 开源的一套基于单目RGB图像的人体姿态估计算法属于 MediaPipe Solutions 系列之一。它采用 BlazePose 模型架构在保持较高精度的同时专为移动设备和CPU环境优化支持实时推理通常50ms/帧。该模型输出的是33个标准化的3D关键点坐标x, y, z, visibility覆盖了人体主要解剖学位置区域包含关键点示例面部鼻尖、左/右眼、耳垂躯干胸骨、脊柱、骨盆上肢肩、肘、腕、手部指节下肢髋、膝、踝、脚跟、脚尖这些点并非随机选取而是遵循人体运动学链Kinematic Chain设计确保能准确描述肢体旋转、弯曲等动作。2.2 33个关键点的命名与索引体系MediaPipe 定义了一个标准的关键点枚举类mp_pose.PoseLandmark每个点都有唯一名称和整数索引0~32。以下是部分关键点对照表import mediapipe as mp mp_pose mp.solutions.pose # 示例获取特定关键点的索引 print(mp_pose.PoseLandmark.NOSE.value) # 输出: 0 print(mp_pose.PoseLandmark.LEFT_WRIST.value) # 输出: 15 print(mp_pose.PoseLandmark.RIGHT_ANKLE.value) # 输出: 28完整33点列表如下按索引顺序索引名称描述0NOSE鼻尖1LEFT_EYE_INNER左内眼角2LEFT_EYE左眼球中心.........11LEFT_SHOULDER左肩12RIGHT_SHOULDER右肩13LEFT_ELBOW左肘14RIGHT_ELBOW右肘15LEFT_WRIST左腕16RIGHT_WRIST右腕23LEFT_HIP左髋24RIGHT_HIP右髋25LEFT_KNEE左膝26RIGHT_KNEE右膝27LEFT_ANKLE左踝28RIGHT_ANKLE右踝.........32RIGHT_FOOT_INDEX右脚食趾提示visibility字段表示该点是否被遮挡或不可见值越接近1表示置信度越高可用于过滤低质量检测结果。3. 实战实现红点标注与白线连接的完整代码流程3.1 环境准备与依赖安装首先确保已安装必要的Python库pip install mediapipe opencv-python flask numpy⚠️ 注意MediaPipe自带BlazePose模型权重无需手动下载开箱即用。3.2 基础检测流程提取33个关键点以下是一个基础的图像处理函数用于加载图片并执行姿态估计import cv2 import mediapipe as mp import numpy as np def detect_pose(image_path): # 初始化MediaPipe姿态检测模块 mp_pose mp.solutions.pose pose mp_pose.Pose( static_image_modeTrue, # 图像模式 model_complexity1, # 模型复杂度0: Lite, 1: Full, 2: Heavy enable_segmentationFalse, # 是否启用身体分割 min_detection_confidence0.5 ) # 读取图像 image cv2.imread(image_path) rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 执行姿态估计 results pose.process(rgb_image) if not results.pose_landmarks: print(未检测到人体) return None, None h, w, _ image.shape landmarks [] for landmark in results.pose_landmarks.landmark: px int(landmark.x * w) py int(landmark.y * h) visible landmark.visibility landmarks.append((px, py, visible)) return image, landmarks, results.pose_landmarks, w, h3.3 可视化实现绘制红点与白线接下来我们使用 OpenCV 手动绘制关键点红点和骨架连接线白线替代默认绘图以增强自定义能力。def draw_skeleton(image, pose_landmarks, connections, point_color(0, 0, 255), line_color(255, 255, 255), point_radius5, line_thickness2): 自定义绘制骨架图 :param image: 原始图像 :param pose_landmarks: 关键点列表 [(x,y,vis), ...] :param connections: 连接关系列表如 [[11,13], [13,15]] :param point_color: 点的颜色 (B,G,R) :param line_color: 线的颜色 :param point_radius: 点半径 :param line_thickness: 线宽 h, w, _ image.shape # 绘制关键点红点 for i, (x, y, vis) in enumerate(pose_landmarks): if vis 0.5: # 置信度过低则跳过 continue cv2.circle(image, (int(x), int(y)), point_radius, point_color, -1) # 绘制连接线白线 for conn in connections: start_idx, end_idx conn if pose_landmarks[start_idx][2] 0.5 or pose_landmarks[end_idx][2] 0.5: continue x1, y1 int(pose_landmarks[start_idx][0]), int(pose_landmarks[start_idx][1]) x2, y2 int(pose_landmarks[end_idx][0]), int(pose_landmarks[end_idx][1]) cv2.line(image, (x1, y1), (x2, y2), line_color, line_thickness) return image3.4 构建WebUI服务Flask快速搭建上传接口创建一个简单的 Flask 应用允许用户上传图片并返回带骨架标注的结果from flask import Flask, request, send_file import os app Flask(__name__) UPLOAD_FOLDER uploads os.makedirs(UPLOAD_FOLDER, exist_okTrue) app.route(/, methods[GET]) def index(): return h2 MediaPipe Pose 骨架检测 WebUI/h2 form methodPOST enctypemultipart/form-data action/predict 上传一张人像照片input typefile nameimagebrbr input typesubmit value分析姿态 /form app.route(/predict, methods[POST]) def predict(): file request.files[image] filepath os.path.join(UPLOAD_FOLDER, file.filename) file.save(filepath) image, landmarks, pose_landmarks_obj, w, h detect_pose(filepath) if image is None: return 未检测到人体, 400 # 获取预定义的连接关系 connections mp.solutions.pose.POSE_CONNECTIONS # 转换为自定义格式 [(x,y,vis)] custom_landmarks [ (lm.x * w, lm.y * h, lm.visibility) for lm in pose_landmarks_obj.landmark ] # 绘制骨架 result_img draw_skeleton(image, custom_landmarks, connections) # 保存结果 output_path os.path.join(UPLOAD_FOLDER, result_ file.filename) cv2.imwrite(output_path, result_img) return send_file(output_path, mimetypeimage/jpeg) if __name__ __main__: app.run(host0.0.0.0, port5000)启动后访问http://localhost:5000即可上传测试图片系统自动返回标注后的图像。4. 白线连接原理POSE_CONNECTIONS 的拓扑设计4.1 什么是 POSE_CONNECTIONS在 MediaPipe 中mp.solutions.pose.POSE_CONNECTIONS是一个包含35 条预定义连接边的元组列表每条边由两个关键点索引组成例如(11, 13)表示“左肩 → 左肘”。你可以查看其内容print(list(mp.solutions.pose.POSE_CONNECTIONS)[:5]) # 输出示例: [(0, 1), (1, 2), (2, 3), (3, 4), (5, 6)]这些连接构成了完整的“火柴人”骨架图主要包括以下几类类型示例连接功能说明头部鼻→左眼→左耳面部朝向识别躯干左肩↔右肩左髋↔右髋判断站立姿势稳定性上肢链肩→肘→腕手臂伸展/弯曲判断下肢链髋→膝→踝→脚尖步态分析、深蹲动作检测对称连接左右肩、左右髋、左右踝检测身体对称性4.2 如何自定义连接规则若只想关注特定部位如只画手臂可自定义连接集ARM_CONNECTIONS [ (11, 13), # 左肩 - 左肘 (13, 15), # 左肘 - 左腕 (12, 14), # 右肩 - 右肘 (14, 16) # 右肘 - 右腕 ] draw_skeleton(image, landmarks, ARM_CONNECTIONS)这样就能实现局部骨架高亮显示适用于专项动作分析场景。5. 总结5.1 技术价值回顾本文围绕MediaPipe Pose 的 33 关键点检测与可视化机制展开完成了从理论到实践的完整闭环✅ 解析了33个关键点的命名体系与生理意义明确了其在动作识别中的作用✅ 实现了基于 CPU 的高精度、低延迟姿态估计流程适合边缘设备部署✅ 深入拆解了“红点标注”与“白线连接”的底层实现逻辑展示了如何通过cv2.circle和cv2.line手动构建骨架图✅ 提供了Flask WebUI 快速集成方案支持非技术人员上传图片进行交互式体验✅ 揭示了POSE_CONNECTIONS的拓扑结构并演示了如何自定义连接规则以适应不同业务需求。5.2 最佳实践建议优先使用 CPU 推理MediaPipe 对 CPU 友好无需 GPU 即可达到毫秒级响应适合轻量化部署。过滤低置信度点利用visibility字段剔除误检点提升下游任务鲁棒性。按需定制连接图避免全连接造成视觉干扰针对具体场景如瑜伽、舞蹈设计专属连接模板。结合角度计算做动作识别基于三个连续关键点如肩-肘-腕可计算夹角进而判断“抬手”、“弯腰”等动作状态。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。