【VM服务管家】VM4.0软件使用_1.2 工具类
目录
- 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,在循环内的模块可以订阅到该值,以帮助模块实现位置修正的效果。
一般来说,位置关系的输入有两种:
- 继承。直接继承前序定位模块的检测区域。可配置为如下图4所示:

图4 - 通过位置修正,这种情况下,可以将位置修正作为循环内的首模块,并在位置修正信息内配置循环标记,是位置修正能够正确输出位置修正信息引导后后续模块进行相对的位置修正来实现精准检测,如下图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. }
问题根因:
- 方案设计阶段,需要考虑配置与性能关系,重点考虑流程时间是否满足现场需求,决定是否采用循环方式;
- 脚本内数据次数缓存、次数判断和数据清理。这里提一点,如果仅是获取点的坐标可以通过点集工具开始循环使能实现
- 位置修正:①先保证前序定位模块仅匹配到一个工件;②基于该工件定位建立位置修正;③基于位置修正,调整后续工具的相对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软件的路径提取工具查找边缘点?
解答
-
在工具栏中拖入“路径提取”工具,“运行参数”中的“提取方式”选择“查找边缘点”,如下图所示:

-
然后在模板匹配中创建大致轨迹和训练参数(阈值、卡尺、路径点数量等),如下图所示:

-
点击完成后执行,即可查询边缘点
问题根因
不熟悉VisionMaster的路径提取工具。
1.2.16 标定板生成:使用VM自研标定板Demo生产标定板的方法
描述
环境:VM4.0.0
现象:如何使用VisionMaster软件的自研标定板Demo生成标定板?
解答
-
在VisionMaster软件的“工具”中打开“标定板生成工具”,或者在VisionMaster软件安装目录“VisionMaster\VisionMaster4.0.0\Applications\Tools\自研标定板生成Demo”下打开“DemoGenCalBoard_ch.exe”应用程序,运行结果如下图所示:

-
根据提示进行标定板文件生成步骤,如下图所示:

-
按任意键退出,标定文件生成在安装目录“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模块循环的使用及索引订阅方法。
相关文章:
【VM服务管家】VM4.0软件使用_1.2 工具类
目录 1.2.1 文本保存:逐行保存格式化模块输出的方法1.2.2 脚本模块:循环模块搭配脚本使用的方法1.2.3 几何查找:彩色图像的几何查找方法1.2.4 深度学习:图像分割的面积的获取方法1.2.5 颜色识别:使用颜色识别工具做分类…...
Android系统架构
Application层,也就是应用层,不仅包括通话短信联系人这种系统级的应用,还包括用户自己安装的一些第三方应用Framework层,这一层大部分用Java写的,包括系统服务和四大组件Library层,这一层大部分都是C/C写的…...
零基础想成为黑客,只需要四步
前言 首先要明白,该篇文章说的黑客不是那种窃取别人信息、攻击别人系统的黑客,说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心之一就是渗透攻防技术,是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模…...
ChatGPT研究报告:AIGC带来新一轮范式转移
本文约4000字,目标是快速建立AIGC知识体系,含有大量的计算专业名词,建议阅读同时扩展搜索。 一、行业现状 1、概念界定 区别于PGC与UGC不同的,AIGC是利用人工智能技术自动生成内容的新型生产方式。 2、数据模态 按照模态区分&a…...
自助式数据分析平台:jvs数据智仓-统计报表的使用条件及界面介绍
统计报表界面介绍 统计报表是指利用表格和报表等形式,将数据以清晰的结构和布局的方式呈现出来,以便用户进行数据分析和决策制定的一种BI统计方法。表格式的BI统计通常采用交叉表格、分组表、报表等形式,对数据进行整合、分析和展示ÿ…...
php连接sqlserver
1.使用工具 Wampserver--3.3 sqlserver2023 php7.4.33 2.连接流程 1.下载Microsoft Drivers for PHP for SQL Server 下载地址:下载 Microsoft Drivers for PHP for SQL Server - PHP drivers for SQL Server | Microsoft Learn 2.下载Microsoft ODBC Driver …...
Android 9.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(一)
1.前言 在9.0的系统rom产品定制化开发中,在原生系统SystemUI下拉状态栏的通知栏的通知背景默认是白色四角的背景, 由于在产品设计中,需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通知显示流程,设置默认下拉状态栏UI中的…...
vCenter(PSC)正常更改或重置administrator@vsphere.local用户的密码方法
1. 正常更改administratorvsphere.local用户密码 在vCenter界面中选择“菜单”下的“系统管理”,如下图所示: 然后在Single Sign On下的用户和组中,选择“vsphere.local”域,再对Administrator用户进行编辑,即可进行…...
【五一创作】Java 反射
在了解反射前,我们先要知道一些相关知识 Class类 Class类的实例表示java应用运行时的类或接口,每个java类运行时都在JVM里表现为一个class对象,可通过类名.class、类型.getClass()、Class.forName("类名")等方法获取class对象。 …...
常见元件、封装、尺寸、表面处理等
参考:https://www.bilibili.com/read/cv11024927?fromsearch&spm_id_from333.337.0.0 参考:https://www.bilibili.com/read/cv18413169?fromsearch&spm_id_from333.337.0.0 目录 通孔插件(THT)和表面贴装(SMT)技术封装类型SOP/SOIC封装DIP封装…...
作为一名8年测试工程师,因为偷偷接私活被····
接私活 对程序员这个圈子来说是一个既公开又隐私的话题,不说全部,应该大多数程序员都有过想要接私活的想法,当然,也有部分得道成仙的不主张接私活。但是很少有人在公开场合讨论私活的问题,似乎都在避嫌。就跟有人下班后…...
前端面试八股文
1、HTTP和HTTPS 1.1、http和https的基本概念 http: 是一个客户端和服务器端请求和应答的标准(TCP),用于从 WWW 服务器传输超文本到本地浏览器的超文本传输协议。 https: 是以安全为目标的 HTTP 通道,即 HTTP 下 加入 SS…...
[创新工具和方法论]-02- DOE实验设计步骤
文章目录 1.DOE设计1.1 基于OFAT的传统实验设计:1.2 基于DoE的现代实验设计:1.3 DOE和OFAT的比较1.4 如何利用好DOE1.4.1 规划1.4.2 筛选1.4.3 表征1.4.4 优化1.4.5 确认 2. 步骤2.1陈述实际的问题和实验的目的2.2因果链分析,提取重要的因子2.3选择Y的响…...
XXL-JOB分布式任务调度平台搭建以及和SpringBoot整合应用
1 前言 XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 可以前往 Gitee 地址进行下载使用: https://gitee.com/xuxueli0323/xxl-job.g…...
【LeetCode】236. 二叉树的最近公共祖先
1.问题 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是…...
STM32F4 HAL库使用DMA进行ADC采样实时发送波形到串口显示(包含傅里叶变换)
1.总体逻辑 按下STM32F4的KEY0按键,通过外部中断的方式对按键进行检测,然后开启一次带DMA的固定点数的ADC采集,采集完成后在DMA的中断发送采集到的数据,然后清空数据区准备下一次的按键中断。电脑接受到串口数据后对数据进行简单…...
ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~
文章目录 ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~HuggingFace 简介HuggingChat 登场展望 ChatGPT 平替天花板:HuggingFace 版 ChatGPT 来了,无需魔法无需等待直接起飞 ~ 二话不说上链接 htt…...
桐乡学会计实操—小规模纳税人征收率的汇总帖来啦!
上元会计—会计实操—小规模纳税人征收率的汇总帖来啦!一文了解 小规模纳税人发生应税行为适用简易计税方法计税。那么小规模纳税人增值税的征收率到底有几档?很多人以为小规模纳税人适用的征收率只有3%,但是有没有其他征收率呢,…...
权威学者、企业CFO荟聚上海国家会计学院,共探「智能会计 价值财务」
4月21日,由用友主办的「智能会计 价值财务」2023企业数智化财务创新峰会在上海国家会计学院圆满举办。学院权威教授、业内专家与来自央国企、行业领先企业的财务先锋,线下云端共聚一堂,数万人共探大型企业财务数智化的全新价值主张。 会议伊始…...
根据cadence设计图学习硬件知识day06 了解一些电源转化芯片和 稳压器 和 开关芯片
1. TPL920 (高精度线性稳压器) 1.1.TPL920 介绍 TPL920系列产品是2A大电流、6μVRMS低噪声、高PSRR、高精度线性稳压器,通常具有在2A负载条件下的110 mV超低电压降。这TPL920系列产品同时支持固定输出电压范围从0.8伏到3.95伏,输出电压可调范围为0.8V至…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
