> 文档中心 > 使用Vision Master SDK联合C#进行二次开发

使用Vision Master SDK联合C#进行二次开发


目录

前言

一、Vision Master SDK(4.2版本)介绍

二、开发环境配置

2.1.新建工程

2.2添加算子工具引用

2.3添加控件

三、开发过程

3.1方案加载

3.2算法调参

3.3算法执行

3.4结果获取

总结

前言

Vision Master(后简称VM)作为一款功能强大的工业图形图像处理软件,可对工业中遇到的各种图像进行处理,同时还有功能强大的算子以及很全面的例程,作为图像处理的主程序是非常不错的。但是,Vision Master软件依旧有缺陷,就是无法做到复杂图形化界面的建立,故需要和其他软件联合编程才行。因此,VM同步推出了进行二次开发的SDK(Software Development Kit),VM SDK开发理念是以极少的代码实现图像算法的二次开发集成,从而降低视觉开发人员对视觉处理逻辑代码的维护成本。本文即介绍如何用VM SDK和C#进行联合开发。

一、Vision Master SDK(4.2版本)介绍

VM算法平台和VM SDK的区别

VM算法平台是海康机器人自主开发的机器视觉软件,致力于为客户提供快速搭建视觉应用、解决视觉检测难题的算法工具,能满足视觉定位、尺寸测量、缺陷检测以及信息识别等机器视觉应用。

 

VM SDK是基于VM算法平台中的方案、流程和模块工具等进行对象级封装的二次开发工具包,用户可通过VM SDK提供的方案、流程和模块工具中各个对象的功能接口进行相应的数据交互与运行控制。同时提供相应的流程配置控件、参数配置控件、渲染控件、全局工具控件以及前端运行界面控件等,方便进行方案编辑、参数配置以及渲染展示,便于灵活进行开发,并扩展机器视觉应用。VM SDK在安装VM软件后会同步安装在安装路径下的Development文件夹下,并提供了开发文档及丰富的二次开发示例。

 

二、开发环境配置

2.1.新建工程

2.1.1推荐VS2017新建工程(要求VS2013及以上)。

2.1.2生成框架选择.NET Framework 4.6.1及以上

2.1.3项目属性->生成页面【首选32位】去掉勾选。一般情况下新建工程默认是勾选的,需要把勾选取消掉,因为VM里部分算子模块只支持64位的

 

2.2添加算子工具引用

VM SDK的算子工具没有封装成一个整体的库,而是单独分开封装的,这样虽然引用较为繁琐,但是能更加灵活地控制工具的引用,不失为一种优雅的解决方案。同时VM SDK4.2引入了全局程序集缓存(global assembly cache, GAC机制),作用是存放一些有很多程序要用到的公共程序集,如System.Data、System.Windows.Forms等,这样,很多程序就可以从GAC里获得程序集,而不需要再把所有要用到的程序集都拷贝到应用程序的执行目录下,减少了冗余,方便了开发使用。可以通过两种方式添加算子工具的引用。

2.2.1方式1:使用VM SDK提供的引用批导入工具,工具路径为VisionMaster4.2.0\Development\V4.x\ComControls\Tool\ImportRef.exe。首先需要选择新建工程的二级目录(工程配置文件的路径),然后选择需要导入的工具进行批量导入,具体操作步骤参考下图。

 

2.2.2方式2:直接右键项目引用去搜索VM对应的程序集进行引用,需要注意的是有两个必要的引用需要引用(VM.Core.dll和VM.PlatformSDKCS.dll),其它算子工具可以按需引用具体名称可以查看VM提供的开发文档。

 

2.3添加控件

VM SDK提供了丰富的控件供二次开发者使用,开发者可以使用这些控件实现更加灵活的界面布局设计,控件添加方法如下:

  • 打开VS工具箱,【所有Windows窗体】鼠标右击,再点击【选择项】,弹出.NET Framework组件窗口
  • 浏览VM4.2的安装路径文件夹:VisionMaster4.2.0\Development\V4.x\ComControls\Assembly,选择VMControls.Winform.Release.dll,添加后工具箱出现VM相关控件

工具箱中的控件如下所示:

 

  • VmFrontendControl 前端运行界面控件
  • VmGlobalToolControl 全局模块控件
  • VmMainViewConfigControl 主界面控件
  • VmParams 参数配置控件
  • VmParamsConfigWithRender 参数配置带渲染控件
  • VmProcedureConfigControl 流程配置控件
  • VmRealTimeAcqControl 实时取流控件(V4.2新增)
  • VmRenderControl 渲染控件
  • VmSingleModuleSet ConfigControl 独立Group控件(V4.2新增)

三、开发过程

VM SDK开发的载体是方案(VmSolution),且同一台电脑同一时刻只支持一个二次开发进程运行,因此其二次开发是都是围绕VmSolution这个单例开发的,大概开发思路如下图(参考VM二次开发文档)所示:

 

3.1方案加载

VM二次开发方案加载:方案后缀为sol(一般建议在VM软件中创建好算法方案,在二次开发中调用),路径为绝对路径。

VmSolution.Load(“方案路径”);

加载完成后就可以对方案就行操作了,当然VM SDK也提供了用来显示方案的控件(VmProcedureConfigControl 流程配置控件和VmMainViewCongfigControl 主界面控件),无需绑定,只要界面中有这两个中任意控件,加载完方案后会自动绑定显示。如图所示:

 

3.2算法调参

VM二次开发为修改算法参数提供了两种方式:

3.2.1方式1:用自带的参数配置控件( VmParamsConfigControl 参数配置控件、VmParamsConfigWithRenderControl 参数配置带渲染控件)调参。

控件绑定模块代码示例:

IMVSCircleFindModuCs.IMVSCircleFindModuTool circleFindTool = (IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];vmParamsConfigWithRenderControl1.ModuleSource = circleFindTool;

绑定完成控件就会自动填充当前模块的参数配置信息,进行修改即可(注意这里修改的参数并不会实时保存到方案文件里,需要调用方案保存接口才会保存)

 

3.2.2方式2:调用工具类的模块参数对象(ModuParams)提供的接口或Public属性(可以在开发文档中查阅、也可以在VS中进入相关参数类的定义进行查阅)来修改。示例代码如下:

IMVSCircleFindModuCs.IMVSCircleFindModuTool circleFindTool = (IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];circleFindTool.ModuParams.RadNum = 10;

3.3算法执行

VM算法执行方式有多种:二次开发仍然支持VM中配置的硬触发和通讯触发,同时提供了Run接口来支持软触发。软触发示例代码如下:

VmSolution.Instance.Run();

上述的方案Run接口会触发所有流程同时执行一次,当然也提供了单个控制流程/模块执行的方式,需要先实例化需要Run的流程/模块对象然后调用该对象的Run接口即可触发流程/模块执行,示例代码如下:

VmProcedure vmProcess1 = (VmProcedure)VmSolution.Instance["流程1"];vmProcess1.Run();var circleFind = (IMVSCirrleFindModuTool)VmSolution.Instance["流程1.圆查找1"];circleFind.Run();

3.4结果获取

3.4.1渲染结果获取:

方式1:VM SDK提供了渲染控件(vmRemderControl),可以通过给该控件直接绑定流程/模块对象资源来实现相应对象显示设置配置的渲染。示例代码如下:

VmProcedure vmProcess1 = (VmProcedure)VmSolution.Instance["流程1"];vmRenderControl1.ModuleSource = vmProcess1;//绑定模块渲染结果Var circleFind = (IMVSCircleFindModuTool) VmSolution.Instance["流程1.圆查找1"];vmRenderControl1.ModuleSource = circleFind;

需要注意的是:这里的渲染绑定是动态绑定,只需在流程/方案执行前绑定一次即可,后续流程/方案运行时渲染界面会实时更新对应绑定对象的渲染结果(对应的是模块/流程的显示设置信息:图像、形状信息和文字信息)。

 

方式2:自己获取图形或文字数据在VM SDK提供的渲染控件上绘制。示例代码如下:

//设置图像var imageSource = (ImageSourceModuleCs.ImageSourceModuleTool)VmSolution.Instance["流程1.图像源1"];vmRenderControl1.ModuleSource = imageSource;//自定义图形VMControls.WPF.LineEx line = new VMControls.WPF.LineEx();line.StartPointX = 100;line.StartPointY = 100;line.EndPointX = 300;line.EndPointY = 300;line.StrokeThickness = 10;vmRenderControl1.DrawShape(line);//自定义文本VMControls.WPF.TextEx text = new VMControls.WPF.TextEx();text.Content = "欢迎使用VM4.2二次开发!";text.FontSize = 30;text.Position = new System.Windows.Point(100, 100);text.Height = 100;text.Width = 100;text.Stroke = "#FF0000";//设置颜色text.StrokeThickness = 10;vmRenderControl1.DrawShape(text);

3.4.2参数结果获取:需要通过对应工具类的结果对象类获取。

方式1:可以在搭建流程时将流程内的模块结果都绑定到流程的输出设置里,然后统一使用流程对象提供的结果获取接口进行获取。部分接口示例如下:

//通过流程获取结果VmProcedure vmProcess1 = (VmProcedure)VmSolution.Instance["流程1"];string ocrResult = vmProcess1.ModuResult.GetOutputString("out").astStringVal[0].strValue;string ocrNum = vmProcess1.ModuResult.GetOutputInt("out0").pIntVal[0].ToString();

方式2:通过每个工具类的模块结果对象(ModuResult)获取,示例代码如下:

//通过模块获取结果IMVSOcrModuCs.IMVSOcrModuTool ocrTool = (IMVSOcrModuCs.IMVSOcrModuTool)VmSolution.Instance["流程1.字符识别1"];string ocrScore1 = ocrTool.ModuResult.CharNum.ToString();

总结

以上就是今天要讲的内容,本文仅仅简单介绍了VM SDK的使用,而VM SDK提供了大量能使我们快速上手的资料,可以多参考官方提供的开发文档及资源,基本上能实现大部分的开发需求。

附开发资源路径:

  • 开发手册:VisionMaster4.2.0\Development\V4.x\Documentations
  • 开发案例:VisionMaster4.2.0\Development\V4.x\Samples(..\C#\ApplicationDemo为新增的应用案例,包含定位引导、OCR识别和深度学习分类案例)
  • C#(开发支持: Winform、WPF
  • V社区(VM开发者技术园地)链接:https://www.v-club.com/home
  • 资料荟萃链接:https://one.hikvision.com/#/link/XcwZ3QdfwYzO8f6TqlI3 提取密码:kGHn(包含讲义、问答集FAQ和软件Demo等,无需注册,直接下载)

最后附上两张VM二次开发的应用案例图:

 

历史新知