【VIsion Master】机器视觉软件二次开发(C#版本)学习笔记

0.前言

最近接手新项目,用海康威视旗下的HIK ROBOT Vision Master机器视觉软件做二次开发相关的项目,写一篇博客记录一下学习过程。
参考视频:https://www.bilibili.com/video/BV1tq4y1j7RP?p=1
其他参考资料:软件自带的开发文档。

IDE:VS 2022
语言:C#、C++
框架:dotNET Framework 4.6.1
软件版本:VM 4.3.0(本文都用VM缩写代指Vision Master)

1.配置环境

新建一个winForm工程,右击工程属性,目标框架修改为:.NET Framework 4.6.1。
在生成中,目标平台首选32位取消勾选,输出路径绑定为:D:\Program Files\VisionMaster4.3.0\Applications。

打开App.config配置文档,再去VisionMaster4.3.0\Applications中找到VisionMaster.exe.config,将全部内容复制到App.config中替换。
#1 添加新控件

切换到设计窗口,找到工具箱,右击Windows所有窗体,点击选择项,点击浏览去刚才的Applications文件夹中找这个库:VisionMaster4.3.0\Development\V4.x\ComControls\Assembly\VMControls.Winform.Release.dll,会自动导入一些控件:

在这里插入图片描述
回到VS的工具箱中,可以看到新增控件:
在这里插入图片描述
下面是, 链接各种库文件DLL

在引用中,添加动态链接库和依赖库。开发文档中提供了两种引入方式:手动添加和小工具一键导入。
推荐第二种,先只添加基础库测试:

在这里插入图片描述

回到VS中:
在这里插入图片描述

重新加载后,多了这些链接项,也可以手动加入
在这里插入图片描述

2.新建VM工程和写入功能测试

在这里插入图片描述
将这个工程保存到本地,后缀名为.sol文件。
回到VS 2022,在winForm中拖入一个VmRenderControl控件作为显示,拖入两个Button和一个ListBox来更新数据。

在这里插入图片描述

加载方案 按钮:

private void button1_Click(object sender, EventArgs e)
{string message;VmSolution.Load("D:\\Users\\Desktop\\test0820.sol", "");message = "Load Sol Success.";listBox1.Items.Add(message);listBox1.TopIndex = listBox1.Items.Count - 1;
}

方案执行 按钮:

private void button2_Click(object sender, EventArgs e)
{IMVSCircleFindModuTool circleFindModuCs = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];VmProcedure vmProcedure = (VmProcedure)VmSolution.Instance["流程1"];vmRenderControl1.ModuleSource = circleFindModuCs;Task.Run(() =>{vmProcedure.Run();});
}

最后的效果:
在这里插入图片描述

3.异常代码捕获和获取参数

VM中的异常都会有自己的专属错误代码,封装在VmException类中,捕获格式没有区别。
在Button中加入try、catch捕获:

string message;
try
{VmSolution.Load("D:\\Users\\Desktop\\test0820.sol", "");message = "Load Sol Success.";listBox1.Items.Add(message);listBox1.TopIndex = listBox1.Items.Count - 1;
}
catch(VmException ex) 
{message = "Load Sol Failed." + ex.errorCode;listBox1.Items.Add(message);listBox1.TopIndex = listBox1.Items.Count - 1;
}

设置一个Button按钮,来获取提取的参数:
声明圆查找实例化对象的时候,都需要绑定流程,然后强转为对应类。

IMVSCircleFindModuTool circleFind = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];
if (null == circleFind) return;
textBoxX.Text = circleFind.ModuResult.OutputCircle.CenterPoint.X.ToString("0.00");
textBoxY.Text = circleFind.ModuResult.OutputCircle.CenterPoint.Y.ToString("0.00");
textBoxR.Text = circleFind.ModuResult.OutputCircle.Radius.ToString("0.00"); // 精度控制

下面是,获取整个绑定的参数配制界面,在子窗口ParamForm上显示,控件为vmParamsConfigWithRenderControl。
设置一个按钮:

private void button1_Click(object sender, EventArgs e)
{IMVSCircleFindModuTool findModuTool = (IMVSCircleFindModuTool)VmSolution.Instance["流程1.圆查找1"];vmParamsConfigWithRenderControl1.ModuleSource = findModuTool;
}

点击参数配置,打开子界面,然后点击绑定参数,即可在子窗口中配置,选择参数后,右边的界面是实时更改的。
在这里插入图片描述

4.第一阶段总结

VM基础开发环境的配置,和工具类的使用,已经渲染模块的显示。

5.流程操作配置

在这里插入图片描述
连续执行和停止执行按钮:

private void button5_Click(object sender, EventArgs e)
{VmProcedure vmProcedure = (VmProcedure)VmSolution.Instance["流程1"];Task.Run(() =>{vmProcedure.ContinuousRunEnable = true; });
}
private void button6_Click(object sender, EventArgs e)
{VmProcedure vmProcedure = (VmProcedure)VmSolution.Instance["流程1"];Task.Run(() =>{vmProcedure.ContinuousRunEnable = false;});
}

如何选择一个Sol方案中的多个流程呢?

private void button7_Click(object sender, EventArgs e)
{vmProcedureConfigControl1.BindSingleProcedure(comboBox1.Text);
}private void button8_Click(object sender, EventArgs e)
{vmProcedureConfigControl1.BindMultiProcedure();
}

在这里插入图片描述

6.自定义模块生成工具

自动以VM中的一个功能模块,例如这种。
在本地文件中找modules(sp)这个文件夹。
在这里插入图片描述

参考视频做一个圆查找功能,工具 – 自定义模块生成工具:
第一步:配置基本的输入和输出,选择更新自定义输出,显示文本设置,
在这里插入图片描述
第二步:

在这里插入图片描述
生成三个文件:XML、C++、C#。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/408446.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习2d直线拟合-2

参考文章 直线拟合算法(续:加权最小二乘)_加权拟合直线法-CSDN博客 对比了参考文中和opencv中的直线拟合权重,不知道理解的对不对,前者是权重平方,后者没有平方 QtWidgetsApplication1::QtWidgetsApplic…

Excel中的“块”操作

在Excel中,有offset、index、indirect三个对“区域”操作的函数,是较高版本Excel中“块”操作的利器。 (笔记模板由python脚本于2024年08月20日 19:25:21创建,本篇笔记适合喜欢用Excel处理数据的coder翻阅) 【学习的细节是欢悦的历程】 Pytho…

幅频特性曲线分析及使用WPF绘制

文章目录 1、一阶惯性环节的幅频特性曲线分析及绘制2、二阶系统的幅频特性曲线分析及绘制3、一般的系统4、上位机代码实现4.1 一阶惯性系统4.2 二阶系统 5、稳定裕度5.1 幅值裕度5.2 相角裕度 参考 1、一阶惯性环节的幅频特性曲线分析及绘制 这里的a和b可以根据系统的不同修改,…

网络udp及ipc内存共享

大字符串找小字符串 调试 1. 信号处理函数注册:•一旦使用 signal 函数注册了信号处理函数,该函数就会一直有效,直到程序结束或者显式地取消注册。2. 注册多次的影响:•如果多次注册同一信号的处理函数,最后一次注册的…

【记录】基于Windows系统安装rust环境的过程

到官网下载安装包【入门 - Rust 程序设计语言 (rust-lang.org)】 ![[Pasted image 20240703142911.png]] 选择1,快速安装 选择编译配置,1为标准 安装完成 验证是否安装完毕 rustc --versioncargo --version验证成功!

UneMeta创始人讲述自己在Web3+IP领域创业的心路历程

昨日,UneMeta创始人,Ann_tyrion在X分享了一篇推文,分享了自己在探索Web3与IP产业结合过程中的心路历程,她并没有像很多项目方那样一味的讲述宏大的叙事,而是字里行间透露出对这个行业的探索和不断给自己充实信念&#…

自动操作一键数据恢复/电子取证

对磁盘模拟扫描修复丢失数据的实验。 先挂载题目磁盘VHD。 Windows系统中打开磁盘管理,-操作,-附加VHD 可以看到已经加载出题目磁盘,接下来打开RStudio数据恢复软件,对其进行扫描。 操作找回丢失/被删除的数据 可以看到已经加载出…

DRF——pagination分页模块

文章目录 分页继承APIView类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 继承GenericAPIView派生类用法1.PageNumberPagination2.LimitOffsetPagination3.CursorPagination 分页 在查看数据列表的API中,如果 数据量 比较大,肯…

【前端基础篇】JavaScript之DOM介绍

文章目录 WebAPI背景知识什么是WebAPI什么是APIAPI参考文档 DOM基本概念什么是DOMDOM树查找HTML元素方法概览1. document.getElementById(id)2.document.getElementsByTagName(name)3. document.getElementsByClassName(name)4. document.querySelector(CSS选择器)5. document.…

如何免费获取乡镇级边界数据geoJson数据

如何免费获取乡镇级边界数据geoJson数据 我们可以通过 阿里云数据可视化平台 ,可以获取到中国各个省份/区级/县级的json数据,但是区级和县级,并没有包含街道和乡镇的数据 获取乡镇级边界数据 1.下载bigemap全能版 安装好后选择你要导出的…

Graphpad Prism for Mac 医学绘图软件教程

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试安装完成!!! 效果 一、下载软件 下载软件…

关于jupyter notebook 的输出 (outputs )

jupyter notebook 的输出 (outputs )在元素达到一定的个数后,就会按一行一个元素进行展示,百来个还好,一旦过千,那滚轮势必撸冒烟,所以能不能解决呢? 先看个例子, 一个找质数、合数的函数 cal3&…

开发高质量PDF应用的不二选择:PdfiumViewer库详细解析

1. PdfiumViewer库简介 PdfiumViewer是一款基于谷歌开源PDF渲染引擎PDFium的.NET库,主要用于在Windows应用程序中显示和处理PDF文档。PdfiumViewer提供了多种API和控件,使得开发者可以轻松地将PDF文档嵌入到其应用程序中。同时,PdfiumViewer…

unity游戏开发——(细)深入解析 Unity 地形系统:从基础到高级应用

Unity游戏开发 “好读书,不求甚解;每有会意,便欣然忘食。” 本文目录: Unity游戏开发 Unity游戏开发前言深入解析 Unity 地形系统:从基础到高级应用一、初识 Unity 地形系统1. 地形尺寸与分辨率 二、地形编辑工具详解1…

kafka发送消息-自定义消息发送的拦截器

1、自定义拦截器 创建自定义拦截器类,实现ProducerInterceptor接口。对消息进行拦截,可以在拦截中对消息做些处理,记录日志等操作… package com.power.config;import org.apache.kafka.clients.producer.ProducerInterceptor; import org…

【Spring Boot】全局异常处理

目录 背景 前言 设计步骤 1.定义异常信息类: 2.自定义异常: 3.创建全局异常处理类 4.在控制器中抛出异常 5.输出 捕获 Valid 校验异常 背景 去面试的时候被问到SpringBoot项目中,如何处理全局异常的,也就是如何捕获全局异…

vue2 part2

数据代理 通过defineProperty里面传入obj2和x&#xff0c;然后get和set下读取接收下然后再接收set中给对象x用value接收下&#xff0c;这样就能两个数据读取和接收了 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>何…

浅谈【数据结构】链表之单链表

目录 1、什么是数据&#xff1f; 2、什么是结构 3、什么是数据结构&#xff1f; 4、线性结构(线性表&#xff09; 4.1线性表的物理结构的实现 5、链表 5.1无头结点的单链表 5.2新内容、老面孔 5.3数组和链表的优缺点 5.4链表的概念 5.5链表的创建步骤 5.5.1创建过程…

芯片后端之 PT 使用 report_timing 产生报告 之 -input_pins 选项

今天,我们再学习一点点 后仿真相关技能。 那就是,了解 report_timing 中的 -include_hierarchical_pins 选项。 如果我们仅仅使用如下命令,执行后会发现: pt_shell> report_timing -from FF1/CK -to FF2/d -delay_type max -include_hierarchical_pins 我们使用命…

【数据库】Mysql 批量变更所有字段类型为varchar的字符集

生成变更语句 SELECT CONCAT(ALTER TABLE , TABLE_NAME, MODIFY , COLUMN_NAME, , COLUMN_TYPE, , CHARACTER SET utf8 COLLATE utf8_general_ci , CASE WHEN IS_NULLABLE YES THEN NULL DEFAULT NULL WHEN IS_NULLABLE NO AND ISNULL(COLUMN_DEFAULT) THEN NOT NULL EL…