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

fix(camera): 修正 PTZ 摄像头 rtsp_url 的通道号

- 修改 PTZ_CAMERA 中 rtsp_url 的 subtype 参数由 1 改为 0
- 保持其他摄像头配置和多组配置不变,确保兼容性
- 未影响 SDK 路径配置和获取启用组功能逻辑
wenhongquan 5 дней назад
Родитель
Сommit
0aa4ac845d

+ 1 - 1
dual_camera_system/config/camera.py

@@ -32,7 +32,7 @@ PTZ_CAMERA = {
     'username': 'admin',
     'password': 'Aa1234567',
     'channel': 0,  # PTZ 控制通道号 (SDK 从 0 开始)
-    'rtsp_url': 'rtsp://admin:Aa1234567@192.168.20.197:554/cam/realmonitor?channel=1&subtype=1',
+    'rtsp_url': 'rtsp://admin:Aa1234567@192.168.20.197:554/cam/realmonitor?channel=1&subtype=0',
 }
 
 # ============================================================

+ 15 - 9
dual_camera_system/coordinator.py

@@ -1263,25 +1263,28 @@ class AsyncCoordinator(Coordinator):
 
     def _save_ptz_image_for_person_batch(self, batch_id: str, person_index: int,
                                           ptz_frame: np.ndarray,
-                                          ptz_position: Tuple[float, float, int]):
+                                          ptz_position: Tuple[float, float, int],
+                                          ptz_frame_marked: np.ndarray = None):
         """
         保存球机聚焦图片到指定批次(直接使用 batch_id,不依赖当前批次)
-        
+
         Args:
             batch_id: 批次ID
             person_index: 人员序号
-            ptz_frame: 球机帧
+            ptz_frame: 球机原始
             ptz_position: PTZ位置 (pan, tilt, zoom)
+            ptz_frame_marked: 球机标记帧(可选,不传则在内部标记)
         """
         if self._paired_saver is None:
             return
-        
+
         self._paired_saver.save_ptz_image(
             batch_id=batch_id,
             person_index=person_index,
             ptz_frame=ptz_frame,
             ptz_position=ptz_position,
-            ptz_bbox=getattr(self, '_last_ptz_bbox', None)
+            ptz_bbox=getattr(self, '_last_ptz_bbox', None),
+            ptz_frame_marked=ptz_frame_marked
         )
 
     def _ptz_worker(self):
@@ -1467,9 +1470,10 @@ class AsyncCoordinator(Coordinator):
             
             # 保存球机图片到配对批次(使用命令中的 batch_id 和 person_index)
             if self._enable_paired_saving and batch_id is not None and person_index >= 0 and ptz_frame is not None:
-                # 使用球机端检测器检测人体并标记
+                # 使用球机端检测器检测人体并标记(用于标记图)
                 ptz_frame_marked = self._mark_ptz_frame_with_detection(ptz_frame, person_index=person_index)
-                self._save_ptz_image_for_person_batch(batch_id, person_index, ptz_frame_marked, (final_pan, final_tilt, final_zoom))
+                # 传入原始帧保存为原图,标记帧保存为标记图
+                self._save_ptz_image_for_person_batch(batch_id, person_index, ptz_frame, (final_pan, final_tilt, final_zoom), ptz_frame_marked=ptz_frame_marked)
             elif self._enable_paired_saving:
                 logger.warning(f"[配对保存] 跳过球机图保存: batch_id={batch_id}, person_index={person_index}, frame={ptz_frame is not None}")
             
@@ -2012,10 +2016,12 @@ class SequentialCoordinator(AsyncCoordinator):
 
                 # 保存球机图片
                 if self._enable_paired_saving and batch_id is not None:
+                    # 使用球机端检测器检测人体并标记(用于标记图)
                     ptz_frame_marked = self._mark_ptz_frame_with_detection(ptz_frame, person_index=person_index)
+                    # 传入原始帧保存为原图,标记帧保存为标记图
                     self._save_ptz_image_for_person_batch(
-                        batch_id, person_index, ptz_frame_marked,
-                        (pan, tilt, final_zoom)
+                        batch_id, person_index, ptz_frame,
+                        (pan, tilt, final_zoom), ptz_frame_marked=ptz_frame_marked
                     )
 
                 # 保存到本地(无论是否启用配对保存)

+ 10 - 4
dual_camera_system/paired_image_saver.py

@@ -353,17 +353,19 @@ class PairedImageSaver:
     def save_ptz_image(self, batch_id: str, person_index: int,
                        ptz_frame, ptz_position: Tuple[float, float, int],
                        ptz_bbox: Tuple[int, int, int, int] = None,
-                       person_info: Dict = None) -> Tuple[Optional[str], Optional[str]]:
+                       person_info: Dict = None,
+                       ptz_frame_marked: object = None) -> Tuple[Optional[str], Optional[str]]:
         """
         保存球机聚焦图片(原图和标记图)
 
         Args:
             batch_id: 批次ID
             person_index: 人员序号(0-based)
-            ptz_frame: 球机帧
+            ptz_frame: 球机原始(未标记)
             ptz_position: PTZ位置 (pan, tilt, zoom)
             ptz_bbox: 球机图中检测到的bbox (x1, y1, x2, y2)
             person_info: 额外人员信息
+            ptz_frame_marked: 外部传入的已标记帧(可选,不传则在内部生成标记图)
 
         Returns:
             (原图路径, 标记图路径) 或 (None, None)
@@ -386,8 +388,12 @@ class PairedImageSaver:
                 if ptz_frame is not None:
                     cv2.imwrite(str(original_filepath), ptz_frame)
 
-                # 复制图像用于标记
-                marked_frame = ptz_frame.copy() if ptz_frame is not None else None
+                # 优先使用外部传入的标记帧,否则内部生成
+                if ptz_frame_marked is not None:
+                    marked_frame = ptz_frame_marked
+                else:
+                    # 复制图像用于标记
+                    marked_frame = ptz_frame.copy() if ptz_frame is not None else None
 
                 if marked_frame is not None:
                     # 在球机图上添加标记