129 lines
4.2 KiB
Python
129 lines
4.2 KiB
Python
"""
|
|
示例 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()
|