Spaces:
Running
on
L40S
Running
on
L40S
import json | |
import numpy as np | |
import logging | |
from pathlib import Path | |
from config import TEST_DATA_DIR | |
logger = logging.getLogger(__name__) | |
def create_test_data_structure(progress_callback=None): | |
"""Create sample camera extrinsics data for testing""" | |
if progress_callback: | |
progress_callback(0.0, desc="Creating test data structure...") | |
# Create directories | |
data_dir = Path(f"{TEST_DATA_DIR}/cameras") | |
videos_dir = Path(f"{TEST_DATA_DIR}/videos") | |
data_dir.mkdir(parents=True, exist_ok=True) | |
videos_dir.mkdir(parents=True, exist_ok=True) | |
camera_file = data_dir / "camera_extrinsics.json" | |
# Skip if file already exists | |
if camera_file.exists(): | |
logger.info(f"✓ Camera extrinsics already exist at {camera_file}") | |
if progress_callback: | |
progress_callback(1.0, desc="Test data structure already exists") | |
return | |
if progress_callback: | |
progress_callback(0.3, desc="Generating camera extrinsics data...") | |
# Generate sample camera data | |
camera_data = {} | |
# Create 81 frames with 10 camera trajectories each | |
for frame_idx in range(81): | |
frame_key = f"frame{frame_idx}" | |
camera_data[frame_key] = {} | |
for cam_idx in range(1, 11): # Camera types 1-10 | |
# Create a sample camera matrix (this is just an example - replace with actual logic if needed) | |
# In reality, these would be calculated based on specific camera movement patterns | |
# Create a base identity matrix | |
base_matrix = np.eye(4) | |
# Add some variation based on frame and camera type | |
# This is a simplistic example - real camera movements would be more complex | |
if cam_idx == 1: # Pan Right | |
base_matrix[0, 3] = 0.01 * frame_idx # Move right over time | |
elif cam_idx == 2: # Pan Left | |
base_matrix[0, 3] = -0.01 * frame_idx # Move left over time | |
elif cam_idx == 3: # Tilt Up | |
# Rotate around X-axis | |
angle = 0.005 * frame_idx | |
base_matrix[1, 1] = np.cos(angle) | |
base_matrix[1, 2] = -np.sin(angle) | |
base_matrix[2, 1] = np.sin(angle) | |
base_matrix[2, 2] = np.cos(angle) | |
elif cam_idx == 4: # Tilt Down | |
# Rotate around X-axis (opposite direction) | |
angle = -0.005 * frame_idx | |
base_matrix[1, 1] = np.cos(angle) | |
base_matrix[1, 2] = -np.sin(angle) | |
base_matrix[2, 1] = np.sin(angle) | |
base_matrix[2, 2] = np.cos(angle) | |
elif cam_idx == 5: # Zoom In | |
base_matrix[2, 3] = -0.01 * frame_idx # Move forward over time | |
elif cam_idx == 6: # Zoom Out | |
base_matrix[2, 3] = 0.01 * frame_idx # Move backward over time | |
elif cam_idx == 7: # Translate Up (with rotation) | |
base_matrix[1, 3] = 0.01 * frame_idx # Move up over time | |
angle = 0.003 * frame_idx | |
base_matrix[0, 0] = np.cos(angle) | |
base_matrix[0, 2] = np.sin(angle) | |
base_matrix[2, 0] = -np.sin(angle) | |
base_matrix[2, 2] = np.cos(angle) | |
elif cam_idx == 8: # Translate Down (with rotation) | |
base_matrix[1, 3] = -0.01 * frame_idx # Move down over time | |
angle = -0.003 * frame_idx | |
base_matrix[0, 0] = np.cos(angle) | |
base_matrix[0, 2] = np.sin(angle) | |
base_matrix[2, 0] = -np.sin(angle) | |
base_matrix[2, 2] = np.cos(angle) | |
elif cam_idx == 9: # Arc Left (with rotation) | |
angle = 0.005 * frame_idx | |
radius = 2.0 | |
base_matrix[0, 3] = -radius * np.sin(angle) | |
base_matrix[2, 3] = -radius * np.cos(angle) + radius | |
# Rotate to look at center | |
look_angle = angle + np.pi | |
base_matrix[0, 0] = np.cos(look_angle) | |
base_matrix[0, 2] = np.sin(look_angle) | |
base_matrix[2, 0] = -np.sin(look_angle) | |
base_matrix[2, 2] = np.cos(look_angle) | |
elif cam_idx == 10: # Arc Right (with rotation) | |
angle = -0.005 * frame_idx | |
radius = 2.0 | |
base_matrix[0, 3] = -radius * np.sin(angle) | |
base_matrix[2, 3] = -radius * np.cos(angle) + radius | |
# Rotate to look at center | |
look_angle = angle + np.pi | |
base_matrix[0, 0] = np.cos(look_angle) | |
base_matrix[0, 2] = np.sin(look_angle) | |
base_matrix[2, 0] = -np.sin(look_angle) | |
base_matrix[2, 2] = np.cos(look_angle) | |
# Format the matrix as a string (as expected by the app) | |
# Format: [row1] [row2] [row3] [row4] with spaces between values | |
matrix_str = ' '.join([f"[{' '.join([str(base_matrix[i, j]) for j in range(4)])}]" for i in range(4)]) + ' ' | |
camera_data[frame_key][f"cam{cam_idx:02d}"] = matrix_str | |
if progress_callback: | |
progress_callback(0.7, desc="Saving camera extrinsics data...") | |
# Save camera extrinsics to JSON file | |
with open(camera_file, 'w') as f: | |
json.dump(camera_data, f, indent=2) | |
logger.info(f"Created sample camera extrinsics at {camera_file}") | |
logger.info(f"Created directory for example videos at {videos_dir}") | |
if progress_callback: | |
progress_callback(1.0, desc="Test data structure created successfully!") |