113 lines
4.1 KiB
Python
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=False, 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()
|