From fc0025650fea8c0ffb3033afd5ba1d499bb3d7b8 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 31 Dec 2025 10:23:12 +0800 Subject: [PATCH] prepare to build --- build_multi_version.py | 6 +- example4_multiple_sensor.py | 99 -------------------------- example6_multi_async.py | 128 ---------------------------------- example7_five_sensors.py | 134 ------------------------------------ setup.py | 2 +- src/orisys/__init__.py | 2 +- 6 files changed, 5 insertions(+), 366 deletions(-) delete mode 100644 example4_multiple_sensor.py delete mode 100644 example6_multi_async.py delete mode 100644 example7_five_sensors.py diff --git a/build_multi_version.py b/build_multi_version.py index c936177..3113077 100644 --- a/build_multi_version.py +++ b/build_multi_version.py @@ -180,7 +180,7 @@ for pkg in packages: setup( name="orisys", - version="0.1.0", + version="0.2.0", description="Orisys - Optical Tactile Sensor SDK (Protected)", author="Your Name", package_dir={{"": "src"}}, @@ -275,7 +275,7 @@ def build_wheel_for_version(python_version): return False print(f"✅ Wheel for Python {python_version} on {PLATFORM_NAME} built successfully!") - print(f" Expected: orisys-0.1.0-{py_tag}-none-{plat_tag}.whl") + print(f" Expected: orisys-0.2.0-{py_tag}-none-{plat_tag}.whl") return True @@ -381,7 +381,7 @@ def main(): for wheel in Path(f'dist/{PLATFORM_NAME}').glob('*.whl'): print(f" - {wheel.name}") print("\nInstall with:") - print(f" pip install dist/{PLATFORM_NAME}/orisys-0.1.0-*.whl") + print(f" pip install dist/{PLATFORM_NAME}/orisys-0.2.0-*.whl") if __name__ == '__main__': diff --git a/example4_multiple_sensor.py b/example4_multiple_sensor.py deleted file mode 100644 index 276b550..0000000 --- a/example4_multiple_sensor.py +++ /dev/null @@ -1,99 +0,0 @@ -""" -示例 4: 多传感器并行处理(多进程模式) - -本示例演示如何同时运行多个传感器: -- 每个传感器运行在独立的进程中 -- 每个进程拥有独立的 CUDA 上下文 -- 使用 MultiSensor 类简化多传感器管理 - -架构说明: - 进程 1 (传感器 0): 采集 → 光流 → HHD → 队列 - 进程 2 (传感器 1): 采集 → 光流 → HHD → 队列 - ↓ - 主进程: 显示 ← ───────────────┘ - -适用场景:多指触觉传感器、多视角采集、需要 GPU 加速的多路处理 - -注意事项: -- Windows 下必须在 if __name__ == '__main__' 中调用 mp.freeze_support() -- 每个传感器进程会占用独立的 GPU 显存 -""" - -import os -os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" # Windows 兼容性设置 - -import cv2 -import orisys -import multiprocessing as mp - - -def main(): - # ========================================================================= - # 1. 配置多个传感器 - # ========================================================================= - # 每个传感器的配置是一个字典,包含: - # vid_src: 视频源(文件路径或摄像头索引) - # isstitch: 是否启用拼接模式 - # cuda: 是否使用 GPU 加速 - # cal_path: 标定文件路径 - 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' - }, - ] - - # ========================================================================= - # 2. 使用上下文管理器启动多传感器 - # ========================================================================= - # MultiSensor 会自动: - # - 为每个配置创建独立的子进程 - # - 在子进程中初始化 Sensor 实例 - # - 持续采集和处理数据 - # - 通过队列将结果传回主进程 - with orisys.MultiSensor(configs) as multi: - print("\n多传感器已启动,按 'q' 退出") - - # ===================================================================== - # 3. 迭代获取所有传感器的数据 - # ===================================================================== - # multi 是可迭代的,每次迭代返回所有传感器的最新数据列表 - # all_data = [data_sensor_0, data_sensor_1, ...] - for all_data in multi: - # 过滤掉 None(某些传感器可能暂时没有新数据) - 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() - - -if __name__ == '__main__': - # Windows 下多进程必需的初始化 - mp.freeze_support() - main() diff --git a/example6_multi_async.py b/example6_multi_async.py deleted file mode 100644 index d3e6168..0000000 --- a/example6_multi_async.py +++ /dev/null @@ -1,128 +0,0 @@ -""" -示例 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() diff --git a/example7_five_sensors.py b/example7_five_sensors.py deleted file mode 100644 index b907edf..0000000 --- a/example7_five_sensors.py +++ /dev/null @@ -1,134 +0,0 @@ -""" -示例 7: 五传感器网格显示 - -本示例演示如何扩展到 5 个传感器: -- 使用多进程模式并行运行所有传感器 -- 将 5 个传感器画面拼接成 2x3 网格显示 -- 实时显示每个传感器的 FPS 和力数据 - -网格布局: - ┌─────────┬─────────┬─────────┐ - │ 传感器0 │ 传感器1 │ 传感器2 │ - ├─────────┼─────────┼─────────┤ - │ 传感器3 │ 传感器4 │ (空) │ - └─────────┴─────────┴─────────┘ - -硬件要求估算: -- CPU: 建议 8 核以上(每个传感器约 2-3 线程) -- GPU: 建议 8GB 显存以上(每个传感器约 500MB-1GB) -- 内存: 建议 16GB 以上 - -注意:本示例使用同一个视频文件模拟 5 个传感器, - 实际使用时请替换为不同的视频源或摄像头索引。 -""" - -import os -os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" # Windows 兼容性设置 - -import cv2 -import orisys -import multiprocessing as mp -import numpy as np - - -def main(): - # ========================================================================= - # 1. 配置 5 个传感器 - # ========================================================================= - # 注意:这里使用同一个视频文件作为演示 - # 实际应用中应替换为不同的视频源: - # - 摄像头: 0, 1, 2, 3, 4 - # - 视频文件: './sensor0.mp4', './sensor1.mp4', ... - 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'}, - {'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'}, - {'vid_src': './s1.mp4', 'isstitch': True, 'cuda': True, 'cal_path': './config/cal.npy'}, - ] - - # ========================================================================= - # 2. 启动多传感器并行模式 - # ========================================================================= - with orisys.MultiSensor(configs) as multi: - print(f"\n{len(configs)} 个传感器已启动,按 'q' 退出") - - # ===================================================================== - # 3. 主循环 - # ===================================================================== - for all_data in multi: - # 过滤有效数据(有图像的传感器) - valid_data = [d for d in all_data if d and d['img'] is not None] - - # ----------------------------------------------------------------- - # 3.1 打印所有传感器状态(单行显示) - # ----------------------------------------------------------------- - for data in valid_data: - print(f"S{data['sensor_id']}: " - f"FPS={data['fps']:4.1f} " - f"Fn={data['fnormal']:7.1f}", end=" | ") - if valid_data: - print() # 换行 - - # ----------------------------------------------------------------- - # 3.2 准备网格显示的图像 - # ----------------------------------------------------------------- - imgs = [] - for data in valid_data: - # 绘制光流箭头 - if data['flow'] is not None: - img = orisys.util.draw_arrows( - data['img'].copy(), - data['flow'], - threshold=5 - ) - else: - img = data['img'] - - # 在图像上标注传感器编号 - cv2.putText( - img, - f"S{data['sensor_id']}", - (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, - 0.8, - (0, 255, 0), - 2 - ) - imgs.append(img) - - # ----------------------------------------------------------------- - # 3.3 创建 2x3 网格布局 - # ----------------------------------------------------------------- - if len(imgs) >= 5: - h, w = imgs[0].shape[:2] - - # 创建黑色占位图像(用于第6格) - if len(imgs[0].shape) == 3: - black = np.zeros((h, w, 3), dtype=np.uint8) - else: - black = np.zeros((h, w), dtype=np.uint8) - - # 拼接网格 - # 第一行: 传感器 0, 1, 2 - row1 = np.hstack([imgs[0], imgs[1], imgs[2]]) - # 第二行: 传感器 3, 4, 空 - row2 = np.hstack([imgs[3], imgs[4], black]) - # 合并两行 - grid = np.vstack([row1, row2]) - - # 缩放到适合显示的尺寸 - grid = cv2.resize(grid, (1200, 800)) - cv2.imshow("5 传感器网格视图", grid) - - # 检查退出键 - if cv2.waitKey(1) & 0xFF == ord('q'): - break - - cv2.destroyAllWindows() - - -if __name__ == '__main__': - # Windows 下多进程必需的初始化 - mp.freeze_support() - main() diff --git a/setup.py b/setup.py index 5a4c163..73149ab 100644 --- a/setup.py +++ b/setup.py @@ -9,7 +9,7 @@ if configs_dir.exists(): setup( name="orisys", - version="0.1.0", + version="0.2.0", description="Orisys - Optical Tactile Sensor SDK", author="Your Name", package_dir={"": "src"}, diff --git a/src/orisys/__init__.py b/src/orisys/__init__.py index 2c79c51..edfbfca 100644 --- a/src/orisys/__init__.py +++ b/src/orisys/__init__.py @@ -5,7 +5,7 @@ A Python library for processing and analyzing optical tactile sensor data, including image stitching, optical flow tracking, and deformation decomposition. """ -__version__ = "0.1.0" +__version__ = "0.2.0" __author__ = "Orisys" from .sensor import Sensor