Spaces:
Running
Running
| import numpy as np | |
| from dataclasses import dataclass | |
| from typing import List, Dict, Tuple | |
| 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) | |