Pose-Detection-App / animation_renderer.py
vertalius's picture
Upload 12 files
1e91e1d verified
import numpy as np
from dataclasses import dataclass
from typing import List, Dict, Tuple
@dataclass
class KeyFrame:
timestamp: float
landmarks: np.ndarray
connections: List[Tuple[int, int]]
class AnimationRenderer:
def __init__(self, fps: int = 30):
self.fps = fps
self.keyframes: List[KeyFrame] = []
self.current_frame = 0
self.total_frames = 0
def add_keyframe(self, landmarks: np.ndarray, connections: List[Tuple[int, int]], timestamp: float):
"""Add a new keyframe to the animation sequence"""
keyframe = KeyFrame(timestamp=timestamp, landmarks=landmarks, connections=connections)
self.keyframes.append(keyframe)
self.total_frames = max(self.total_frames, int(timestamp * self.fps))
def interpolate_poses(self, start_frame: KeyFrame, end_frame: KeyFrame, alpha: float) -> np.ndarray:
"""Interpolate between two poses using linear interpolation"""
return start_frame.landmarks + alpha * (end_frame.landmarks - start_frame.landmarks)
def get_frame_at_time(self, time: float) -> Tuple[np.ndarray, List[Tuple[int, int]]]:
"""Get interpolated frame at specified time"""
if not self.keyframes:
return None, []
# Find surrounding keyframes
next_idx = 0
for i, kf in enumerate(self.keyframes):
if kf.timestamp > time:
next_idx = i
break
if next_idx == 0:
return self.keyframes[0].landmarks, self.keyframes[0].connections
prev_idx = next_idx - 1
prev_frame = self.keyframes[prev_idx]
next_frame = self.keyframes[next_idx]
# Calculate interpolation factor
alpha = (time - prev_frame.timestamp) / (next_frame.timestamp - prev_frame.timestamp)
interpolated_landmarks = self.interpolate_poses(prev_frame, next_frame, alpha)
return interpolated_landmarks, prev_frame.connections
def get_next_frame(self) -> Tuple[np.ndarray, List[Tuple[int, int]]]:
"""Get the next frame in the animation sequence"""
if not self.keyframes or self.current_frame >= self.total_frames:
return None, []
time = self.current_frame / self.fps
self.current_frame += 1
return self.get_frame_at_time(time)