编辑:OAK中国
首发:oakchina.cn
喜欢的话,请多多⭐️✍
内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。
Hello,大家好,这里是OAK中国,我是助手君。
我又开了一个新专栏啦!DepthAI API说明
现在API里的内容都是英文的,全翻译了话,我的工作量有点太大了!所以,我决定开这个新专栏,专门写大家问的多的一些API使用!好用的话,请三连支持一下!
获取输出队列时(下面的示例代码), maxSize
和 blocking
参数应根据消息的使用方式进行设置,其中 name
是输出流的名称。
由于队列在主机上,因此内存 (RAM) 通常并不稀缺。但是,如果你使用的是像 RPI Zero 这样只有 0.5GB RAM 的小型 SBC,你可能还需要指定最大队列大小。
with dai.Device(pipeline) as device:
queueLeft = device.getOutputQueue(name="manip_left", maxSize=8, blocking=False)
如果只有最新的结果是相关的而以前的结果无关紧要,则可以设置 maxSize = 1
和 blocking = False
。这样只会保留最新的消息( maxSize = 1
)并且它也可能被覆盖以避免等待主机处理每一帧,从而只提供最新的数据( blocking = False
)。但是,如果有大量丢弃 / 覆盖的帧,因为主机无法足够快地处理它们(例如,执行一些繁重计算的单线程环境), maxSize
可以设置为更高的数字,这将增加队列大小并减少丢帧数。具体来说,在 30 FPS 下,每~33 毫秒接收一个新帧,因此如果您的主机能够在那个时间内处理一个帧,则可以将 maxSize
设置为 1
,否则为 2
处理时间到 66ms 等等。
但是,如果需要在检索消息之间有一些等待时间间隔,则可以指定不同的方式。一个示例是根据某些其他事件检查最后 1 秒内 DetectionNetwork
的结果,在这种情况下,可以设置 maxSize = 30
和 blocking = False
(假设 DetectionNetwork
以约 30FPS 的速度生成消息)。
blocking = True
选项主要在需要正确的消息顺序时使用。两个例子是:
默认情况下,队列是阻塞的,其大小为 30,因此当设备填满队列并达到限制时,来自设备的任何其他消息都将被阻塞,库将等待直到它可以将新消息添加到队列中。在将新消息放入队列之前,它将等待主机使用(例如 queue.get()
)一条消息。
主机队列填满后,设备上的 XLinkOut.input队列将开始填满。如果该队列设置为阻塞,则向其发送消息的其他节点也将不得不等待。这是管道阻塞的常见原因,其中一个队列没有及时清空,管道的其余部分等待它再次清空。
使队列非阻塞将改变上述情况下的行为 - 库将丢弃最旧的消息并将新消息添加到队列,然后继续其处理循环(因此不会被阻塞)而不是等待)。maxSize
决定了队列的大小,也有助于控制内存的使用。
例如,如果一条消息有 5MB 的数据,队列大小为 30,则此队列可以有效地在主机内存中存储多达 150MB 的数据(消息也可以变得非常大,例如,单个 4K NV12 编码帧大约需要 12MB)。
Device
对象不是完全线程安全的。一些 RPC 调用(例如 getLogLevel
、 setLogLevel
、 getDdrMemoryUsage
)在设置了互斥体后将获得线程安全(现在可能存在竞争)。https://docs.oakchina.cn/projects/api/components/device.html#specifying-arguments-for-getoutputqueue-method
https://docs.oakchina.cn/en/latest/
https://www.oakchina.cn/selection-guide/
OAK中国
| OpenCV AI Kit在中国区的官方代理商和技术服务商
| 追踪AI技术和产品新动态
戳「+关注」获取最新资讯↗↗