prepare to build

This commit is contained in:
unknown
2025-12-31 10:23:12 +08:00
parent daeb182497
commit fc0025650f
6 changed files with 5 additions and 366 deletions
+3 -3
View File
@@ -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__':
-99
View File
@@ -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()
-128
View File
@@ -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()
-134
View File
@@ -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()
+1 -1
View File
@@ -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"},
+1 -1
View File
@@ -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