目录
- 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 _