从零开始:如何使用VM3.4接口进行二次开发(C#)
VM算法平台SDK提供基础接口、展现接口、平台数据接口、平台控制接口,使用该SDK可对接VM算法平台,灵活地开发和扩展机器视觉应用。SDK提供C/C++和C# 两套接口,同时分别提供两套接口的Demo,可参考Demo查看接口的使用方法。本文主要以C#为例,介绍如何从一个新工程开始,通过调用VM算法平台3.4 SDK的外部接口,实现一个简单的圆定位程序。

一、环境配置
1. 首先新建一个WindowsFormsApplication 工程,将二次开发 SDK 的 DLL 文件添加至引用,如图1-1所示。


图1-1 DLL添加至引用


2. 将二次开发相关 DLL 文件添加到 Demo 软件的工作目录下,相关DLL可在VM算法平台安装路径的VisionMaster3.4.0\Development\Libraries中找到,需注意对应的平台位数,如图1-2。



图1-2 路径选择


3.导入二次开发 SDK C#接口名称空间 using iMVS_6000PlatformSDKCS。若使用同步接口,则需导入名称空间 using iMVS_6000PlatformSDKCS.SyncPlatformSDKCS。


此时,VM算法平台二次开发的环境已配好。


二、接口的调用
1. 接口调用流程

VM算法平台接口主要分为基础接口、展现接口、平台数据接口、平台控制接口,一个完整的二次开发接口调用如图2-1所示。



图2-1 二次开发接口调用流程图


2. 创建句柄

按照上面流程,首先创建句柄,创建句柄接口可放在窗体加载函数中,如图2-2所示。


图2-2 创建句柄


注意:当VM算法平台启动后,界面软件异常退出时VM算法平台并没有退出,依然在后台,此时创建句柄会导致失败,需要手动关闭VM算法平台进程后再创建句柄。或者可在创建句柄接口前判断进程程序强杀VM算法平台防止此类情况。


3.注册回调函数

VM算法平台二次开发是通过回调的方式将算法平台底层运行时的数据反馈给用户,目前包括三种回调方式:①按数据类型、②以模块结构体方式、③只回调用户在界面上配置的所需的导出结果,这里以较为常用的以模块结构体方式为例进行开发。




图2-3 注册回调函数


然后添加回调委托函数和数据接收函数,如图2-4,图2-5。


图2-4 回调委托函数


在回调委托函数中,我们可以通过筛选ImvsSdkPFDefine.IMVS_PF_OUTPUT_PLATFORM_INFO struInfo. nInfoType来获取到以下内容,具体可参考VM算法平台安装目录下demo,本文不再举例。



图2-5 接收回调结果函数


具体的模块数据我们可以通过添加接收函数来筛选获取,这里我们暂时先不添加。
至此,注册回调函数已经完成。


4.搭建如图2-6的界面

VM算法平台的图像显示及结果渲染有两种方式:①通过回调获取图像数据,结果数据后,使用C#的System.Drawing类绘制到PictureBox控件中;②通过提供的嵌入前端界面接口将VM算法平台方案中的前端运行界面嵌入到PictureBox控件或者ElementHost控件中,这样图像源及渲染结果数据只需在VM中配置好,无需再从回调中获取。本文以嵌入前端界面为例来开发。


图2-6 界面搭建


5.控件功能实现部分添加

启动按钮:在本文示例中,我们将启动按钮的实现部分分为3步:①启动VM算法平台,②加载Sol方案,③嵌入前端界面。
如图2-7,首先,通过调用IMVS_PF_StartVisionMaster_CS接口来启动VM算法平台,然后通过调用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接口实现VM算法平台的关闭。


图2-9 关闭VM按钮实现代码


至此,整体软件流程已完成。


三、方案搭建
1. 首先,我们使用VM算法平台搭建好找圆的视觉方案,如图3-1。


图3-1 VM算法平台方案


然后在运行界面这里进行数据配置,绑定好需要渲染的模块结果并保存,如图3-2。


图3-2 前端界面绑定数据


2. 然后我们在之前的回调接收数据函数中添加相关代码,从圆查找模块中获取所有运行结果,提取出x,y,半径的运行结果,如图3-3。本文是通过判断struResultInfo.strModuleName的方式筛选需要获取结果的模块,需要其他模块结果同理,只需将MODU_NAME_CIRCLEFINDMODU替换为想要的模块就可以。


图3-3 从圆查找模块中获取所有运行结果


四、软件效果

最终软件效果如图4-1所示。


图4-1 软件效果

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:tech_support@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
点赞 1
收藏 0
评论请先登录 登录
全部评论 1
学习了
2021-11-30 09:46:20
  • 1
Vuser_qing
3
创作
4
粉丝
7
获赞
相关阅读

    请升级浏览器版本

    您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

    推荐使用以下浏览器