Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Real-time face, hand, and body pose tracking with Google MediaPipe, solution selection, and comparison with YOLO pose estimation
.claude/skills/aeren23-mediapipe-tracking/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 23% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 16% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 24% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 78% | 0% |
What body part do you need to track?
├── Full body pose (standing, sitting, exercising)
│ └── ✅ Pose Estimation — 33 landmarks, 3D (x, y, z)
│
├── Hands and fingers
│ └── ✅ Hand Tracking — 21 landmarks per hand
│
├── Face details (lips, eyes, eyebrows, jawline)
│ └── ✅ Face Mesh — 468 landmarks, 3D
│
└── Multiple tasks simultaneously
└── ✅ Holistic — combines Pose + Hands + Face| Feature | MediaPipe Pose | YOLO Pose | |---------|---------------|----------| | Landmarks | 33 (full body + face) | 17 (body only) | | Depth (Z-axis) | ✅ Yes (camera-relative) | ❌ No (2D only) | | Speed | ⚡ Very fast (optimized for mobile) | ⚡ Fast | | Multi-person | ❌ Single person per frame | ✅ Multiple people | | 3D Avatar | ✅ Possible (Z depth) | ❌ Not possible | | Hand details | ✅ 21 points per hand (separate solution) | ❌ Not available | | Face details | ✅ 468 points (separate solution) | ❌ Not available | | Best for | Single-user apps, gesture control, fitness | Multi-person detection, surveillance |
> Rule of thumb: Need detailed single-person anatomy (hands, face, depth)? → MediaPipe. Need to detect multiple people quickly? → YOLO Pose.
| Solution | Points | Notable Landmarks | |----------|--------|--------------------| | Pose | 33 | Nose, shoulders, elbows, wrists, hips, knees, ankles, eyes, ears | | Hand | 21 | Wrist, thumb (4 joints), index (4), middle (4), ring (4), pinky (4) | | Face Mesh | 468 | Lips contour, eye contour, eyebrows, nose bridge, jawline, iris |
pythonimport cv2 import mediapipe as mp mp_pose = mp.solutions.pose mp_draw = mp.solutions.drawing_utils cap = cv2.VideoCapture(0) with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose: while cap.isOpened(): ret, frame = cap.read() if not ret: break # MediaPipe expects RGB rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = pose.process(rgb) if results.pose_landmarks: mp_draw.draw_landmarks( frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) cv2.imshow('Pose', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows()
pythonmp_hands = mp.solutions.hands with mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.7) as hands: # Same loop pattern as pose results = hands.process(rgb) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: mp_draw.draw_landmarks( frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
pythonmp_face = mp.solutions.face_mesh with mp_face.FaceMesh(max_num_faces=1, min_detection_confidence=0.5) as face_mesh: results = face_mesh.process(rgb) if results.multi_face_landmarks: for face_landmarks in results.multi_face_landmarks: mp_draw.draw_landmarks( frame, face_landmarks, mp_face.FACEMESH_TESSELATION)
MediaPipe processes RGB images. OpenCV captures BGR. Always convert:
pythonrgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) results = pose.process(rgb)
Landmark .x and .y are normalized to image dimensions. To get pixel coordinates:
pythonh, w, _ = frame.shape lm = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_SHOULDER] pixel_x, pixel_y = int(lm.x * w), int(lm.y * h)
The .z coordinate represents depth relative to the hip center (Pose) or wrist (Hand). It is NOT world-scale distance in meters.
MediaPipe Pose processes one person per frame. For multi-person scenarios, use YOLO Pose or run MediaPipe per detected person crop.
Always use with statement for proper resource cleanup:
python# CORRECT with mp_pose.Pose() as pose: ... # AVOID pose = mp_pose.Pose() # resources may leak
| Application | Solution | Key Landmarks | |-------------|----------|----------------| | Exercise rep counter | Pose | Shoulder, elbow, wrist angles | | Sign language recognition | Hand | All 21 finger joints | | Drowsiness detection | Face Mesh | Eye aspect ratio (EAR) | | Virtual try-on | Pose + Face | Body proportions + face alignment | | Gesture-controlled UI | Hand | Fingertip positions (index, thumb) | | Scoliosis screening | Pose | Shoulder/hip symmetry analysis |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | pass→pass | 12,530 | 8,110 | -35% | 1 | 1 | 0% | 2,915 | 3,392 | +16% | 0 | 0 | — |
case-02 | fail→pass | 11,483 | 8,449 | -26% | 1 | 1 | 0% | 2,948 | 3,708 | +26% | 0 | 0 | — |
case-03 | fail→pass | 13,224 | 6,815 | -48% | 1 | 1 | 0% | 2,421 | 2,987 | +23% | 0 | 0 | — |
case-04 | pass→pass | 13,550 | 8,071 | -40% | 1 | 1 | 0% | 2,628 | 3,253 | +24% | 0 | 0 | — |
case-05 | pass→pass | 11,931 | 11,111 | -7% | 1 | 1 | 0% | 1,879 | 3,351 | +78% | 0 | 0 | — |
case-06 | pass→pass | 3,677 | 3,810 | +4% | 1 | 1 | 0% | 736 | 2,114 | +187% | 0 | 0 | — |
case-07 | pass→pass | 3,225 | 3,290 | +2% | 1 | 1 | 0% | 565 | 2,216 | +292% | 0 | 0 | — |
case-08 | pass→pass | 4,271 | 3,138 | -27% | 1 | 1 | 0% | 802 | 2,072 | +158% | 0 | 0 | — |
case-09 | pass→pass | 2,926 | 5,525 | +89% | 1 | 1 | 0% | 537 | 2,649 | +393% | 0 | 0 | — |
case-10 | pass→pass | 10,683 | 5,469 | -49% | 1 | 1 | 0% | 2,049 | 2,709 | +32% | 0 | 0 | — |
case-11 | pass→pass | 7,200 | 5,952 | -17% | 1 | 1 | 0% | 1,813 | 2,940 | +62% | 0 | 0 | — |
case-12 | pass→pass | 9,487 | 6,394 | -33% | 1 | 1 | 0% | 2,380 | 2,834 | +19% | 0 | 0 | — |
case-13 | pass→pass | 3,655 | 2,792 | -24% | 1 | 1 | 0% | 792 | 2,074 | +162% | 0 | 0 | — |
case-14 | pass→pass | 3,890 | 2,424 | -38% | 1 | 1 | 0% | 723 | 1,994 | +176% | 0 | 0 | — |
case-15 | pass→pass | 7,556 | 5,461 | -28% | 1 | 1 | 0% | 1,587 | 2,522 | +59% | 0 | 0 | — |
case-16 | pass→pass | 9,256 | 7,285 | -21% | 1 | 1 | 0% | 2,222 | 3,203 | +44% | 0 | 0 | — |
case-17 | pass→pass | 6,037 | 3,899 | -35% | 1 | 1 | 0% | 1,238 | 2,230 | +80% | 0 | 0 | — |
case-18 | pass→pass | 5,418 | 2,639 | -51% | 1 | 1 | 0% | 983 | 2,013 | +105% | 0 | 0 | — |
case-19 | pass→pass | 5,685 | 3,699 | -35% | 1 | 1 | 0% | 1,328 | 2,311 | +74% | 0 | 0 | — |
case-20 | pass→pass | 5,453 | 5,869 | +8% | 1 | 1 | 0% | 1,285 | 2,764 | +115% | 0 | 0 | — |
case-21 | pass→pass | 9,315 | 7,761 | -17% | 1 | 1 | 0% | 1,801 | 3,199 | +78% | 0 | 0 | — |
case-22 | pass→pass | 3,780 | 2,294 | -39% | 1 | 1 | 0% | 805 | 1,958 | +143% | 0 | 0 | — |
case-23 | pass→pass | 5,298 | 3,986 | -25% | 1 | 1 | 0% | 1,075 | 2,307 | +115% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 23 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.