海康VisionMaster-脚本模块

VM是海康机器人自主研发的机器视觉软件,将一系列的图像算法、逻辑工具和通讯协议等封装成图形化模块,致力于帮助客户提供快速搭建视觉应用、解决视觉难题,能够满足视觉定位、尺寸测量、缺陷检测以及信息识别等机器视觉应用。
转自:机器视觉技术交流社区

1 引言

在VM的工具箱中,虽然已经包含了一百多个算法模块可供用户通过连线组合的方式来完成相应的视觉需求,但仍存在一些数据处理逻辑是工具箱中的模块所不涵盖的。此时,脚本模块就可以体现数据处理的灵活性。脚本使用的常用场景包括:日志打印、坐标排序、定位偏差计算、检测结果分类、图像格式转换、联合OpenCV开发等等。
脚本模块主要是需要确定输入变量、输出变量以及数据处理逻辑。可导入或导出已经编写的脚本内容,脚本文本格式的后缀为cs;可编辑程序集来调用第三方库;可直接在脚本编辑页面编写代码、预编译和执行;也可导出当前脚本的工程,直接就会打开工程所在文件夹,再用VS打开工程、附加进程就可以进行脚本的调试,具体介绍见脚本模块章节。

2 脚本模块

双击打开脚本模块,界面如下所示,可以分为五个区域:变量输入区、变量输出区、菜单栏、C#编程区、提示区。
在这里插入图片描述

C#编程区的代码可分为三部分:命名空间、初始化函数、执行函数。Init()函数为初始化函数,Process()为执行函数。
在这里插入图片描述

2.1 接口介绍

使用脚本模块的目的,主要是为了处理数据,那么就需要获取脚本输入的数据以及通过设置数据将脚本某些结果进行输出,因此需要了解相应的获取和设置数据的接口函数。针对不同类型的数据有不同的接口函数,如:string、float、int、byte、image等数据类型的获取和设置接口大同小异。另外,还可以使用通信的发送数据接口,全局变量获取及设置接口,模块的结果获取和运行参数设置。

  1. 数据类型接口
功能函数方法参数说明
获取int型GetIntValue(string paramName, ref int paramValue)输入:变量名paramName;输出:变量值paramValue
获取float型GetFloatValue (string paramName, ref float paramValue)输入:变量名paramName;输出:变量值paramValue
获取string型GetStringValue (string paramName, ref string paramValue)输入:变量名paramName;输出:变量值paramValue
获取byte型GetBytesValue (string paramName,ref byte[] paramValue)输入:变量名paramName;输出:变量值paramValue
获取图像数据GetIMAGEValue (string paramName, ref Image paramValue)输入:变量名paramName;输出:变量值paramValue
获取int型数组GetIntArrayValue(string paramName, ref int[] paramValue,out int arrayCount)输入:变量名paramName;输出:变量值paramValue,数组个数arrayCount
获取float型数组GetFloatArrayValue(string paramName, ref float[] paramValue,out int arrayCount)输入:变量名paramName;输出:变量值paramValue,数组个数arrayCount
获取string型数组GetStringArrayValue(string paramName, ref string[] paramValue,out int arrrayCount)输入:变量名paramName;输出:变量值paramValue,数组个数arrayCount
设置int型SetIntValue(string key, int value)输入:变量名key,变量值value
设置float型SetFloatValue (string key, float value)输入:变量名key,变量值value
设置string型SetStringValue (string key, string value)输入:变量名key,变量值value
设置byte型SetBytesValue (string key, byte[] value)输入:变量名key,变量值value
设置图像数据SetImageValue (string key, Image value)输入:变量名key,变量值value
设置int型数组SetIntValueByIndex(string key, int[] value, int index, int total)输入:变量名key,变量值value,数组索引index,数组元素个数total
设置float型数组SetFloatValueByIndex (string key, float[] value, int index, int total)输入:变量名key,变量值value,数组索引index,数组元素个数total
设置string型数组SetStringValueByIndex(string key, string[] value, int index, int total)输入:变量名key,变量值value,数组索引index,数组元素个数total
  1. 其它接口
功能函数方法参数说明
设置全局变量GlobalVariableModule.SetValue(string paramName,string paramValue)输入:变量名paramName,变量值paramValue
获取全局变量GlobalVariableModule.GetValue (string paramName)输入:变量名paramName
获取模块结果数据CurrentProcess.GetModule(string paramModuleName).GetValue(string paramValueName)输入:模块名paramModuleName,结果名paramValueName
设置模块运行参数CurrentProcess.GetModule(string paramModuleName).SetValue(string paramValueName,string paramValue)输入:模块名paramModuleName,变量名paramValueName,变量值paramValue
PLC、Modbus发送数据GlobalCommunicateModule.GetDevice(int deviceID).GetAddress(int addressID).SendData(string data,DataType dataType)输入:设备deviceID,设备地址addressID,待发送数组data,待发送数据类型dataType
TCP、UDP、串口发送数据GlobalCommunicateModule.GetDevice(int deviceID).SendData(string data)输入:设备deviceID,待发送数据data

2.2 引用和调试

  1. 添加引用
    在脚本界面点击【编辑程序集】进入程序集界面,点击【添加】根据需求进行程序集动态库的添加,仅支持C#程序集添加,到需要的第三方程序集路径下找到想要添加的.dll点击打开即可添加,添加完成后在脚本中调用即可。
    在这里插入图片描述

  2. 调试步骤
    在脚本界面点击【导出工程】,选择.sln文件使用VS打开,设置断点并且重新生成,然后点击【调试】中的【附加到进程】,VM4.2版本是选择VmModuleProxy.exe(VM4.0版本是附加ShellMouleManager.exe)附加,最后在VM中单次执行方案或者单次执行流程或者脚本模块来查看是否能进入断点。小小提示:断点调试时,每次修改代码都需要重新编译,VS每次重新编译后,只有第一次运行会进入初始化函数Init()。
    在这里插入图片描述

2.3 VM4.2的更新

  1. VM4.2虽然保留了VM4.0的一系列接口函数,但VM4.2的脚本模块提供了更简单更方便的编程写法,不需要使用接口函数,直接在脚本中用等于号(=)来获取输入变量的值或用等于号(=)给输出变量赋值。

  2. VM4.2在调试的时候,相比较VM4.0,附件的进程由ShellMouleManager.exe变为VmModuleProxy.exe。这是因为当一个方案中包含多个脚本,我们对每个脚本进行调试附加进程时,每个脚本得附加进程名都是ShellMouleManager.exe,因此得打开任务管理器,需要在进程中来查看每个脚本对应的PID,然后通过ID编号来确定当前脚本调试需要附加的是哪个ShellMouleManager.exe。这一步查看比较繁琐,因此提出附加VmModuleProxy.exe,无论时哪个脚本进行调试,都只需要附加这个进程即可。

3 案例演示

需求:获取下图中条码信息和二维码信息,然后通过编写脚本打印日志到本地。
在这里插入图片描述

在这里插入图片描述

根据案例需求,步骤如下:

  1. 使用条码识别模块和二维码识别模块获取识别信息;
  2. 用GetStringValue函数分别获取条码和二维码信息;
  3. 通过FileStream类操作流写入信息到本地;
  4. 并通过SetstringValue函数输出打印日志的状态信息给到下一个模块。

效果如下所示,确定输入输出变量,然后编写代码,执行之后将输出相应得结果。
在这里插入图片描述

完整代码如下所示:

using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using Script.Methods;
public partial class UserScript:ScriptMethods,IProcessMethods
{
   //********输入变量**********   
    string Barcode; 				//条码 
	string TwoD_Code;				//二维码	    
    //*******输出变量**********    
    string writeSucceedOrFailed; 	//日志写入状态;
    
    /// <summary>
    /// 预编译时变量初始化
    /// </summary>
    public void Init()
    {
		//变量初始化,其余变量可在该函数中添加      
    }

    /// <summary>
    /// Enter the process function when running code once
	/// 流程执行一次进入Process函数
    /// </summary>
    /// <returns></returns>
    public bool Process()
    {
        //每次执行将进入该函数,此处添加所需的逻辑流程处理           
        GetStringValue("barcode",ref Barcode);				//获取条码信息
        GetStringValue("twoD_Code", ref TwoD_Code);			//获取二维码信息        
        try
       {
       	   using(FileStream fsWrite = new FileStream(@"E:\\Log.txt",FileMode.Append,FileAccess.Write) )
           {
       		  string str= "条码信息:"+ Barcode + "\r\n" + "二维码信息:" + TwoD_Code;
       		  byte[] buffer=Encoding.Default.GetBytes(str+"\r\n");		
       		  fsWrite.Write(buffer,0,buffer.Length); 		
           }
           writeSucceedOrFailed="写入OKAY";    
       }
         catch
       {
			writeSucceedOrFailed="写入失败";
       }
       SetStringValue("stateOutput",writeSucceedOrFailed);	  //输出日志打印状态
        
        return true;
    }
}

由于我们可以直接使用等于号(=)进行赋值,不需要使用不同类型的接口函数获取变量(GetxxxxValue)和赋值变量(SetxxxxValue),上述Process()函数中的代码也可以用如下方式实现。

public bool Process()
{
    //每次执行将进入该函数,此处添加所需的逻辑流程处理           
    Barcode=barcode;//获取条码信息
    TwoD_Code=twoD_Code;//获取二维码信息
        
    try
    {
       	using(FileStream fsWrite = new FileStream(@"E:\\Log.txt",FileMode.Append,FileAccess.Write) )
        {
       		string str= "条码信息:"+ Barcode + "\r\n" + "二维码信息:" + TwoD_Code;
       		byte[] buffer=Encoding.Default.GetBytes(str+"\r\n");		
       		fsWrite.Write(buffer,0,buffer.Length); 		
        }
        writeSucceedOrFailed="写入OKAY";    
    }
    catch
    {
		writeSucceedOrFailed="写入失败";
    }
    //输出日志打印状态
    stateOutput=writeSucceedOrFailed; 
    return true;
}

4 总结

作为VM中的逻辑模块之一,脚本模块能够灵活的按照需求处理数据,只要简单的模仿写过一遍,就能掌握其中规则,随后就能在实际项目中拓展使用。根据经验,有以下两点需要注意:

  1. 无法进入到断点位置。建议调试过程中,导出工程后关闭脚本模块编辑界面,只使用vs修改代码和编译,然后附加进程。
  2. 全局变量与局部变量的差异,在函数外定义的是全局变量,在process函数定义的是局部变量。
### VisionMaster 脚本教程概述 VisionMaster是一款强大的机器视觉软件平台,支持多种编程接口和脚本语言来扩展其功能。对于希望深入了解并掌握VisionMaster脚本编写的用户来说,官方提供的文档和支持材料是非常宝贵的资源。 #### 自定义延时算子的实现方法[^1] 为了简化多位置延时操作的需求,在海康威视发布的资源文件中介绍了一种自定义延时算子的方法。该方法不仅提高了使用的便捷性,还增强了错误追踪的能力。具体而言: - **下载资源**:访问指定仓库获取必要的资源文件。 - **阅读PDF文档**:遵循其中详尽描述的操作指南学习如何创建自定义延时算子。 - **参考示例代码**:利用附带的例子加速理解和实践过程。 此部分特别强调了对VisionMaster4.2版本的理解基础之上进行开发的重要性,并提醒开发者务必经过严格的测试验证新加入的功能是否可靠运行。 #### Python脚本集成案例分析[^3] 除了上述特定于算子定制的内容外,还有其他类型的Python脚本可以被用来增强或控制VisionMaster的工作流程。例如,在`C:\Program Files\VisionMaster4.4.0\Applications\ModuleProxy\x64\Scripts`目录下存放了一系列预置脚本,这些脚本展示了怎样通过外部程序调用内部API完成复杂任务。这为那些希望通过自动化手段优化工作流的人士提供了灵感和技术指导。 ```python import vmapi # 假设这是用于连接到VisionMaster API的一个库 def process_image(image_path): """加载图片并通过VisionMaster处理""" image_data = load_image(image_path) result = vmapi.process(image_data) save_result(result, 'output.png') ``` 这段简单的伪代码片段演示了一个可能的应用场景——从磁盘读取图像文件作为输入传递给VisionMaster进行某些形式的数据处理后再保存回本地存储器上。 #### ARC-Robot-Vision 训练模型入门[^2] 另一个值得注意的是ARC-Robot-Vision项目中的训练脚本(`train.py`)及其配套配置文件(config.yaml),它揭示了另一种交互方式即借助深度学习框架的力量让机器人具备更高级别的感知能力。命令行界面允许使用者轻松调整超参数从而影响最终的学习效果;而详细的日志记录则有助于后续性能评估与改进方向探索。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值