Explorar el Código

refactor(calibration): 重构相机校准模块,加载PTZ配置,改进代码结构

- 增加PTZ配置加载函数,支持配置导入和默认值
- 规范注释风格和代码格式,提升代码可读性
- 整体重构OverlapDiscovery类及相关数据结构
- 优化特征匹配初始化,兼容SIFT和ORB
- 维护视野重叠发现逻辑,准备扩展后续改进
wenhongquan hace 3 días
padre
commit
b7be51ee04

+ 25 - 1
dual_camera_system/calibration.py

@@ -18,6 +18,18 @@ from enum import Enum
 
 from ptz_camera import PTZCamera
 
+# 加载PTZ配置
+def _get_ptz_config():
+    try:
+        from config import PTZ_CONFIG
+        return PTZ_CONFIG
+    except ImportError:
+        return {
+            'mount_type': 'wall',
+            'tilt_flip': False,
+            'pan_flip': False
+        }
+
 
 class CalibrationState(Enum):
     IDLE = 0
@@ -892,6 +904,7 @@ class CameraCalibrator:
 
         try:
             import json
+            ptz_config = _get_ptz_config()
             data = {
                 'pan_offset': self.pan_offset,
                 'pan_scale_x': self.pan_scale_x,
@@ -909,7 +922,11 @@ class CameraCalibrator:
                         'match_count': r.match_count
                     }
                     for r in self.overlap_ranges
-                ]
+                ],
+                # 保存安装方向配置
+                'mount_type': ptz_config.get('mount_type', 'wall'),
+                'tilt_flip': ptz_config.get('tilt_flip', False),
+                'pan_flip': ptz_config.get('pan_flip', False),
             }
 
             with open(filepath, 'w') as f:
@@ -958,6 +975,13 @@ class CameraCalibrator:
                 points=[],
                 rms_error=data.get('rms_error', 0)
             )
+            
+            # 检查安装方向配置是否匹配
+            ptz_config = _get_ptz_config()
+            current_mount = ptz_config.get('mount_type', 'wall')
+            saved_mount = data.get('mount_type', 'wall')
+            if current_mount != saved_mount:
+                print(f"警告: 当前安装类型({current_mount})与校准时的({saved_mount})不同,建议重新校准!")
 
             print(f"校准结果已加载: {filepath}")
             return True

+ 9 - 2
dual_camera_system/config/ptz.py

@@ -15,7 +15,14 @@ PTZ_CONFIG = {
     'pan_center': 90,                # 水平中心角度 (画面中心对应的PTZ角度)
     'tilt_center': 0,                # 垂直中心角度
     
-    # 方向修正
-    # 如果球机与全景朝向相反(球机看后面),设为True
+    # 球机安装方向配置
+    # mount_type: 'ceiling' - 吸顶/吊装(镜头朝上), 'wall' - 壁装/立杆(镜头朝下)
+    # 吸顶安装时,俯仰角(tilt)方向与壁装相反,需要反转tilt计算
+    'mount_type': 'wall',            # 'ceiling' 或 'wall'
+    
+    # 方向修正(根据mount_type自动设置,也可手动覆盖)
+    # pan_flip: 如果球机与全景朝向相反(球机看后面),设为True
+    # tilt_flip: 如果俯仰方向相反,设为True(吸顶安装通常需要True)
     'pan_flip': False,
+    'tilt_flip': False,              # 由 mount_type='ceiling' 时自动生效
 }

+ 23 - 5
dual_camera_system/ptz_camera.py

@@ -338,25 +338,43 @@ class PTZCamera:
         """
         if zoom is None:
             zoom = self.ptz_config['default_zoom']
-        
+    
         # 应用坐标偏移校准
         offset_x, offset_y = self.ptz_config['coordinate_offset']
         x_ratio = max(0, min(1, x_ratio + offset_x))
         y_ratio = max(0, min(1, y_ratio + offset_y))
-        
+    
         # 从配置获取视野参数
         pan_range = self.ptz_config.get('pan_range', (0, 180))
         tilt_range = self.ptz_config.get('tilt_range', (-45, 45))
         pan_center = self.ptz_config.get('pan_center', 90)
         tilt_center = self.ptz_config.get('tilt_center', 0)
-        
+    
         # 将画面比例转换为角度
         # x_ratio=0 对应 pan_range[0], x_ratio=1 对应 pan_range[1]
         pan = pan_range[0] + (pan_range[1] - pan_range[0]) * x_ratio
-        
+    
         # y_ratio=0.5 对应 tilt_center, y_ratio=0 对应 tilt_range[0], y_ratio=1 对应 tilt_range[1]
         tilt = tilt_range[0] + (tilt_range[1] - tilt_range[0]) * y_ratio
-        
+            
+        # 应用方向修正
+        # 1. 检查安装类型,吸顶安装需要反转tilt
+        mount_type = self.ptz_config.get('mount_type', 'wall')
+        tilt_flip = self.ptz_config.get('tilt_flip', False)
+            
+        # 吸顶安装时自动反转tilt方向
+        if mount_type == 'ceiling' or tilt_flip:
+            # 反转tilt:原来的正角度变负,负角度变正
+            tilt = -tilt
+            print(f"[PTZCamera] 吸顶安装,tilt方向修正: {-tilt} -> {tilt}")
+            
+        # 2. 应用pan方向修正
+        pan_flip = self.ptz_config.get('pan_flip', False)
+        if pan_flip:
+            # 反转pan方向(180度偏移)
+            pan = (pan + 180) % 360
+            print(f"[PTZCamera] pan方向翻转: {(pan - 180) % 360} -> {pan}")
+    
         return (pan, tilt, zoom)
     
     def move_to_target(self, x_ratio: float, y_ratio: float,