VisionMaster(后简称VM)作为一款功能强大的工业图像算法平台,可对工业中遇到的各种图像进行处理,同时拥有性能强大的算子以及丰富的教学例程,作为图像处理的通用平台是非常不错的选择。但Vision Master软件依旧有不足,就是难以配置复杂或定制化的图形界面,故需要结合其他软件联合编程开发。因此,VM同步推出面向对象编程的平台SDK(Software Development Kit)开发。VM SDK开发理念是以极少的代码实现视觉软件的集成开发,从而降低视觉开发人员对视觉处理逻辑代码的维护成本。本文将详细介绍如何使用VM SDK联合C#二次开发。
VM算法平台和VM SDK的区别
VM算法平台是海康机器人自主开发的机器视觉软件,致力于为客户提供快速搭建视觉应用、解决视觉检测难题的算法工具,能满足视觉定位、尺寸测量、缺陷检测以及信息识别等机器视觉应用。
VM SDK是基于VM算法平台中的方案、流程和模块工具等进行对象级封装的二次开发工具包,用户可通过VM SDK提供的方案、流程和模块工具中各个对象的功能接口进行相应的数据交互与运行控制。同时提供相应的流程配置控件、参数配置控件、渲染控件、全局工具控件以及前端运行界面控件等,方便进行方案编辑、参数配置以及渲染展示,便于灵活进行开发,并扩展机器视觉应用。VM SDK在安装VM软件后会同步安装在安装路径下的Development文件夹下,并提供了开发文档及丰富的二次开发示例。
VM SDK开发的载体是方案(VmSolution),且同一台电脑同一时刻只支持一个二次开发进程运行,因此其二次开发是都是围绕VmSolution这个单例开发的,大概开发思路如下图(参考VM二次开发文档)所示:
VM二次开发方案加载: 方案后缀为sol(一般建议在VM软件中创建好算法方案,在二次开发中调用),路径为绝对路径。
VmSolution.Load(“方案路径”);
加载完成后就可以对方案进行操作了,当然VM SDK也提供了用来显示方案的控件(VmProcedureConfigControl 流程配置控件和VmMainViewCongfigControl 主界面控件),无需绑定,只要界面中有这两个中任意控件,加载完方案后会自动绑定显示,如图所示为实际加载效果。
VM二次开发为修改算法参数提供了两种方式:
2.2.1 方式1: 用自带的参数配置控件( VmParamsConfigControl 参数配置控件、VmParamsConfigWithRenderControl 参数配置带渲染控件)调参。
控件绑定模块代码示例:
IMVSCircleFindModuCs.IMVSCircleFindModuTool circleFindTool = (IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
vmParamsConfigWithRenderControl1.ModuleSource = circleFindTool;
绑定完成后,控件就会自动填充当前模块的参数配置信息,然后进行修改即可(注意这里修改的参数并不会实时保存到方案文件里,需要调用方案保存接口才会保存)。
2.2.2 方式2: 调用工具类的模块参数对象(ModuParams)提供的接口或Public属性(可以在开发文档中查阅、也可以在VS中进入相关参数类的定义中进行查阅)来修改。示例代码如下:
IMVSCircleFindModuCs.IMVSCircleFindModuTool circleFindTool = (IMVSCircleFindModuCs.IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
circleFindTool.ModuParams.RadNum = 10;
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();
2.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);
2.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安装包里提供了大量能使我们快速上手的开发文档及示例Demo,用户也可以参考官方提供的开发资源,利用好这些资源基本能实现大部分的开发需求。
附开发资源路径:
原网址: 访问
创建于: 2023-08-30 10:13:37
目录: default
标签: 无
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论