Spaces:
Paused
Paused
| 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!") |