消息快播:OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~
编辑:OAK中国
首发:oakchina.cn
喜欢的话,请多多👍⭐️✍
内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。
▌前言
Hello,大家好,这里是OAK中国,我是助手君。
最近在知乎看到有朋友写了depthai python接口相关的内容,内容非常不错。我整理了一下,分享给大家。
本系列一共四篇博客,原文出处:石满@知乎。
▌Device API
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技术和产品新动态
戳「+关注」获取最新资讯↗↗