【背景介绍】
一些高节拍的应用场景,对VM方案耗时稳定性要求较高。由于相机的图像缓存是有上限的,若流程耗时大于相机取图的节拍,缓存满了就会溢出,从而出现丢帧的情况,即漏拍问题。
若流程中存在“输出图像”存图的模块,如存NG图,“输出图像”模块自身会存在一定耗时,尤其是连续存图时,该模块耗时会增加(存图耗时与电脑硬盘读写速度、图像分辨率大小等有关)。
为了避免由于“输出图像”模块自身耗时导致方案整体耗时超过检测节拍,考虑使用“数据队列”的的方式,新增一个流程进行异步存图,以减少“输出图像”模型耗时对方案带来的影响。
【方式说明】
- 同步存图:存图功能与检测功能在同一个流程进行。如下图所示,方案使用“条件分支”存NG图,存图时,流程耗时增加;
- 异步存图:存图功能与检测功能不在同一个流程进行,使用数据队列的方式中转存图,操作方法如下。
【操作方式】
1、新建存图流程及数据队列
a)新建一个空流程,该流程后面负责存图功能;
b)在“全流程”界面,新建一个数据队列;
c)将数据队列通过连线的方式,接到新建的存图流程上。
d)编辑数据队列:增加IMAGE的队列列数,增加异步触发流程;(异步触发实现方式参考后面补充说明)
2、检测流程修改
a)删除原本的“输出图像”模块;
b)新增发生数据模块,将想要存的图发送给数据队列。
3、存图流程修改
a)使用“接收数据”模型接收输出队列的图像信息;
b)使用“输出图像”模块进行存图。
【运行耗时对比】


从图像上可以看到,使用异步存图的方式,检测流程耗时的稳定性有所提高。
【补充说明】
1、异步存图方式,检测流程使用“发送数据”将图像发给全局变量,该模块也是有耗时的,只不过该耗时要远小于“输出图像”,故可以减少存图耗时增加,而不是完全没有增加,耗时最好留有一定空间冗余。
2、“数据队列中”,图像队列行数默认是10,若存图较频繁,建议适当增加该参数,最大是20。
3、一个“数据队列”的IMAGE类型的数据队列最多支持添加4个。
4、触发流程分为同步触发和异步触发,通过是否开启异步触发进行设置。
a)同步触发:当有数据进入数据队列时,若满足触发条件,则触发流程执行,无论成功与否,本次触发结束;若不满足,则不触发流程执行。优点为可及时触发流程执行,缺点为一旦触发失败只能等待下次数据入队。
b)异步触发:新建数据队列模块时,会创建该模块的子线程。子线程一直处于运行中状态,每隔一定时间判断是否满足触发条件。若满足,则触发流程执行;若不满足,则不触发流程执行。优点为触发失败时不用等下次数据入队,间隔一段时间后可继续触发流程执行。缺点为存在时间等待,触发流程执行可能存在延时。