import numpy as np def normalize_landmarks(landmarks): """ Нормализует полный скелет MediaPipe (33 точки) с использованием x,y,z. Центрирует относительно центра бёдер и масштабирует по росту. Возвращает плоский вектор (99,) из x,y,z всех точек. """ lm = landmarks[:, :3].copy() # (33,3) # Центр бёдер (индексы 23 и 24) hip_center = (lm[23] + lm[24]) / 2 # Центр плеч (11 и 12) shoulder_center = (lm[11] + lm[12]) / 2 # Рост – расстояние от бёдер до плеч height = np.linalg.norm(shoulder_center - hip_center) if height < 1e-6: height = 1.0 # Центрируем и масштабируем lm_centered = lm - hip_center lm_normalized = lm_centered / height return lm_normalized.flatten() # (99,)