Files
orisys-sdk/example1_basic.py
T
2025-12-28 18:52:55 +08:00

113 lines
4.1 KiB
Python

"""
示例 1: 基础用法 - 单传感器同步处理
本示例演示 OrisysSensor 的基本使用流程:
1. 初始化传感器(视频文件或摄像头)
2. 循环获取图像并计算形变
3. 读取各类传感器数据
4. 可视化显示
适用场景:单传感器、简单应用、学习入门
"""
import os
os.environ["OPENCV_VIDEOIO_MSMF_ENABLE_HW_TRANSFORMS"] = "0" # Windows 下禁用硬件加速,避免兼容性问题
import cv2
import orisys
def main():
# =========================================================================
# 1. 初始化传感器
# =========================================================================
# 参数说明:
# vid_src: 视频源,可以是文件路径(如 "./s1.mp4")或摄像头索引(如 0)
# isstitch: 是否启用复眼拼接模式(多单元传感器需要开启)
# cuda: 是否使用 CUDA GPU 加速(需要 CuPy 和 CUDA 支持)
# verbose: 是否打印详细初始化日志
# 方式1: 从视频文件读取
sensor = orisys.Sensor("./s1.mp4", isstitch=True, cuda=True, verbose=True)
# 方式2: 从摄像头读取(取消注释使用)
# sensor = orisys.Sensor(0, isstitch=True, cuda=True, verbose=True)
print("\n按 'q' 退出程序,按 'r' 重置光流追踪器")
# =========================================================================
# 2. 主循环:获取图像 → 计算形变 → 读取数据 → 显示
# =========================================================================
while True:
# 步骤 2.1: 获取并拼接图像
sensor.get_img()
# 步骤 2.2: 计算形变场
sensor.compute_deformation()
# 步骤 2.3: 读取传感器数据
# read_info() 支持以下数据类型:
# 向量场数据:
# - VRAW: 原始光流场 (H, W, 2) 的 numpy 数组
# - VNORMAL: 法向分量场
# - VSHEAR: 切向分量场
# 标量数据:
# - FNORMAL: 法向力总和(正压力)
# - FSHEARX: X方向切向力
# - FSHEARY: Y方向切向力
# 其他:
# - FPS: 当前帧率
# - TIMESTAMP: 时间戳字符串
fps, fn, fx, fy, flow = sensor.read_info(
sensor.info.FPS,
sensor.info.FNORMAL,
sensor.info.FSHEARX,
sensor.info.FSHEARY,
sensor.info.VRAW
)
# 打印力的数值
print(f"FPS: {fps:5.1f}, 法向力: {fn:8.2f}, 切向力X: {fx:8.2f}, 切向力Y: {fy:8.2f}")
# =====================================================================
# 3. 可视化显示
# =====================================================================
# 绘制光流箭头图
# 参数说明:
# img: 背景图像
# flow: 光流场
# threshold: 显示阈值(小于此值的箭头不显示)
# grid_spacing: 箭头网格间距(像素)
# arrow_scale: 箭头缩放比例
arrows = orisys.util.draw_arrows(
sensor.img.copy(), # 使用 copy() 避免修改原图
flow,
threshold=5,
grid_spacing=40,
arrow_scale=1.0
)
cv2.imshow("形变场 Deformation", arrows)
# =====================================================================
# 4. 键盘控制
# =====================================================================
key = cv2.waitKey(1) & 0xFF
if key == ord("q"):
print("\n退出程序...")
break
if key == ord("r"):
# 重置光流追踪器(当追踪漂移时使用)
sensor.reset()
print("光流追踪器已重置")
# =========================================================================
# 5. 清理资源
# =========================================================================
sensor.disconnect() # 释放视频源和相关资源
cv2.destroyAllWindows()
if __name__ == '__main__':
main()