import numpy as np import json from typing import Dict, Any class CameraModel: def __init__(self, config_path: str = None): """ 初始化相机模型,支持从配置文件加载参数。 :param config_path: 配置文件的路径(JSON/YAML)。如果为 None,则使用默认参数。 """ # 默认参数 self._default_params = { "K": [[838.19297892, 0, 658.51580973], [0, 836.93529706, 960-484.42225009], [0, 0, 1]], "dist_coeffs": [-0.450688803, 0.260760637, 0.000210619624, -0.000669674309, -0.0447846385], "focal_length": 3.6, "height": 1007, # 1.007e+03 - 9 "rotation_alpha": 0.9135, "rotation_beta": 0.7271, "position_offset_x": 0, "position_offset_y": 53, "rotation_camera": -0.02892 } # 如果提供了配置文件,则从文件加载参数 if config_path: self.load_config(config_path) else: self._set_parameters(self._default_params) def _set_parameters(self, params: Dict[str, Any]) -> None: """根据参数字典设置成员变量""" self.K = np.array(params["K"]) self.dist_coeffs = np.array(params["dist_coeffs"]) self.focal_length = params["focal_length"] self.height = params["height"] self.rotation_alpha = params["rotation_alpha"] self.rotation_beta = params["rotation_beta"] self.position_offset_x = params["position_offset_x"] self.position_offset_y = params["position_offset_y"] self.rotation_camera = params["rotation_camera"] # 计算派生属性 self.pixel_size_x = self.focal_length / self.K[0, 0] self.pixel_size_y = self.focal_length / self.K[1, 1] self.principal_point = (self.K[0, 2], self.K[1, 2]) def load_config(self, file_path: str) -> None: """从 JSON 文件加载参数""" with open(file_path, 'r') as f: params = json.load(f) self._set_parameters(params) def save_config(self, file_path: str) -> None: """将当前参数保存到 JSON 文件""" params = { "K": self.K.tolist(), "dist_coeffs": self.dist_coeffs.tolist(), "focal_length": self.focal_length, "height": self.height, "rotation_alpha": self.rotation_alpha, "rotation_beta": self.rotation_beta, "position_offset_x": self.position_offset_x, "position_offset_y": self.position_offset_y, "rotation_camera": self.rotation_camera } with open(file_path, 'w') as f: json.dump(params, f, indent=4) def update_parameter(self, key: str, value: Any) -> None: """动态更新单个参数""" if hasattr(self, key): setattr(self, key, value) # 如果修改了 K 或焦距,需要重新计算派生属性 if key in ["K", "focal_length"]: self.pixel_size_x = self.focal_length / self.K[0, 0] self.pixel_size_y = self.focal_length / self.K[1, 1] self.principal_point = (self.K[0, 2], self.K[1, 2]) else: raise AttributeError(f"参数 {key} 不存在") model = CameraModel(None) # model.save_config("updated_config.json") # # 修改单个参数 # model.update_parameter("focal_length", 4.0) # # # 直接修改内参矩阵 # model.K = np.array([[900, 0, 350], [0, 900, 280], [0, 0, 1]]) # model.update_parameter("K", model.K) # 触发派生属性重新计算 # print(f"model: {model.K}") model.save_config("updated_config.json")