From af8aee402e169ca3b46e4042f0e689ac47e5f90d Mon Sep 17 00:00:00 2001 From: bluepulsar Date: Tue, 10 Feb 2026 21:17:37 +0800 Subject: [PATCH] update multiproecssing for max. speed to 130fps --- ..._of3 480p.json => prototype_of3_480p.json} | 0 ..._of3 720p.json => prototype_of3_720p.json} | 0 example2_two_sensor_pipeline.py | 71 ++++++++++++------- src/orisys/sensor.py | 5 +- 4 files changed, 48 insertions(+), 28 deletions(-) rename config/{prototype_of3 480p.json => prototype_of3_480p.json} (100%) rename config/{prototype_of3 720p.json => prototype_of3_720p.json} (100%) diff --git a/config/prototype_of3 480p.json b/config/prototype_of3_480p.json similarity index 100% rename from config/prototype_of3 480p.json rename to config/prototype_of3_480p.json diff --git a/config/prototype_of3 720p.json b/config/prototype_of3_720p.json similarity index 100% rename from config/prototype_of3 720p.json rename to config/prototype_of3_720p.json diff --git a/example2_two_sensor_pipeline.py b/example2_two_sensor_pipeline.py index ff3085b..ac7193c 100644 --- a/example2_two_sensor_pipeline.py +++ b/example2_two_sensor_pipeline.py @@ -94,9 +94,6 @@ def sensor_worker(sensor_id, vid_src, config_name, cal_path, result_queue, stop_ # 如果队列已满,跳过这一帧 pass - # 短暂休眠,避免过度占用CPU - time.sleep(0.001) - except Exception as e: print(f"传感器 {sensor_id} 处理错误: {e}") time.sleep(0.1) @@ -118,22 +115,24 @@ def main(): sensor_configs = [ { 'sensor_id': 0, - 'vid_src': './s1.mp4', - 'config_name': 'prototype', - 'cal_path': './config/cal.npy' + 'vid_src': './s1_720p.mp4', + 'config_name': './config/prototype_of3_720p.json', + 'cal_path': './config/dd01a_0_720p.npy' }, { 'sensor_id': 1, - 'vid_src': './s1.mp4', # 可以改为不同的视频源或摄像头索引 - 'config_name': 'prototype', - 'cal_path': './config/cal2.npy' + 'vid_src': './s1_720p.mp4', # 可以改为不同的视频源或摄像头索引 + 'config_name': './config/prototype_of3_720p.json', + 'cal_path': './config/dd01a_0_720p.npy' }, ] # ========================================================================= # 2. 创建进程间通信对象 # ========================================================================= - result_queues = [Queue(maxsize=num_sensors) for _ in sensor_configs] # 每个传感器一个队列 + # 增大队列大小以缓冲更多帧,避免因主进程处理延迟导致的丢帧 + # 使用更大的缓冲区以平滑FPS波动 + result_queues = [Queue(maxsize=30) for _ in sensor_configs] # 每个传感器一个队列,缓冲30帧 stop_events = [mp.Event() for _ in sensor_configs] # 停止事件 # ========================================================================= @@ -154,21 +153,32 @@ def main(): # 用于存储每个传感器的最新数据 latest_data = [None] * len(sensor_configs) + # 用于控制打印频率,减少I/O开销 + print_counter = 0 + print_interval = 30 # 每30帧打印一次,进一步减少I/O + + # 用于控制按键检查频率 + key_check_counter = 0 + key_check_interval = 5 # 每5帧检查一次按键 + try: # ===================================================================== # 4. 主循环:从队列获取数据并显示 # ===================================================================== while True: - # 从所有队列中获取最新数据 + # 从所有队列中快速获取最新数据(高效清空队列,只保留最新帧) for i, queue in enumerate(result_queues): - try: - # 非阻塞获取,获取队列中最新的数据 - while True: + # 快速清空队列,只保留最后一帧 + data = None + # 一次性获取所有可用数据,只保留最后一个 + while True: + try: data = queue.get_nowait() - latest_data[i] = data - except: - # 队列为空,使用之前的数据 - pass + except: + break + + if data is not None: + latest_data[i] = data # 显示所有传感器的数据 for data in latest_data: @@ -207,15 +217,24 @@ def main(): div_normalized = np.zeros_like(div_abs, dtype=np.uint8) cv2.imshow(f"Depth Map {sid}", cv2.applyColorMap(div_normalized, cv2.COLORMAP_JET)) - - # 打印FPS - print(f"传感器 {sid}: FPS={data['fps']:5.1f}") - # 检查退出键 - key = cv2.waitKey(1) & 0xFF - if key == ord('q'): - print("\n退出程序...") - break + # 降低打印频率以减少I/O开销(在主循环级别控制) + print_counter += 1 + if print_counter >= print_interval: + for data in latest_data: + if data is not None and 'error' not in data: + sid = data['sensor_id'] + print(f"传感器 {sid}: FPS={data['fps']:5.1f}") + print_counter = 0 + + # 降低按键检查频率以减少开销 + key_check_counter += 1 + if key_check_counter >= key_check_interval: + key = cv2.waitKey(1) & 0xFF + if key == ord('q'): + print("\n退出程序...") + break + key_check_counter = 0 finally: # ===================================================================== diff --git a/src/orisys/sensor.py b/src/orisys/sensor.py index 1a4d57a..ef08047 100644 --- a/src/orisys/sensor.py +++ b/src/orisys/sensor.py @@ -209,7 +209,7 @@ class Sensor: diff = cv2.absdiff(self.img, self.initial_img) return diff.mean() > threshold - def compute_deformation(self): + def compute_deformation(self, decompose=True): """ Compute optical flow and decompose into force components. @@ -220,7 +220,8 @@ class Sensor: raise Exception("Warning: Get image first") self.__compute_flow() - self.__compute_hhd() + if decompose: + self.__compute_hhd() return True