wenhongquan 96d0bdf7bc docs: 更新双摄像头系统校准文档与示例配置 пре 13 часа
..
__pycache__ 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
config 96d0bdf7bc docs: 更新双摄像头系统校准文档与示例配置 пре 13 часа
docs 46c8a87392 chore: 清理废弃代码与配置,优化项目结构 пре 3 недеља
scripts 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
tests 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
README.md 96d0bdf7bc docs: 更新双摄像头系统校准文档与示例配置 пре 13 часа
calibration.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
camera_group.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
capture_and_detect.py 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
config.py 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
coordinator.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
dahua_sdk.py 9d1f46544c fix(camera): 修复Linux平台下Dahua SDK BOOL类型处理问题 пре 2 месеци
devices.md 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
diag_rknn.py 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
dual_stream_manager.py 20287761c8 feat(coordinator): 实现异步联动控制器并改进视频流管理 пре 1 месец
event_pusher.py 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
inference_backend.py 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
main.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
multi_group_system.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
oss_uploader.py 46c8a87392 chore: 清理废弃代码与配置,优化项目结构 пре 3 недеља
paired_image_saver.py 1f9d441625 fix(paired_image_saver): 修复旧批次清理逻辑不总是执行的问题 пре 3 недеља
panorama_camera.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
polling_tracker.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
ptz_camera.py 4091f57025 feat: add calibration workflow and optimize PTZ tracking пре 13 часа
ptz_person_tracker.py 46c8a87392 chore: 清理废弃代码与配置,优化项目结构 пре 3 недеља
requirements.txt b7cf75ab18 chore(config): 添加本地权限配置和依赖清单 пре 1 месец
test_ptz.py 8cb8c36e38 feat(ocr): 添加RKNN人体分割模型支持并优化OCR识别流程 пре 2 месеци
third_party_pusher.py 46c8a87392 chore: 清理废弃代码与配置,优化项目结构 пре 3 недеља
tracker.py 45a43a3950 refactor: 重构检测后端,解耦推理与业务逻辑 пре 16 часа
video_lock.py 20287761c8 feat(coordinator): 实现异步联动控制器并改进视频流管理 пре 1 месец

README.md

双摄像头联动抓拍系统

系统简介

本系统实现多组全景摄像头和可变焦球机的联动抓拍功能:

  • 多组全景摄像头实时监控,检测画面中的人体
  • 检测到人体后,对应球机自动变焦定位到目标
  • 保存全景+球机配对图片,支持上传至业务平台

注意:本版本已移除 OCR 编号识别、LLM 判断、安全帽/反光衣检测,仅保留人体检测与联动抓拍。

系统架构

多组摄像头配置 (config/camera.py)
              │
              ▼
      MultiGroupSystem
              │
              ▼
    ┌─────────┴─────────┐
    │                   │
CameraGroup 1      CameraGroup 2  ...
    │                   │
    ▼                   ▼
全景+球机          全景+球机
    │                   │
    ▼                   ▼
SequentialCoordinator  ...
    │
    ▼
人体检测 -> PTZ定位 -> 抓拍 -> 配对保存/上传

目录结构

dual_camera_system/
├── config/            # 模块化配置
│   ├── __init__.py    # 配置导出
│   ├── camera.py      # 摄像头 + 日志配置
│   ├── detection.py   # 人体检测配置
│   ├── ptz.py         # PTZ 控制参数
│   ├── coordinator.py # 联动 + 校准配置
│   ├── tracking.py    # 跟踪配置(库代码)
│   ├── event.py       # 事件推送配置
│   ├── system.py      # 系统开关
│   └── ...            # 其他配置
├── main.py            # 主程序(仅多组模式)
├── multi_group_system.py  # 多组系统管理器
├── camera_group.py    # 单组摄像头封装
├── dahua_sdk.py       # 大华SDK Python封装
├── panorama_camera.py # 全景摄像头模块(视频流、人体检测)
├── ptz_camera.py      # 球机控制模块(PTZ控制、精确定位)
├── coordinator.py     # 联动控制器(SequentialCoordinator)
├── tracker.py         # Ultralytics 跟踪器封装(库代码)
├── polling_tracker.py # 多目标轮询跟踪协调器(库代码)
├── inference_backend.py  # RKNN/ONNX 通用推理后端
├── event_pusher.py    # 事件推送至业务平台
├── voice_announcer.py # TTS 语音播报
└── README.md          # 说明文档

依赖安装

# OpenCV
pip install opencv-python opencv-contrib-python

# YOLO11 (用于人体检测) - Ultralytics最新版本
pip install ultralytics

注意: YOLO11是Ultralytics的最新模型,首次运行时会自动下载预训练权重(yolo11n.pt等)。

使用方法

1. 修改配置

编辑 config/camera.py 配置摄像头组。系统默认使用示例环境:

  • 枪机:Hikvision 192.168.8.2,RTSP-only(不经过 Dahua SDK 登录)
  • 球机:Dahua 192.168.8.5,竖装且设备端已做倒影,代码层按 wall 处理,pan 不翻转

    CAMERA_GROUPS = [
    {
        'group_id': 'group_1',
        'name': '主入口',
        'enabled': True,
        'panorama': {
            'ip': '192.168.8.2',
            'port': 37777,  # Hikvision 不使用 SDK 登录,此字段可忽略
            'username': 'admin',
            'password': 'QAZwsx12',
            'channel': 1,
            'brand': 'hikvision',  # 或 use_sdk: False
            # 全景分辨率,支持 (width, height) 或 "3840x1080" / "2560*1440" / "1920x1080"
            'resolution': (2560, 1440),
            'rtsp_url': 'rtsp://admin:QAZwsx12@192.168.8.2:554/Streaming/Channels/101',
        },
        'ptz': {
            'ip': '192.168.8.5',
            'port': 37777,
            'username': 'admin',
            'password': 'Aa1234567',
            'channel': 0,
            # 竖装+设备端倒影后,代码层按 wall 处理;若球机与枪机朝向相反则 pan_flip=True
            'mount_type': 'wall',
            'pan_flip': False,
            'tilt_flip': False,
            'rtsp_url': 'rtsp://admin:Aa1234567@192.168.8.5:554/cam/realmonitor?channel=1&subtype=1',
        },
    }
    ]
    

编辑 config/detection.py 调整人体检测模型与阈值。

2. 运行系统

# 启动多组联动系统
python main.py

# 跳过自动校准
python main.py --skip-calibration

# 覆盖第一组摄像头 IP
python main.py --panorama-ip 192.168.8.2 --ptz-ip 192.168.8.5

# 指定模型
python main.py --model /home/wen/dsh/yolo/yolo11n.pt --model-size n

# 演示模式 (不连接实际摄像头)
python main.py --demo

本地冒烟测试(无需 Dahua SDK)

在 macOS 等无法加载 libdhnetsdk.so 的环境,或只想快速验证枪机 RTSP / 检测 / PTZ 角度计算时:

cd dual_camera_system
python scripts/local_test.py --frames 10

# 显示检测窗口(按 q 退出)
python scripts/local_test.py --frames 10 --show

该脚本会:

  1. 打开 Hikvision 枪机 RTSP 流
  2. 加载 YOLO 人体检测模型
  3. 对若干帧进行检测,并打印每个人的坐标
  4. 根据球机 mount_type / pan_flip 等配置计算应转动的 PTZ 角度(不实际转动)

关键功能说明

自动校准

系统启动时会自动进行全景相机与球机的校准:

校准方法 (视觉检测):

  1. 运动检测法: 记录球机移动前后全景画面差异,定位运动区域中心
  2. 特征匹配法: 将球机抓拍图像与全景画面进行SIFT特征匹配
  3. 融合定位: 综合两种方法结果加权融合
  4. 降级方案: 视觉检测失败时使用角度估算

定时校准:

  • 系统运行时每日指定时间自动校准一次(默认 08:00,可在 config/coordinator.py 中配置)
  • 确保坐标映射的准确性

跳过校准:

python main.py --skip-calibration

强制重新校准:

python main.py --force-calibration

人体检测

使用 YOLO11 模型检测画面中的人体,支持 GPU 加速。

模型尺寸选项:

  • n (nano) - 最快,精度较低
  • s (small) - 平衡速度和精度
  • m (medium) - 中等
  • l (large) - 高精度
  • x (extra-large) - 最高精度,速度最慢

多组联动

  • MultiGroupSystem 共享一个大华 SDK 实例和一个 YOLO 检测器
  • 每组摄像头独立运行 SequentialCoordinator
  • 检测到人体后控制球机 PTZ 定位并保存配对图片

PTZ控制

支持大华球机的 PTZ 控制:

  • 三维精确定位 (DH_EXTPTZ_EXACTGOTO)
  • 预置点设置/调用
  • 平滑移动跟踪

独立扫描与手动校准

当自动特征匹配不可靠时,可使用独立扫描脚本生成可人工复核的图片集,再基于确认的关键点生成校准文件。

# 1. 球机水平 360°、步长 20°,每个水平位置由下朝上扫描 tilt
#    每个位置保存球机图(文件名带 pan/tilt)和全景图
python scripts/calibration_scanner.py

# 2. 用 ORB 重新匹配已扫描图片,生成 lookup_table_orb.json 与复核 CSV
python scripts/re_match_orb.py

扫描结果保存在 calibration_scan/(可在脚本中修改路径)。人工确认图片后,编辑生成的 JSON 或手动编写 calibration_group1.json

{
  "pan_lookup": [[0.15, 252.0], [0.55, 288.0], [0.80, 305.0]],
  "tilt_lookup": [[0.45, -5.0], [0.50, -5.0], [0.65, -25.0]],
  "mount_type": "wall",
  "pan_flip": false,
  "tilt_flip": false
}

pan_lookup[[x_ratio, pan_angle], ...] 分段线性插值;tilt_lookup 同理。运行时 tilt_linear_enabled=True 会优先使用 config/ptz.py 中的 tilt_y0/tilt_y1 线性映射。校准文件路径在 config/camera.pycalibration_file 中配置。

配对图片保存

  • 全景图与球机抓拍图按时间窗口归入同一目录
  • 支持 OSS 上传与第三方平台推送
  • 配置位于 config/device.py

全景分辨率配置

每组全景摄像头可独立配置期望分辨率:

'panorama': {
    ...
    'resolution': (3840, 1080),  # 或 "3840x1080" / "3840*1080"
}

支持格式:

  • 元组/列表:(3840, 1080)[2560, 1440]
  • 字符串:"3840x1080""2560*1440""1920x1080"

系统不会拉伸 RTSP 流帧;模型推理时通过 letterbox(灰度填充)将画面按比例缩放并补到模型输入尺寸,避免丢精度。配置的分辨率用于生成模拟帧与分辨率校验。

注意事项

  1. 确保大华 SDK 库文件路径正确
  2. 球机需要支持 PTZ 控制功能
  3. 坐标映射需要根据实际场景校准
  4. 所有摄像头组在 config/camera.py 中配置,main.py 不再支持单组独立运行
  5. tracker.pypolling_tracker.py 为保留的 Ultralytics 跟踪库代码,当前 main.py 未使用