prepare to build
This commit is contained in:
@@ -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__':
|
||||
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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"},
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user