(一)DepthAI-python相关接口:OAK Device

消息快播:OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~

编辑:OAK中国
首发:oakchina.cn
喜欢的话,请多多⭐️✍
内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。

▌前言

Hello,大家好,这里是OAK中国,我是助手君。

最近在知乎看到有朋友写了depthai python接口相关的内容,内容非常不错。我整理了一下,分享给大家。

本系列一共四篇博客,原文出处:石满@知乎。

▌Device API

(一)DepthAI-python相关接口:OAK Device_第1张图片

import depthai as dai

Example样例

Device对象指的是一个OAK设备。当启动一个oak设备时,会上传一个Pipeline管道,该管道会在VPU上运行,当用代码创建设备时,固件、管道和其他资源(NN blobs)会被一起上传。

pipeline = depthai.Pipeline()

# 创建节点,配置并连接他们

# 上传一个管道到设备上
with depthai.Device(pipeline) as device:
  print('MxId:',device.getDeviceInfo().getMxId()) # Myraid X id
  print('USB speed:',device.getUsbSpeed())  # usb 传输速度 
  print('Connected cameras:',device.getConnectedCameras())  # 相机

  # 输入队列,主机传输数据到设备
  input_q = device.getInputQueue("input_name", maxSize=4, blocking=False)

  # 输出队列,设备传输数据到主机
  output_q = device.getOutputQueue("output_name", maxSize=4, blocking=False)

  while True:
      # 获取输出队列中一条信息
      output_q.get() # Or output_q.tryGet() for non-blocking

      # 向设备发送一条消息
      cfg = depthai.ImageManipConfig()
      input_q.send(cfg)

Queue队列

对设备进行初始化后,必须进行输入/输出队列的初始化,这些队列将会位于主机上。

outputQueue = device.getOutputQueue("output_name")
inputQueue = device.getInputQueue("input_name")

定义一个输出队列后,设备会一直输出新的信息,主机也会一直读取它。通常情况下,主机读取队列的速度更快,导致大部分时间,队列是一个空的状态。但当主机同事在做其他程序,设备写入的速度快于主机读取的速度,在队列中的信息会增加,maxSize、blocking两个参数决定了队列的行为。

# 初始化
queue = device.getOutputQueue(name="name", maxSize=5, blocking=False)

# Or afterwards
queue.setMaxSize(10)
queue.setBlocking(True)
  • 一般情况下不需要考虑,但当主机内存很小的情况下,需要设置最大队列尺寸。 仅需要最新的结果,以前的不要紧, maxSize=1, blocking=False
  • 30fps代表一帧大约需要33ms,如果主机处理一帧在这个范围内,maxSize=1,2代表处理一帧需要66ms
  • 如对间隔内获取的数据有需要,可以进行具体设置,如DetectionNetwork网络需要检查最近1s内的结果,maxSize=30,blocking=False(假设DetectionNetwork网络处理速度为30fps)
  • blocking=True 仅当信息之间正确的顺序被需要的时候, 例如:匹配直通帧和原始帧, 编码等

Blocking or Non-Blocking 堵塞与否

默认情况下,maxSize=30,blocking=True。所以当设备填满一个队列,且达到上限,其他任何来自设备的消息将被堵塞,等主机处理完一个消息后,才会将新的消息输入队列。

当blocking=False,将改变上述等待的行为,库将会丢弃最老的信息,并增加新的到队列上,继续其处理循环,maxSize决定了队列的尺寸,并会帮助控制主机内存的使用。例如一条5MB的数据,队列尺寸为30, 那么这条队列在主机中占用150MB的数据内存。

附加信息

  • maxSize=1, blocking=False, 代表仅需要队列中的最新信息
  • 队列是线性安全,可从任何线程中访问它们
  • 队列创建时,每个队列是自己的线程,负责接受、序列化、反序列化,传输信息
  • Device对象不是完全的线程安全

▌参考资料

https://docs.oakchina.cn/en/latest/
https://www.oakchina.cn/selection-guide/


OAK中国
| OpenCV AI Kit在中国区的官方代理商和技术服务商
| 追踪AI技术和产品新动态

戳「+关注」获取最新资讯↗↗

你可能感兴趣的:(OAK使用教程,OAK相机,depthai,人工智能,计算机视觉)