HumanCenteredAI/olliedetection
0
1import mediapipe as mp2import cv23import numpy as np4 5mp_pose = mp.solutions.pose6 7def extract_pose_sequence(video_path, seq_len=32):8 cap = cv2.VideoCapture(video_path)9 pose = mp_pose.Pose(static_image_mode=False)10 seq = []11 while len(seq) < seq_len and cap.isOpened():12 ret, frame = cap.read()13 if not ret: break14 results = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))15 if results.pose_landmarks:16 coords = [[lm.x, lm.y, lm.z] for lm in results.pose_landmarks.landmark]17 seq.append(np.array(coords).flatten())18 cap.release()19 pose.close()20 return np.pad(seq, ((0, seq_len - len(seq)), (0, 0)))[:seq_len]21def feedback_from_landmarks(landmarks):22 # Simple rule-based explanations23 if landmarks['hip_y'] - landmarks['foot_y'] < 0.15:24 return "Not jumping high enough"25 if landmarks['front_foot_slide'] < 0.05:26 return "No front foot slide"27 if landmarks['back_foot_pop'] < 0.05:28 return "Not popping the board"29 if landmarks['back_foot_lift'] < 0.1:30 return "Not lifting back foot"31 return "Looks good!"32 