【VM服务管家】VM4.0软件使用_1.2 工具类

目录

1.2.1 文本保存:逐行保存格式化模块输出的方法

描述
环境:VM4.0.0 以上
现象:文本保存模块无法逐行获取格式化模块的输出。文本保存模块可以获取格式化模块的结果并保存到本地,但是只能订阅某个格式化模块整个的输出结果,不能通过分隔符按行分割从而单独获取格式化的某一行输出。
解答
可以使用协议解析模块根据分隔符获取格式化模块的每行数据,然后使用文本保存模块订阅协议解析模块的输出。VM模块操作示例如下:
在这里插入图片描述
在这里插入图片描述
问题根因
不熟悉多个模块配合使用。

1.2.2 脚本模块:循环模块搭配脚本使用的方法

描述
环境:VM4.0.0
现象: 使用VM模块搭配脚本模块如何实现获取所有数据一次性全部输出
解答
如下图1,需要实现每个试剂盒中有无试纸的检测,并一次性输出四个结果给客户。
在这里插入图片描述
图1
常规的实现方式如下图2所示:
在这里插入图片描述
图2
对每个检测都做模板匹配、位置修正、blob分析。这样模块较多,功能相同却无法服复用,浪费资源。因此就会想到:是否可以使用循环的方式来实现以上功能需求呢?答案肯定是可以的。
使用循环模块后,方案如下图3所示:
在这里插入图片描述
图3
综上,循环实现的本质是单组工具多次运行,与编程中的for、while性质一样,根据前置输入的循环次数执行。
既然选择了循环的方案,还有以下两个问题点需要我们注意:
一是,循环的位置关系。即需要保证循环内的工具能够在每次的循环中进行检测位置的正确变化,将所有工件进行检测,而不是重复检测某一个工件。VM软件引入了循环标记LoopIndex,在循环内的模块可以订阅到该值,以帮助模块实现位置修正的效果。
一般来说,位置关系的输入有两种:

  1. 继承。直接继承前序定位模块的检测区域。可配置为如下图4所示:
    在这里插入图片描述
    图4
  2. 通过位置修正,这种情况下,可以将位置修正作为循环内的首模块,并在位置修正信息内配置循环标记,是位置修正能够正确输出位置修正信息引导后后续模块进行相对的位置修正来实现精准检测,如下图5所示:
    在这里插入图片描述
    图5
    二是,循环输出的结果,我们该如何处理?这个是本文章的重点内容。因为VM的机制是,你执行一次,我输出结果,是一种顺序型的结构。如果使用格式化模块来接受,仅能获取到循环内模块的最后次运行结果。根据循环逻辑,我们应当在每次执行时将获得结果缓存下来,在达到循环次数时进行输出。要是实现以上功能,就需要用VM脚本工具来实现。
    按照以上案例,脚本的配置如下图6所示:
    在这里插入图片描述图6
    首先我们应当初始化相关变量,并确定脚本逻辑为:循环内每次执行,将相关数据缓存到脚本内自定义的变量内,达到循环执行次数时,将所有数据汇总输出。因此我们首先建立一个Int数组用以存放每次检测的结果。并通过循环次数与工件数量比较,在达到循环次数时赋值输出。如下图7所示:
    在这里插入图片描述
    图7
    脚本实现代码如下:
1.	C#
2.	 
3.	using System;
4.	using System.Text;
5.	using System.Windows.Forms;
6.	using Hik.Script.Methods;
7.	class UserScript:ScriptMethods,IProcessMethods
8.	{
9.	    int processCount ;  
10.	    int var0,var1;
11.	    int[] num=new System.Int32[5];
12.	    /// <summary>
13.	    /// 预编译时变量初始化
14.	    /// </summary>
15.	    public void Init()
16.	    {
17.	        processCount = 0;
18.	    }
19.	    public bool Process()
20.	    {
21.	        //每次执行将进入该函数,此处添加所需的逻辑流程处理
22.	       // MessageBox.Show("Process Success");
23.	        GetIntValue("var0",ref var0);
24.	        GetIntValue("var1",ref var1);
25.	        num[processCount]=var1;
26.	        processCount++;
27.	        if(processCount==var0)
28.	        {
29.	            for(int i=0;i<var0;i++)
30.	            {
31.	                SetIntValueByIndex("EveryStatus",num[i],i,var0);
32.	        	}
33.	        	SetIntValue("InspeNum",processCount);
34.	        	Array.Clear(num,0,num.Length);
35.	        	processCount=0;
36.	        }
37.	        return true;
38.	    }
39.	}

问题根因:

  1. 方案设计阶段,需要考虑配置与性能关系,重点考虑流程时间是否满足现场需求,决定是否采用循环方式;
  2. 脚本内数据次数缓存、次数判断和数据清理。这里提一点,如果仅是获取点的坐标可以通过点集工具开始循环使能实现
  3. 位置修正:①先保证前序定位模块仅匹配到一个工件;②基于该工件定位建立位置修正;③基于位置修正,调整后续工具的相对ROI;④确保单组工具运行检测正常时,再将前序定位模块数量设置为理想数量,并点击单词运行查看整体运行效果。

1.2.3 几何查找:彩色图像的几何查找方法

描述
环境:VM4.0.0及以上
现象:如何对彩色图像进行几何查找(圆查找、直线查找等)?
解答
如下图所示,需要查找隔膜的边缘直线,直接使用直线查找工具,定位结果失败。
在这里插入图片描述
定位失败的原因是算法处理灰度图,图像源模块对彩色图转灰度图的默认转换方法是各通道取平均值,该转换方法得到的灰度图像,隔膜下边缘的灰度及纹理信息与背景几乎相同。
第一步,使用颜色转换工具将彩色图像通道分离(仅限于本案例),提取RGB中的B通道。
在这里插入图片描述
第二步,对转换得到的B通道的灰度图像使用直线查找工具,定位结果成功。
在这里插入图片描述
问题根因
不熟悉VM对彩色图转灰度图的转换方法。

1.2.4 深度学习:图像分割的面积的获取方法

描述
环境:VM4.0.0及以上
现象:利用深度学习图像分割获取的缺陷面积尺寸如何获取?
解答
在图像分割模块后面接BLOB标签分析模块,具体方案如下:
在这里插入图片描述
问题根因
不熟悉VM相关工具的使用。

1.2.5 颜色识别:使用颜色识别工具做分类检测的方法

描述
环境:VM4.0.0及以上
现象:如何使用颜色识别工具做极耳阳极/阴极的分类检测?
解答
第一步,图像源模块的基本参数中,像素格式选择RGB24
在这里插入图片描述
第二步,颜色识别模块创建模型,图像列表加载当前彩色图像,截取图像样本并添加至标签
在这里插入图片描述
第三步,待检测区域绘制ROI,运行颜色识别模块,输出参数“最佳匹配名称”为分类结果
极耳阳极检测结果——铜
在这里插入图片描述
极耳阴极检测结果——铁
在这里插入图片描述
问题根因
不熟悉颜色识别工具的使用。

1.2.6 数据分析:使用脚本模块解析32位寄存器数据的方法

环境:VM4.0.0+VS2015及以上
现象:接收数据模块接收的数据是16进制byte数组,无法获取10进制数据,需再次解析
解答

1.	C#
2.	 
3.	public bool Process()
4.	{
5.	     int datatype=4;//数据格式,ABCD、CDAB、BADC、DCBA四种
6.	     byte[] _registervalue = new System.Byte[1];//初始化字节数组,       GetBytesValue函数中会根据实际情况再初始化字节长度。
7.	     GetBytesValue("recdata",ref _registervalue);//获取数据
8.	     string hexdata=string.Empty;
9.	     int[] registervalue = new System.Int32[_registervalue.Length /2];//数据列表,结果是32位的数据
10.	 
11.	     for(int j=0;j<_registervalue.Length;j=j+4 )
12.	     {
13.	        if(datatype==1) //ABCD 
14.	           hexdata=string.Format("{0:x2}", Convert.ToInt32(
15.	        _  registervalue[j])) //A
16.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+1])) //B
17.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+2])) //C
18.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+3])); //D                                                     
19.	        else if(datatype==2) //BADC
20.	           hexdata=string.Format("{0:x2}",Convert.ToInt32(_registervalue[j+1])) //B
21.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j])) //A
22.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+3])) //D
23.	           + string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+2])); //C  
24.	        else if(datatype==3)//CDAB
25.	           hexdata =string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+2])) //C
26.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+3])) //D
27.	           +  string.Format("{0:x2}", Convert.ToInt32(_registervalue[j])) //A
28.	           + string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+1])); //B
29.	       else //DCBA
30.	           hexdata=string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+3])) //C
31.	           + string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+2])) //D
32.	           + string.Format("{0:x2}", Convert.ToInt32(_registervalue[j+1])) //A
33.	           + string.Format("{0:x2}", Convert.ToInt32(_registervalue[j])); //B
34.	 
35.	       registervalue[j/4] =  Convert.ToInt32(hexdata, 16); //16进制字符串转为10进制整形    
36.	    }
37.	 
38.	    for(int i=0;i<registervalue.Length;i++)//将32位寄存器数据设置到脚本输    出变量
39.	    {
40.	        SetIntValueByIndex("out0",registervalue[i],i,registervalue.Length);
41.	    }
42.	    return true;
43.	}

问题根因
不熟悉32位寄存器数据的解析方法。

1.2.7 定位功能:使用位置修正模块实现ROI自动修正

描述
环境:VM4.0.0
现象:粗定位的实现方法
解答
使用VM中的位置修正模块,订阅前项任意具有定位识别功能的模块输出的目标点,对后置模块中的ROI进行自动修正功能。
在这里插入图片描述
订阅前项匹配点:
在这里插入图片描述
订阅位置修正信息:
在这里插入图片描述
问题根因
功能不熟悉。

1.2.8 读码功能:设置读码参数方法

环境:VM4.0.0
现象:读码模块使用介绍
解答
不同的DM码以及QR码尺寸不一样,需要设置合适的降采样倍数和码宽参数来实现读码功能。默认情况下一般无法读取到码内容,需要调节降采样倍数以及码宽来解决。
在这里插入图片描述
设置读码宽度根据码的实际宽度设定范围
在这里插入图片描述
问题根因
功能不熟悉。

1.2.9 图像采集:运行VP后VM流程中相机取图失败的解决方法

描述
环境:VM4.0.0
现象:运行VisionPro后,再运行VM触发流程,第一次触发能正常取图,再次触发后流程卡死,最后超时报取图失败。
解答
VisionPro会把相机设置为单帧模式,而VM暂时不支持单帧模式,因此需要用MVS将相机采集模式设为连续模式,具体如下图:
在这里插入图片描述

问题根因
VisionPro修改了相机采图模式。

1.2.10 多图融合:使用多图融合工具实现光度立体法

描述
环境:VM4.0.0及以上
现象:如何使用多图融合工具实现光度立体法?
解答
第一步,将通过相机和光源拍摄的多张不同角度不同亮度的图像放到同一个文件夹中。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

第二步,将“多图采集”模块拖动到流程编辑区,双击配置相应的参数,导入文件夹;取图数量为3-8(与第一步中拍摄图像的角度和亮度的数目有关);分布角为光源与正方向的夹角,照射角为光源中线与相机中线的夹角。
在这里插入图片描述
照射角(侧视图)
在这里插入图片描述
分布角(俯视图)
在这里插入图片描述

第三步,将“多图融合”模块拖动到流程编辑区,设定相应参数,可以得到合成后的图像。
在这里插入图片描述

问题根因
不熟悉多图融合工具的使用。

1.2.11 仿射变换:使用仿射变换进行抠图的方法

描述
环境:VM4.0.0及以上
现象:如何使用仿射变换进行抠图?
解答
在VM中,仿射变换模块可以用来对图像进行缩放和扣图。
第一步,拖动图像源模块到流程编辑区,添加本地图像。
在这里插入图片描述

第二步,拖动仿射变换模块到流程编辑区,创建希望抠图的ROI,设置运行参数,其中尺度和宽高比均设置为1,执行后可以得到扣出的图像。
在这里插入图片描述
在这里插入图片描述
问题根因
不熟悉仿射变换工具的使用。

1.2.12 中线测量:测量中线之间距离的方法

描述
环境:VM4.0.0及以上
现象:如何测量物体中线之间的距离
解答
第一步,使用四边形查找模块以及平行线查找模块查找与中心线相关的边缘
在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述

第二步,使用线线测量模块进行中线距离的测量,在线输入中订阅四边形查找的中点线和平行线查找的边缘中线,输出中线之间的距离。
在这里插入图片描述

问题根因
不熟悉四边形查找以及平行线查找工具的输出参数。

1.2.13 图像增强:使用图像增强工具凸显目标方法

描述
环境:VM4.0.0及以上
现象:如何使用图像增强工具凸显目标,改善视觉效果?
解答
如图所示的图像希望对电池底部的脏污进行检测,但电池的底部粗糙,成像效果不好,直接使用blob分析工具可能无法达成较好的检测效果,可以使用图像增强工具对图像进行增强。
在这里插入图片描述

第一步:设置图像增强的相关参数
在这里插入图片描述

第二步:显示增强结果
在这里插入图片描述

问题根因
不熟悉图像增强工具的使用。

1.2.14 字符串显示:使用脚本显示字符串的方法

描述
环境:VM4.0.0及以上
现象:如何使用脚本在图像显示窗口显示自定义的字符串?
解答
第一步,在脚本模块中设置输入变量和想要的输出变量
在这里插入图片描述

第二步,写脚本

1.	C# 
2.	public bool Process()
3.	{
4.	GetFloatValue("isShield", ref isShield);
5.	GetStringValue("isPop", ref isPop);
6.	if(isShield > 10000)
7.	{
8.	    shieldInfo = "中心孔被遮挡";
9.	}
10.	else 
11.	{    
12.	    shieldInfo = "中心孔未被遮挡";
13.	}
14.	if(isPop == "OK")
15.	{
16.	    PopInfo = "隔膜正常";
17.	}
18.	else if(isPop == "NG") 
19.	{
20.	    PopInfo = "隔膜弹起";
21.	}
22.	    string resultInfo = shieldInfo + "," + PopInfo;
23.	    SetStringValue("resultInfo", resultInfo);
24.	    return true;
25.	 }

第三步:输出显示结果
在这里插入图片描述

问题根因
不熟悉脚本工具的使用。

1.2.15 路径提取:使用VM路径提取工具查找边缘点的方法

描述
环境:VM4.0.0
现象:如何使用VisionMaster软件的路径提取工具查找边缘点?
解答

  1. 在工具栏中拖入“路径提取”工具,“运行参数”中的“提取方式”选择“查找边缘点”,如下图所示:
    在这里插入图片描述

  2. 然后在模板匹配中创建大致轨迹和训练参数(阈值、卡尺、路径点数量等),如下图所示:
    在这里插入图片描述

  3. 点击完成后执行,即可查询边缘点
    问题根因
    不熟悉VisionMaster的路径提取工具。

1.2.16 标定板生成:使用VM自研标定板Demo生产标定板的方法

描述
环境:VM4.0.0
现象:如何使用VisionMaster软件的自研标定板Demo生成标定板?
解答

  1. 在VisionMaster软件的“工具”中打开“标定板生成工具”,或者在VisionMaster软件安装目录“VisionMaster\VisionMaster4.0.0\Applications\Tools\自研标定板生成Demo”下打开“DemoGenCalBoard_ch.exe”应用程序,运行结果如下图所示:
    在这里插入图片描述

  2. 根据提示进行标定板文件生成步骤,如下图所示:
    在这里插入图片描述

  3. 按任意键退出,标定文件生成在安装目录“VisionMaster\VisionMaster4.0.0\Applications\Tools\自研标定板生成Demo”下查看,如下图所示
    在这里插入图片描述

问题根因
不熟悉VisionMaster的标定板生成工具。

1.2.17 脚本模块:编写脚本处理点集合的方法

描述
环境:VM4.0.0
现象:如何对数据点集合通过脚本模块进行处理并输出结果?
解答
1.首先在脚本里手动添加输入、输出变量(定义变量名、数据类型以及订阅来源),如下图所示:
在这里插入图片描述

2.脚本代码中首先必须实例化数组用来获取点集合。示例代码如下:

1.	C# 
2.	 
3.	class UserScript:ScriptMethods,IProcessMethods
4.	{
5.	//先定义存放坐标数组,数量大于输入点个数,这里假设512个
6.	float[] X = new float[512];
7.	float[] Y = new float[512];
8.	float[] X1 = new float[512];
9.	float[] Y1 = new float[512];
10.	...
11.	}
3.在Process()中编写输入变量、处理过程、输出变量等操作代码,且现4.0版本输出点集合只支持通过Index输出结果。示例代码如下: 
1.	C# 
2.	 
3.	/// <summary>
4.	/// Enter the process function when running code once
5.	/// 流程执行一次进入Process函数
6.	/// </summary>
7.	/// <returns></returns>
8.	public bool Process()
9.	{  
10.	//获得输入变量numX、numY
11.	int lenX = 0;
12.	int lenY = 0;
13.	GetFloatArrayValue("inx",ref X,out lenX);                
14.	GetFloatArrayValue("iny",ref Y,out lenY);
15.	 
16.	///处理方法放在这里
17.	///...
18.	///处理方法放在这里
19.	 
20.	//通过Index输出变量outx、outy
21.	for(int i = 0; i < lenX;i++)
22.	{
23.	SetFloatValueByIndex("outx",X1[i],i,lenX);
24.	SetFloatValueByIndex("outy",Y1[i],i,lenY);
25.	}
26.	return true;
27.	}

问题根因
不熟悉脚本模块内相关接口的使用。

1.2.18 脚本模块:添加自定义程序集的方法

描述
环境:VM4.0.0
现象:如何在脚本模块中添加自定义的程序集?
解答
1.首先,打开一个脚本模块,找到“编辑程序集”,如下图所示:
在这里插入图片描述

2.引用程序集中点击“添加”,找到自定义的程序集,如下图所示:
在这里插入图片描述

3.最后在脚本中引用添加的程序集,便可以调用程序集中相关接口函数。示例代码如下:

1.	C#
2.	 
3.	using MathNet.Numerics;//引用程序集

问题根因
不熟悉脚本模块的功能。

1.2.19 N点标定:模块N点标定的使用方法

描述
环境:VM4.0.0
现象:如何使用N点标定模块?
解答
N点标定常用的有九点标定和十二点标定,如九点标定,则是获取9组像素点以及相对应的9组物理点,从而生成标定文件。
1.当图像源为本地图片时(九张),首先获取一个像素点来标记运动轨迹,如边缘交点;然后N点标定模块的参数配置。注意平移次数,物理坐标系参数以及自由度的配置。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

2.执行九次,图片自动切换,形成九点标定的运动轨迹,N点标定模块可以查看相应的标定点,也可以进行导出导入。

在这里插入图片描述
在这里插入图片描述

问题根因
不熟悉N点标定模块的使用。

1.2.20 字符识别:使用字符识别模块训练的方法

描述
环境:VM4.0.0
现象:在使用字符识别模块的时候,不知道是否需要进行字符训练以及如何进行字符训练。
解答
字符识别模块的使用如下所示:
1、字符识别模块使用的时候是需要进行训练的,训练得到字符库,可以保存到本地,下次使用时则可以直接导入。
2、打开字库训练窗口,先选择ROI区域,然后提取字符,接着训练字符,最后添加至字符库。
在这里插入图片描述

问题根因
不熟悉字符识别模块的使用。

1.2.21 渲染保存:将多个模块的渲染结果在原彩色图片中保存的方法

描述
环境:VM4.0.0
现象:如何将多个模块的结果同时渲染在原彩色图像中保存?
解答
这种情况属于方案配置问题,可以在方案中进行如下配置:
1)图像源模块,更改图像素格式为RGB24。
在这里插入图片描述

2)处理模块输入源改为灰度图像数据。
在这里插入图片描述

3)使用输出图像源模块保存图像,并绑定输入图像源和需要渲染的处理模块。
在这里插入图片描述在这里插入图片描述

4)保存结果。
在这里插入图片描述

问题根因
不熟悉VM模块的使用。

1.2.22 分支字符:使用分支字符调试不同分支的方法

描述
环境:VM4.0.0及以上
现象:如何对分支字符下的不同分支进行调试?
解答
第一步,拖拽分支字符模块到流程区,设置不同分支的字符
在这里插入图片描述

第二步,打开想要调试的分支的调试按钮,即可进行调试
在这里插入图片描述

问题根因
不熟悉分支字符工具的使用。

1.2.23 调试脚本:对脚本进行调试的方法

描述
环境:VM4.0.0+ VS2015及以上
现象:如何对VM脚本模块中的代码进行调试?
解答
第一步,在脚本模块中使用导出工程功能,将模块中的代码导出
在这里插入图片描述

第二步,找到导出的工程,并打开
在这里插入图片描述

第三步,生成解决方案,设置断点,点击VS菜单调试中的附加到进程,选择ShellModuleManager进程,点击附加
在这里插入图片描述
在这里插入图片描述

第四步,在VM中点击执行,自动进入VS中开始调试
在这里插入图片描述

另外,如果一个方案中有多个脚本,如何进行对指定脚本的调试呢?如何在附加进程时,选择相应的ShellModuleManager进程呢?如图中有三个脚本,脚本编号分别为0,1,4
在这里插入图片描述

首先,打开任务管理器,找到ShellModule进程,这时并不知道这三个ShellModule分别对应哪个脚本,右击鼠标选择转到详细信息。
在这里插入图片描述

然后,将鼠标放在第一行右击(如第一行的名称处),打开选择列弹窗。
在这里插入图片描述

接着,勾选命令行
在这里插入图片描述

最后,就可以查看脚本编号对应的进程号,从而得知在附加进程时选择哪一个进程进行附加

在这里插入图片描述

问题根因
不熟悉脚本工具的使用。

1.2.24 区域设置:多个不连续ROI同时检测的使用方法

描述
环境:VM4.0.0 + VS2015及以上
现象: VM中的控件,如Blob、模板匹配等工具,查找区域不连续,重复性强,使用脚本工具进行一次设置,减少工作量。
解答
1.在工具中加入“脚本”工具,将输出端链接在需要使用ROI的工具上
在这里插入图片描述

2.打开脚本工具,添加5个float输出端,输入端按情况需要添加
在这里插入图片描述

3.关键算子使用
在这里插入图片描述

4.配置ROI
在这里插入图片描述

5.代码详细

1.	C#
2.	public bool Process()
3.	{  
4.	//以float类型在输出端”X”的第一位输入200
5.	    SetFloatValueByIndex("X",200,0,2);       
6.	//以float类型在输出端”X”的第二位输入500
7.		SetFloatValueByIndex("X",500,1,2);  
8.	//以float类型在输出端”Y”的第一位输入200
9.	    SetFloatValueByIndex("Y",200,0,2);
10.	//以float类型在输出端”Y”的第二位输入500
11.	    SetFloatValueByIndex("Y",500,1,2);
12.	//以float类型在输出端”Height”的第一位输入200
13.	    SetFloatValueByIndex("Height",200,0,2);
14.	//以float类型在输出端”Height”的第二位输入300
15.	    SetFloatValueByIndex("Height",300,1,2);
16.	//以float类型在输出端”Width”的第一位输入200
17.	    SetFloatValueByIndex("Width",200,0,2);
18.	//以float类型在输出端”Width”的第二位输入300
19.	    SetFloatValueByIndex("Width",300,1,2);
20.	//以float类型在输出端”Rotation”的第一位输入0
21.	    SetFloatValueByIndex("Rotation",0,0,2);
22.	//以float类型在输出端“Rotation”的第二位输入0
23.	    SetFloatValueByIndex("Rotation",0,1,2); 
24.	    return true;
25.	    }
26.	}

问题根因
对工具使用不熟练

1.2.25 通讯模块:通讯模块发送数据点集合的方法

描述
环境:VM4.0.0
现象:发送数据模块中,TCP通讯直接订阅数据点集合只能发送第一组数据,无法将集合都发送,如下图所示。如何能够做到发送数据点集合?
在这里插入图片描述

解答
Tcp通讯是无法发送数据点集合的,我们需要将数据点集合通过脚本转换为字符串的形式,再用”发送数据”模块进行订阅,传输数据。步骤如下
1.首先,在脚本中订阅输入变量以及输出变量,如下图所示:
在这里插入图片描述

2.编写相关脚本代码进行格式转换。示例代码如下:

1.	C#
2.	 
3.	//获得输入变量numX、numY
4.	int lenX = 0;
5.	int lenY = 0;
6.	GetFloatArrayValue("numX",ref X,out lenX);
7.	GetFloatArrayValue("numY",ref Y,out lenY);
8.	//将格式转换为字符串,间隔符为","
9.	string Str = "";
10.	for(int i = 0; i < lenX;i++)
11.	{
12.	  Str += X[i].ToString("f3")+",";
13.	}
14.	string Str1 = "";
15.	for(int i = 0; i < lenY;i++)
16.	{
17.	  Str1 += Y [i].ToString("f3")+",";
18.	}
19.	//结果输出
20.	SetStringValue("strX",Str);
21.	SetStringValue("strY",Str1);

3.此时发送数据结果为数据点集合,如下图所示。
在这里插入图片描述

问题根因
不熟悉发送数据模块以及脚本模块的功能。

1.2.26 模板保存:导入及导出匹配模板的方法

描述
环境:VM4.0.0
现象:如何将本次模板匹配所创建的模板进行导出,以便于下次使用?
解答
第一步:点击高精度匹配模块,创建模板
在这里插入图片描述

第二步:编辑模板,点击导出按钮,选择想要保存的路径和命名
在这里插入图片描述

第三步:点击载入按钮,载入之前保存的模板
在这里插入图片描述

问题根因
不熟悉VM高精度匹配模块的使用。

1.2.27 标定片标定:使用标定板标定激光振镜的方法

描述
环境:VM4.0.0
现象:如何使用标定板标定激光振镜
解答
首先使用激光在平面上打一个十字并指明坐标系方向(十字中心为坐标系原点),然后选择一个透明标定片将十字线与标定片任意直角对齐,最后调整运行参数中的原点坐标与标定片坐标系方向并选择物理尺寸,使标定片坐标系与十字线坐标系重合并生成标定文件。
在这里插入图片描述

问题根因
不熟悉VM的使用。

1.2.28 Group显示:Group嵌套循环使能渲染显示的方法

描述
环境:VM3.4.0
现象:方案流程中使用多个Group模块嵌套,并启用"循环使能",在执行流程时Group模块图像源和图形源都不能正常显示。
解答
Group循环超出了配置的缓存数量,需要调大缓存。
1)打开Vm3.4.0 安装目录下的打开VisionMaster.cfg文件;
在这里插入图片描述

2)修改“流程缓存队列丢弃阈值数量”,默认为128。修改原则:缓存数量>=循环次数*Group内模块数量
在这里插入图片描述

3)保存修改,重启Vm生效。
问题根因
Group循环超出了配置的缓存数量,需要调大缓存。

1.2.29 脚本模块:脚本模块图像数据转换的方法

描述
环境:VM4.0.0
现象:VM算法平台软件如何转换图像数据
解答

1.	BitmapData bmpData = _NewBitmap.LockBits(new System.Drawing.Rectangle(0, 0, _NewBitmap.Width, _NewBitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
2.	int stride = bmpData.Stride;  // 扫描线的宽度  
3.	int offset = stride - _NewBitmap.Width;  // 显示宽度与扫描线宽度的间隙  
4.	IntPtr iptr = bmpData.Scan0;  // 获取bmpData的内存起始位置  
5.	int scanBytes = stride * _NewBitmap.Height;// 用stride宽度,表示这是内存区域的大小  
6.	byte[]mapdata = new byte[scanBytes];  //为目标数组分配内存
7.	System.Runtime.InteropServices.Marshal.Copy(iptr, mapdata, 0, scanBytes); //copy内存中数据到数组中
8.	OutImage.Buffer=mapdata;
9.	OutImage.Width=_NewBitmap.Width;
10.	OutImage.Heigth=_NewBitmap.Height;
11.	OutImage.PixelFormat=ImagePixelFormate.MONO8;     
12.	SetImageValue("out1",OutImage); 

问题根因
不熟悉如何在VM中进行图像数据转换。

1.2.30 Group循环:使用Group循环处理ROI的方法

描述
环境:VM4.0.0
现象:如何遍历ROI区域,并实现对ROI区域循环处理
解答
可以借助Group模块实现对ROI的遍历。
1.创建Group模块,配置输入设置及循环设置,即订阅需要传入的图像及ROI集合,如下图所示。
在这里插入图片描述在这里插入图片描述

2.订阅图像和ROI,在Group中的图像处理模块中订阅传入的图像并采用继承的方式订阅ROI区域。
在这里插入图片描述

3.订阅索引,订阅ROI集合后需要指定每次循环需要处理的ROI下标,通过点击方括号中间可以弹出订阅索引的选项。详细步骤如图所示。
在这里插入图片描述在这里插入图片描述

4.输出设置,Group模块配置循环中的输出参数。
在这里插入图片描述

问题根因
不熟悉Group模块循环的使用及索引订阅方法。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值