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

news2024/11/29 6:38:02

目录

  • 1.2.1 文本保存:逐行保存格式化模块输出的方法
  • 1.2.2 脚本模块:循环模块搭配脚本使用的方法
  • 1.2.3 几何查找:彩色图像的几何查找方法
  • 1.2.4 深度学习:图像分割的面积的获取方法
  • 1.2.5 颜色识别:使用颜色识别工具做分类检测的方法
  • 1.2.6 数据分析:使用脚本模块解析32位寄存器数据的方法
  • 1.2.7 定位功能:使用位置修正模块实现ROI自动修正
  • 1.2.8 读码功能:设置读码参数方法
  • 1.2.9 图像采集:运行VP后VM流程中相机取图失败的解决方法
  • 1.2.10 多图融合:使用多图融合工具实现光度立体法
  • 1.2.11 仿射变换:使用仿射变换进行抠图的方法
  • 1.2.12 中线测量:测量中线之间距离的方法
  • 1.2.13 图像增强:使用图像增强工具凸显目标方法
  • 1.2.14 字符串显示:使用脚本显示字符串的方法
  • 1.2.15 路径提取:使用VM路径提取工具查找边缘点的方法
  • 1.2.16 标定板生成:使用VM自研标定板Demo生产标定板的方法
  • 1.2.17 脚本模块:编写脚本处理点集合的方法
  • 1.2.18 脚本模块:添加自定义程序集的方法
  • 1.2.19 N点标定:模块N点标定的使用方法
  • 1.2.20 字符识别:使用字符识别模块训练的方法
  • 1.2.21 渲染保存:将多个模块的渲染结果在原彩色图片中保存的方法
  • 1.2.22 分支字符:使用分支字符调试不同分支的方法
  • 1.2.23 调试脚本:对脚本进行调试的方法
  • 1.2.24 区域设置:多个不连续ROI同时检测的使用方法
  • 1.2.25 通讯模块:通讯模块发送数据点集合的方法
  • 1.2.26 模板保存:导入及导出匹配模板的方法
  • 1.2.27 标定片标定:使用标定板标定激光振镜的方法
  • 1.2.28 Group显示:Group嵌套循环使能渲染显示的方法
  • 1.2.29 脚本模块:脚本模块图像数据转换的方法
  • 1.2.30 Group循环:使用Group循环处理ROI的方法

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模块循环的使用及索引订阅方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Leetcode -86.分隔链表 -92.反转链表Ⅱ】

Leetcode Leetcode -86.分隔链表Leetcode -92.反转链表Ⅱ Leetcode -86.分隔链表 题目&#xff1a;给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每…

java数据结构之HashMap

目录 前言 1、初始化 1.1、初始化 1.2、插入第一条数据 2、数组 链表 2.1、插入数据&#xff1a;没有hash冲突 2.2、插入数据&#xff1a;Key不同&#xff0c;但产生hash冲突 2.3、插入数据&#xff1a;Key相同 3、数组 红黑树 3.1、链表如何转化为红黑树&#xff1f; 3.…

Postman测试实践笔记

Postman测试实践 文章目录 Postman测试实践一、Postman安装与使用1.1 Postman下载及安装1.1.2 Postman Mac版 1.2 Postman 更新1.2.1 mac 版更新 1.3 Postman 其他问题 二、网络相关知识2.1 接口2.1.1 软件为什么需要接口 2.2 接口测试2.2.1 什么是接口测试&#xff1a;2.2.2 为…

VTK下载并安装

去官网下载https://vtk.org/download/ 选择最新稳定版本 然后点击source后边的压缩包进行下载。 下载完成后将其解压到特定的文件夹下&#xff0c;然后打开cmake-gui.exe&#xff0c;第一行选择刚刚解压的文件夹&#xff0c;这个文件夹下有一个CMakeLists.txt文件&#xff0c…

【6. 激光雷达接入ROS】

欢迎大家阅读2345VOR的博客【6. 激光雷达接入ROS】&#x1f973;&#x1f973;&#x1f973; 2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&#xff0c;仰望星空&#…

Go | 一分钟掌握Go | 8 - 并发

作者&#xff1a;Mars酱 声明&#xff1a;本文章由Mars酱编写&#xff0c;部分内容来源于网络&#xff0c;如有疑问请联系本人。 转载&#xff1a;欢迎转载&#xff0c;转载前先请联系我&#xff01; 前言 当今编程界&#xff0c;一个好的编译型语言如果不支持并发&#xff0c…

工控老司机告诉你热电偶和RTD的区别

热电偶和热电阻都是温度传感器&#xff0c;但它们的原理、功能特性和应用场景有所不同。 一、原理区别 首先&#xff0c;热电偶是利用两种不同金属之间的热电效应来测量温度的。其原理是利用温度差引起的金属之间的热电势差进行测量。两种金属之间存在一种热电势&#xff08;…

Yolov8优化:卷积变体---分布移位卷积(DSConv),提高卷积层的内存效率和速度

论文: https://arxiv.org/pdf/1901.01928v1.pdf 摘要:提出了一种卷积的变体,称为DSConv(分布偏移卷积),其可以容易地替换进标准神经网络体系结构并且实现较低的存储器使用和较高的计算速度。 DSConv将传统的卷积内核分解为两个组件:可变量化内核(VQK)和分布偏移。 通过…

双亲委派机制的原理和作用

双亲委派机制&#xff0c;就必须弄清楚Java的类加载器。 什么是类加载器 Java类加载器(ClassLoader)是Java运行时环境(JRE)的一部分&#xff0c;负责动态的将Java类加载到Java虚拟机的内存空间。 类加载器有哪些 主要有三个&#xff1a; 引导类加载器(Bootstrap ClassLoade…

前端开发在本地开发与后台进行联调阶段时,接口自动重定向https、HSTS 与 307 状态码

开发者在本地开发与后台进行联调阶段时&#xff0c;Chrome 浏览器上出现 307 状态码&#xff0c;并跳转到 https 版 但是 307 代码是什么含义呢&#xff1f;页面又为何会出现 307 状态码呢&#xff1f;我之前都没见过这个状态码&#xff0c;查了才知道原来它也是一种重定向。 …

数字三角形+包子凑数(蓝桥杯JAVA解法)

数字三角形&#xff1a;用户登录 题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径&#xff0c;把路径上面的数加起来可以得到一个和&#xff0c;你的任务就是找到最大的和&#xff08;路径上的每一步只可沿左斜线向下或右斜线向下走…

ArduPilot之开源代码Sensor Drivers设计

ArduPilot之开源代码Sensor Drivers设计 1. 源由2. Sensor Drivers设计2.1 front-end / back-end分层2.2 设计思想分析 3 实例理解3.1 驱动初始化3.2 业务应用代码3.3 frond-end代码3.3 back-end代码3.3.1 UART3.3.2 I2C3.3.3 SPI 4. 参考资料 1. 源由 飞控代码除了最为基础的…

《美团机器学习实践》读后感和一点思考

前言&#xff1a;最近拜读了美团算法团队出品的《美团机器学习实践》&#xff0c;这本书写于2018年&#xff0c;一个大模型还没有标配的时代。这本书侧重于工业界的实践&#xff0c;能清楚地让我们了解到工业界和学术界对机器学习的关注方向上的差异&#xff0c;值得一读。因为…

文件系统和软硬链接

文章目录 一.文件系统1.了解磁盘的物理结构2.磁盘的存储结构a.磁盘读取 3.磁盘的逻辑结构a.为什么操作系统不直接使用CHS地址&#xff1f;b.实际IO一次的大小 4.磁盘的分区管理4.1.ext文件系统a.文件查找b.文件删除 4.2目录的属性和数据 二.软硬链接软链接的建立和删除软链接的…

【VM服务管家】VM4.0软件使用_1.4 通讯类

目录 1.4.1 通讯管理&#xff1a;ModBus通信发送非整型数据的方法1.4.2 通讯管理&#xff1a;使用Modbus TCP通讯协议与流程交互 1.4.1 通讯管理&#xff1a;ModBus通信发送非整型数据的方法 描述 环境&#xff1a;VM4.0.0 现象&#xff1a;Modbus通信发送数据只能为Int类型&a…

快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)

一、介绍 &#x1f606; &#x1f601; &#x1f609; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需…

【网课平台】Day13.订单支付模式:生成支付二维码与查询支付

文章目录 一、需求&#xff1a;生成支付二维码1、需求分析2、表设计3、接口定义4、接口实现5、完善controller 二、需求&#xff1a;查询支付结果1、需求分析2、表设计与模型类3、接口定义4、接口实现步骤一&#xff1a;查询支付结果步骤二&#xff1a;保存支付结果&#xff08…

如何写出一份大厂都不会拒绝的简历?

你好&#xff0c;我是宋光璠&#xff0c;今天我以过来人的身份教你写出一份惊艳面试官的简历。 简历算是我们过去经历的一个缩影&#xff0c;虽然只有短短一两页&#xff0c;但也能让人从中发现你的优点&#xff0c;一份优质的简历更是如此&#xff0c;所以今天我就带你从头到…

PLC模糊PID(梯形图实现)

博途PLC的模糊PID控制详细内容请查看下面的博客文章: Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_RXXW_Dor的博客-CSDN博客模糊PID的其它相关数学基础,理论知识大家可以参看专栏的其它文章,这里不再赘述,本文就双容…

网络安全常用术语

肉鸡 肉鸡指的就是被黑客成功入侵并取得控制权限的电脑。黑客们可以随意的控制肉鸡&#xff0c;就像在使用自己的电脑一样&#xff0c;很形象的比喻&#xff0c;就像是养的肉鸡&#xff0c;任黑客宰杀和利用。关键的是&#xff0c;在成为肉鸡后&#xff0c;只要黑客不对电脑进…