Просмотр исходного кода

fix(main): guard interactive commands and align pause/resume for polling mode

wenhongquan 1 день назад
Родитель
Сommit
fab3788b95
2 измененных файлов с 48 добавлено и 12 удалено
  1. 35 12
      dual_camera_system/main.py
  2. 13 0
      dual_camera_system/polling_tracker.py

+ 35 - 12
dual_camera_system/main.py

@@ -31,12 +31,12 @@ from config import (
     DETECTION_CONFIG, PTZ_CONFIG, COORDINATOR_CONFIG,
     CALIBRATION_CONFIG, LOG_CONFIG, SYSTEM_CONFIG,
     CAMERA_GROUPS, get_enabled_groups,
-    TRACKING_CONFIG,
+    TRACKING_CONFIG, EVENT_PUSHER_CONFIG,
 )
 from dahua_sdk import DahuaSDK
 from panorama_camera import PanoramaCamera, ObjectDetector, DetectedObject
 from ptz_camera import PTZCamera, PTZController
-from coordinator import Coordinator, EventDrivenCoordinator, AsyncCoordinator, SequentialCoordinator
+from coordinator import AsyncCoordinator, SequentialCoordinator
 from tracker import UltralyticsTracker
 from polling_tracker import PollingTrackingCoordinator
 
@@ -291,8 +291,19 @@ class DualCameraSystem:
                     self.detector
                 )
 
+        # 初始化事件推送器
+        enable_event_push = SYSTEM_CONFIG.get('enable_event_push', False)
+        if enable_event_push and not getattr(self, 'event_pusher', None):
+            try:
+                from event_pusher import EventPusher
+                self.event_pusher = EventPusher(EVENT_PUSHER_CONFIG)
+                logger.info("事件推送器初始化成功")
+            except Exception as e:
+                logger.warning(f"事件推送器初始化失败: {e}")
+                self.event_pusher = None
+
         # 注入事件推送器
-        if getattr(self, 'event_pusher', None) is not None and hasattr(self.coordinator, 'set_event_pusher'):
+        if self.event_pusher is not None and hasattr(self.coordinator, 'set_event_pusher'):
             self.coordinator.set_event_pusher(self.event_pusher)
 
         # 设置回调
@@ -567,6 +578,9 @@ class DualCameraSystem:
         self.running = True
         logger.info("联动系统启动成功")
 
+        if self.event_pusher is not None:
+            self.event_pusher.start()
+
         # 启动定时校准
         self._start_periodic_calibration()
 
@@ -591,7 +605,7 @@ class DualCameraSystem:
     
     def get_results(self):
         """获取识别结果"""
-        if self.coordinator:
+        if self.coordinator and hasattr(self.coordinator, 'get_results'):
             return self.coordinator.get_results()
         return []
     
@@ -765,6 +779,9 @@ class DualCameraSystem:
         
         # 确保定时校准停止
         self._stop_periodic_calibration()
+
+        if self.event_pusher is not None:
+            self.event_pusher.stop()
         
         if self.sdk:
             self.sdk.cleanup()
@@ -819,19 +836,25 @@ def run_interactive(system: DualCameraSystem):
                 try:
                     coords = input("输入坐标 (x y, 范围0-1): ").strip().split()
                     x, y = float(coords[0]), float(coords[1])
-                    system.coordinator.force_track_position(x, y)
-                    print(f"已移动到位置 ({x:.2f}, {y:.2f})")
+                    if hasattr(system.coordinator, 'force_track_position'):
+                        system.coordinator.force_track_position(x, y)
+                        print(f"已移动到位置 ({x:.2f}, {y:.2f})")
+                    else:
+                        print("当前模式不支持手动跟踪")
                 except Exception as e:
                     print(f"输入错误: {e}")
             
             elif cmd == 'c':
-                frame = system.coordinator.capture_snapshot()
-                if frame is not None:
-                    filename = f"snapshot_{int(time.time())}.jpg"
-                    cv2.imwrite(filename, frame)
-                    print(f"快照已保存: {filename}")
+                if hasattr(system.coordinator, 'capture_snapshot'):
+                    frame = system.coordinator.capture_snapshot()
+                    if frame is not None:
+                        filename = f"snapshot_{int(time.time())}.jpg"
+                        cv2.imwrite(filename, frame)
+                        print(f"快照已保存: {filename}")
+                    else:
+                        print("抓拍失败")
                 else:
-                    print("抓拍失败")
+                    print("当前模式不支持抓拍")
             
             elif cmd == 'b':
                 print("开始手动校准...")

+ 13 - 0
dual_camera_system/polling_tracker.py

@@ -156,6 +156,14 @@ class PollingTrackingCoordinator:
         self._paused = False
         self._paused_event.set()
 
+    def pause_detection(self):
+        """暂停检测(兼容既有协调器接口)"""
+        self.pause()
+
+    def resume_detection(self):
+        """恢复检测(兼容既有协调器接口)"""
+        self.resume()
+
     def _detection_worker(self):
         self._paused_event.wait()
         detection_fps = self.config.get("detection_fps", 2)
@@ -454,6 +462,11 @@ class PollingTrackingCoordinator:
             if key in self.stats:
                 self.stats[key] += value
 
+    def get_results(self) -> List[CaptureRecord]:
+        """获取当前抓拍结果(兼容既有协调器接口)"""
+        with self.batch_lock:
+            return self.batch_captures.copy()
+
     def get_stats(self) -> Dict:
         with self.stats_lock:
             return self.stats.copy()