❶【DepthAI API】为 getOutputQueue 方法指定参数【OAK深度相机】
编辑: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
选项主要在需要正确的消息顺序时使用。两个例子是:
- 匹配直通帧及其原始帧(例如,完整的 4K 帧和进入 NN 的较小预览帧),
- 编码(最突出的是H264/H265,因为丢帧会导致伪影)。
▌阻塞行为
默认情况下,队列是阻塞的,其大小为 30,因此当设备填满队列并达到限制时,来自设备的任何其他消息都将被阻塞,库将等待直到它可以将新消息添加到队列中。在将新消息放入队列之前,它将等待主机使用(例如 queue.get()
)一条消息。
主机队列填满后,设备上的 XLinkOut.input队列将开始填满。如果该队列设置为阻塞,则向其发送消息的其他节点也将不得不等待。这是管道阻塞的常见原因,其中一个队列没有及时清空,管道的其余部分等待它再次清空。
▌非阻塞行为
使队列非阻塞将改变上述情况下的行为 - 库将丢弃最旧的消息并将新消息添加到队列,然后继续其处理循环(因此不会被阻塞)而不是等待)。maxSize
决定了队列的大小,也有助于控制内存的使用。
例如,如果一条消息有 5MB 的数据,队列大小为 30,则此队列可以有效地在主机内存中存储多达 150MB 的数据(消息也可以变得非常大,例如,单个 4K NV12 编码帧大约需要 12MB)。
▌一些额外的信息
- 将队列大小减小到 1 并设置非阻塞行为将有效地意味着 “我只想要队列中的最新数据包”。
- 队列是线程安全的 —— 它们可以从任何线程访问。
- 创建队列时,每个队列都是自己的线程,负责接收、序列化 / 反序列化和向前发送消息(输入 / 输出队列也是如此)。
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技术和产品新动态
戳「+关注」获取最新资讯↗↗
相关文章
- IDEA使用模板自动生成类注释和方法,解决方法注释在接口中或普通类的方法外使用模板注释不带参数的情况
- c语言tinyxml使用方法,TinyXml使用方法[通俗易懂]
- api接口对接_接口API
- Python 技巧篇-pip卸载python库实例演示,查看pip命令大全方法[通俗易懂]
- 【说站】python如何重写start_requests方法
- 安卓开发 | WearOS包com.ticwear:mobvoi-api无法拉取的一个解决方法
- JAVA以UTF-8导出CSV文件,用excel打开产生乱码的解决方法
- 教你远程连接SQL Server 2014数据库的方法
- Ubuntu系统日志配置 /var/log/messages的方法
- Java数组去掉重复的方法集详解编程语言
- Spring 自动装配;方法注入详解编程语言
- Hibernate Query接口 setDate方法:绑定映射类型为Date的参数
- Linux内核API手册:实现技术最新突破(linux内核api手册)
- Linux查看内存大小的简便方法(linux获取内存大小)
- MySQL数据库API: 打开新世界的大门(mysql数据库api)
- MySQL异步API:为高性能加载提升极限(mysql异步api)
- 时间Java中Redis设置过期时间的方法(redisjava过期)
- MySQL中文API:数据操作更便捷(mysql中文api)
- 使用MSSQL的API实现更佳的数据库管理(mssql的api)
- API控制MySQL数据库快速便捷(api控制mysql)
- 深入C#任务管理器中应用程序选项隐藏程序本身的方法详解
- Android界面刷新的方法分享
- Javascript拓展String方法小结
- C#将时间转成文件名使用方法