YOLO-3D / load_camera_params.py
hoeirup's picture
Initial commit with all files at root level
a277f69
#!/usr/bin/env python3
import os
import json
import numpy as np
from pathlib import Path
def load_camera_params(params_file):
"""
Load camera parameters from a JSON file.
Args:
params_file (str): Path to the JSON file containing camera parameters
Returns:
dict: Dictionary containing camera parameters
"""
if not os.path.exists(params_file):
print(f"Warning: Camera parameters file {params_file} not found. Using default parameters.")
return None
try:
with open(params_file, 'r') as f:
params = json.load(f)
# Convert lists to numpy arrays
params['camera_matrix'] = np.array(params['camera_matrix'])
params['dist_coeffs'] = np.array(params['dist_coeffs'])
params['projection_matrix'] = np.array(params['projection_matrix'])
print(f"Loaded camera parameters from {params_file}")
print(f"Camera matrix:\n{params['camera_matrix']}")
print(f"Projection matrix:\n{params['projection_matrix']}")
return params
except Exception as e:
print(f"Error loading camera parameters: {e}")
return None
def create_projection_matrix(camera_matrix, R=None, t=None):
"""
Create a projection matrix from camera intrinsic and extrinsic parameters.
Args:
camera_matrix (numpy.ndarray): Camera intrinsic matrix (3x3)
R (numpy.ndarray): Rotation matrix (3x3)
t (numpy.ndarray): Translation vector (3x1)
Returns:
numpy.ndarray: Projection matrix (3x4)
"""
if R is None:
R = np.eye(3)
if t is None:
t = np.zeros((3, 1))
# Combine rotation and translation
RT = np.hstack((R, t))
# Create projection matrix
projection_matrix = camera_matrix @ RT
return projection_matrix
def apply_camera_params_to_estimator(bbox3d_estimator, params):
"""
Apply camera parameters to a 3D bounding box estimator.
Args:
bbox3d_estimator: BBox3DEstimator instance
params (dict): Dictionary containing camera parameters
Returns:
bbox3d_estimator: Updated BBox3DEstimator instance
"""
if params is None:
print("Warning: No camera parameters provided. Using default parameters.")
return bbox3d_estimator
# Update camera matrix
if 'camera_matrix' in params:
bbox3d_estimator.K = params['camera_matrix']
# Update projection matrix
if 'projection_matrix' in params:
bbox3d_estimator.P = params['projection_matrix']
print("Applied camera parameters to 3D bounding box estimator")
return bbox3d_estimator
def main():
"""Example usage of the camera parameter functions."""
# Configuration variables (modify these as needed)
# ===============================================
# Input file
params_file = "camera_params.json" # Path to camera parameters JSON file
# Camera position (for example purposes)
camera_height = 1.65 # Camera height above ground in meters
# ===============================================
# Load camera parameters
params = load_camera_params(params_file)
if params:
print("\nCamera Parameters:")
print(f"Image dimensions: {params['image_width']}x{params['image_height']}")
print(f"Reprojection error: {params['reprojection_error']}")
# Example of creating a projection matrix with different extrinsic parameters
print(f"\nExample: Creating a projection matrix with camera raised {camera_height}m above ground")
R = np.eye(3)
t = np.array([[0], [camera_height], [0]]) # Camera above ground
projection_matrix = create_projection_matrix(params['camera_matrix'], R, t)
print(f"New projection matrix:\n{projection_matrix}")
if __name__ == "__main__":
main()