""" 示例 6: 多传感器并行处理 本示例演示多进程并行处理多个传感器: - 多进程:每个传感器运行在独立进程,拥有独立 CUDA 上下文 - 每个进程独立处理:采集 → 光流 → HHD 适用于: - 多个高分辨率传感器 - 需要最大化总吞吐量 - 有充足的 CPU 核心和 GPU 显存 架构说明: 进程 1 (传感器 0): [采集] → [光流] → [HHD] → 队列 ──┐ 进程 2 (传感器 1): │ [采集] → [光流] → [HHD] → 队列 ──┼──→ 主进程显示 ... │ 进程 N (传感器 N-1): │ [采集] → [光流] → [HHD] → 队列 ──┘ 资源占用估算(每个传感器): - CPU: 约 1-2 个核心 - GPU 显存: 约 500MB-1GB(取决于分辨率和 CUDA 算法) """ import os os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" # Windows 兼容性设置 import cv2 import orisys import multiprocessing as mp def main(): # ========================================================================= # 1. 配置多个传感器 # ========================================================================= configs = [ { 'vid_src': './s1.mp4', # 视频源 'isstitch': True, # 启用拼接 'cuda': True, # 启用 GPU 加速 'cal_path': './config/cal.npy' # 标定文件 }, { 'vid_src': './s1_copy.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy' }, ] # ========================================================================= # 2. 使用上下文管理器启动(推荐方式) # ========================================================================= # 上下文管理器会自动启动所有传感器进程 # 退出时自动清理所有资源 with orisys.MultiSensor(configs) as multi: print("\n多传感器异步模式已启动,按 'q' 退出") # ===================================================================== # 3. 迭代获取所有传感器数据 # ===================================================================== for all_data in multi: # 过滤有效数据 for data in [d for d in all_data if d]: sid = data['sensor_id'] # 打印状态 print(f"传感器 {sid}: FPS={data['fps']:5.1f}, 法向力={data['fnormal']:8.2f}") # 显示形变图 if data['img'] is not None and data['flow'] is not None: arrows = orisys.util.draw_arrows( data['img'].copy(), data['flow'], threshold=5 ) cv2.imshow(f"传感器 {sid} - 形变", arrows) # 检查退出键 if cv2.waitKey(1) & 0xFF == ord('q'): break cv2.destroyAllWindows() def main_manual(): """ 备选方式:手动控制启动和停止 适用于需要更精细控制的场景,例如: - 动态添加/移除传感器 - 在运行时切换同步/异步模式 - 自定义错误处理 """ configs = [ {'vid_src': './s1.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'}, {'vid_src': './s1.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'}, ] # 创建 MultiSensor 实例 multi = orisys.MultiSensor(configs) # 手动启动 multi.start() try: while True: # 获取所有传感器的最新数据 all_data = multi.get_all() for data in [d for d in all_data if d]: cv2.imshow(f"传感器 {data['sensor_id']}", data['img']) if cv2.waitKey(1) & 0xFF == ord('q'): break finally: # 手动停止所有进程 multi.stop() cv2.destroyAllWindows() if __name__ == '__main__': # Windows 下多进程必需的初始化 mp.freeze_support() main()