海康VM应用FAQ 1.1 异步存图操作说明

【背景介绍】

        一些高节拍的应用场景,对VM方案耗时稳定性要求较高。由于相机的图像缓存是有上限的,若流程耗时大于相机取图的节拍,缓存满了就会溢出,从而出现丢帧的情况,即漏拍问题。

        若流程中存在“输出图像”存图的模块,如存NG图,“输出图像”模块自身会存在一定耗时,尤其是连续存图时,该模块耗时会增加(存图耗时与电脑硬盘读写速度、图像分辨率大小等有关)。

        为了避免由于“输出图像”模块自身耗时导致方案整体耗时超过检测节拍,考虑使用“数据队列”的的方式,新增一个流程进行异步存图,以减少“输出图像”模型耗时对方案带来的影响。

【方式说明】

  • 同步存图:存图功能与检测功能在同一个流程进行。如下图所示,方案使用“条件分支”存NG图,存图时,流程耗时增加;

        

  • 异步存图:存图功能与检测功能不在同一个流程进行,使用数据队列的方式中转存图,操作方法如下。

【操作方式】

1、新建存图流程及数据队列

  a)新建一个空流程,该流程后面负责存图功能;

  b)在“全流程”界面,新建一个数据队列;

  c)将数据队列通过连线的方式,接到新建的存图流程上。

  d)编辑数据队列:增加IMAGE的队列列数,增加异步触发流程;(异步触发实现方式参考后面补充说明)

  ​​​

2、检测流程修改

          a)删除原本的“输出图像”模块;

          b)新增发生数据模块,将想要存的图发送给数据队列。

3、存图流程修改

        a)使用“接收数据”模型接收输出队列的图像信息;

        b)使用“输出图像”模块进行存图。

【运行耗时对比】

图1  异步存图检测流程耗时

  

图2  同步存图检测流程耗时

                                                     

从图像上可以看到,使用异步存图的方式,检测流程耗时的稳定性有所提高。

【补充说明】

1、异步存图方式,检测流程使用“发送数据”将图像发给全局变量,该模块也是有耗时的,只不过该耗时要远小于“输出图像”,故可以减少存图耗时增加,而不是完全没有增加,耗时最好留有一定空间冗余。

2、“数据队列中”,图像队列行数默认是10,若存图较频繁,建议适当增加该参数,最大是20。

3、一个“数据队列”的IMAGE类型的数据队列最多支持添加4个。

4、触发流程分为同步触发和异步触发,通过是否开启异步触发进行设置。

a)同步触发:当有数据进入数据队列时,若满足触发条件,则触发流程执行,无论成功与否,本次触发结束;若不满足,则不触发流程执行。优点为可及时触发流程执行,缺点为一旦触发失败只能等待下次数据入队。

b)异步触发:新建数据队列模块时,会创建该模块的子线程。子线程一直处于运行中状态,每隔一定时间判断是否满足触发条件。若满足,则触发流程执行;若不满足,则不触发流程执行。优点为触发失败时不用等下次数据入队,间隔一段时间后可继续触发流程执行。缺点为存在时间等待,触发流程执行可能存在延时。

### 海康威视VM像与HALCON像格式互转 为了实现海康威视VisionMaster (VM) 像与 HALCON 像之间的相互转换,可以采用中间媒介的方式完成这一过程。具体来说,可以通过文件储作为桥梁,在两个不同的库之间传递像数据。 #### 将 VM 图片转换为 Halcon 图片 当从 VisionMaster 获取到像后,先将其保存为常见的像格式文件(如 BMP, JPG),再通过 HALCON 的读取函数加载该文件成为 HObject 类型的对象。 ```csharp // C# 代码片段用于导出 VM 像至本地磁盘 vmRenderControl.SaveOriginalImage("C:\\temp\\image_from_vm.bmp"); ``` 接着利用 HALCON API 来载入这张临时保存下来的图片: ```cpp #include <halcon.h> using namespace HalconCpp; try { // 使用 HALCON 函数读取由 VM 储的位文件 HObject ho_Image; ReadImage(ho_Image, L"C:\\temp\\image_from_vm.bmp"); } catch (HException &e){ std::cout << e.ErrorMessage() << std::endl; } ``` #### 将 Halcon 图片转换为 VM 图片 相反方向的操作同样遵循类似的逻辑——即先把 HALCON 中处理过的像写入硬盘上的某个位置,之后让 VisionMaster 去读取这个外部资源。 ```cpp // 利用 HALCON 库将像对象写出成文件形式 WriteImage(Image, "bmp", 0, 1, L"C:\\temp\\image_for_vm.bmp"); ``` 随后可以在 C# 程序里调用相应接口加载此文件进入 VM 控制组件中显示或者进一步加工: ```csharp // 加载之前由 HALCON 创建并储于指定路径下的像文件给 VM 显示控件 vmRenderControl.LoadImageFromFile("C:\\temp\\image_for_vm.bmp"); ``` 值得注意的是上述过程中涉及到跨平台的数据交换可能会带来兼容性和效率方面的问题;因此建议尽可能在同一框架内部解决问题以减少不必要的开销[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值