手机号码:15920139670
座 机: 020-31605853
海康威视VisionMaster算法平台如何进行二次开发(C#)
VisionMaster算法平台SDK提供基础接口、展现接口、平台数据接口、平台控制接口,使用该SDK可对接VisionMaster算法平台,灵活地开发和扩展机器视觉应用。SDK提供C/C++和C# 两套接口,同时分别提供两套接口的Demo,可参考Demo查看接口的使用方法。本文主要以C#为例,介绍如何从一个新工程开始,通过调用VisionMaster算法平台SDK的外部接口,实现一个简单的圆定位程序。
一、环境配置
- 首先新建一个WindowsFormsApplication 工程,将二次开发 SDK 的 DLL 文件添加至引用,如图1-1所示。
图1-1 DLL添加至引用
- 将二次开发相关 DLL 文件添加到 Demo 软件的工作目录下,相关DLL可在VisionMaster安装路径的4.0\Development\Libraries中找到,需注意对应的平台位数。如图1-2。
- 导入二次开发 SDK C#接口名称空间 using iMVS_6000PlatformSDKCS。若使用同步接口,则需导入名称空间 using iMVS_6000PlatformSDKCS.SyncPlatformSDKCS。
此时,VisionMaster二次开发的环境已配好。
二、接口的调用
- 接口调用流程
VisionMaster接口主要分为基础接口、展现接口、平台数据接口、平台控制接口,一个完整的二次开发接口调用如图2-1所示。
2-1 接口调用流程
- 按照上面流程,首先创建句柄,创建句柄接口可放在窗体加载函数中,如图2-2所示
图2-2 创建句柄
注意:当VisionMaster启动后,界面软件异常退出时VisionMaster并没有退出,依然在后台,此时创建句柄会导致失败,需要手动关闭VisionMaster进程后再创建句柄。或者可在创建句柄接口前判断进程程序强杀VisionMaster防止此类情况。
- 注册回调函数。VisionMaster二次开发是通过回调的方式将算法平台底层运行时的数据反馈给用户,目前包括①按数据类型,②以模块结构体方式,③只回调用户在界面上配置的所需的导出结果,三种回调方式,这里以较为常用的以模块结构体方式为例进行开发。
图2-3 注册回调函数
然后添加回调委托函数和数据接收函数,如图2-4,图2-5。
图2-4 回调委托函数
在回调委托函数中,我们可以通过筛选ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO struInfo. nInfoType来获取到以下内容,具体可参考VisionMaster安装目录下demo,本文不再举例。
图2-5 接收回调结果函数
具体的模块数据我们可以通过添加接收函数来筛选获取,这里我们暂时先不添加。
至此,注册回调函数已经完成。
- 搭建如图2-6的界面。VisionMaster的图像显示及结果渲染有两种方式:①通过回调获取图像数据,结果数据后,使用C#的Drawing类绘制到PictureBox控件中;②通过提供的嵌入前端界面接口将VisionMaster方案中的前端运行界面嵌入到PictureBox控件或者ElementHost控件中,这样图像源及渲染结果数据只需在VM中配置好,无需再从回调中获取。本文以嵌入前端界面为例来开发。
图2-6 界面搭建
- 控件功能实现部分添加。
启动按钮:在本文示例中,我们将启动按钮的实现部分分为3部:①启动VisionMaster,②加载Sol方案,③嵌入前端界面。
如图2-7,首先,通过调用IMVS_PF_StartVisionMaster_CS接口来启动VisionMaster,然后通过调用IMVS_PF_LoadSolution_CS加载方案,最后通过IMVS_PF_AttachFrontedWnd_CS嵌入前端界面。
图2-7 启动按钮功能实现
执行一次按钮:目前执行一次有IMVS_PF_ExecuteOnce_CS和IMVS_PF_ExecuteOnce_V30_CS接口,区别为IMVS_PF_ExecuteOnce_CS接口会触发所有流程,而IMVS_PF_ExecuteOnce_V30_CS可以触发指定流程(流程1为10000,流程2为10001,以次后推)。
图2-8 运行一次按钮实现代码
关闭VM按钮:通过调用IMVS_PF_CloseVisionMaster_CS接口实现VisionMaster的关闭。
图2-9 关闭VM按钮实现代码
至此,整体软件流程已完成。
三、方案搭建。
- 首先,我们使用VisionMaster搭建好找圆的视觉方案,如图3-1.
图3-1 VisionMaster方案。
然后在运行界面这里进行数据配置,绑定好需要渲染的模块结果并保存,如图3-2.
3-2 前端界面绑定数据
- 然后我们在之前的回调接收数据函数中添加相关代码,从圆查找模块中获取所有运行结果,提取出x,y,半径的运行结果,如图3-3。本文是通过判断struResultInfo.strModuleName的方式筛选需要获取结果的模块,需要其他模块结果同理,只需将MODU_NAME_CIRCLEFINDMODU替换为想要的模块就可以了。
图3-3从圆查找模块中获取所有运行结果
四、最终软件效果如图4-1所示。
图4-1 软件效果