机器视觉大师(MVS),一体式可编程机器视觉控制器(FVS), 可组态机器视觉控制器(EVS)都支持脚本编程。虽然机器视觉大师脚本编程最简单,但是很多用户普遍感觉好像很难入门,笔者将详细介绍一下这些机器视觉大师的脚本编程原理和过程。
机器视觉大师在自动检测模式下,可以支持用户脚本编程。为什么要这样的功能呢?这需要简单介绍一下机器视觉大师提供自动检测功能的目的说起。
机器视觉大师自动检测功能主要用于开发全自动机器视觉自动化系统的前期实验分析(图形预处理,特征算法等)或桌面式半自动机器视觉应用。机器视觉在自动化领域的应用从软件开发方面来讲主要涉及图像预处理,特征分析,模式识别算法等,实现工业领域常用的如定位,颜色区分,缺陷检测,生产日期检测或识别,条码识别等。如果一个新的需求全部从头开始开发的话,工作量十分巨大,而且需要开发人员既具有图像处理方面的知识,也需要具备比较强的编程能力,一般来说,是非常困难的。
机器视觉大师将图像分析和常用的模式识别等算法完全封装成检测算子,采用可视化编辑的方式,用户只需要动动鼠标扒拉几下, 不到几分钟,一个机器视觉应用系统原型将很快建立起来。但是,由于应用的复杂化,机器视觉大师提供的算子可能不能完全适用用户的实际需求。这就需要用户进行最后的处理即脚本编程,来完成最终的目标。打个比喻来说,机器视觉大师就好比一个城市建立的地铁系统,虽然方便快捷,但是最后一公里还需要一种交通工具如共享单车,才能使乘客很舒服地到达目的地。脚本编程好像是共享单车,虽然不是全自动的,需要用点力,但是操作实在是很简单,只要掌握好方向盘,用力蹬就行了。
机器视觉大师里面设计一个简单的机器视觉或影像自动检测应用,基本过程如下:

言归正传,在机器视觉大师里面进行脚本编程其实也是很简单的一件事。不像一些高级编程语言如c/c++,java, 网页脚本php,这些语言功能较强,支持类,函数,事件等,需要掌握的知识点较多,学习起来比较复杂,漫长。机器视觉大师的脚本编程只需要掌握两点:1. 理解和掌握对象和属性的概念; 2. 理解和应用逻辑判断和循环或顺序执行。完全不需要自定义什么类,函数什么的。这些概念是所有编程语言里面最基本的内容。所以,别担心,一切会是那么的简单。
对象模型
在机器视觉大师里面,编程的时候一定是以对象为主。 顶层对象只有两种,即视场对象和整个应用程序对象。 视场对象下面有算子对象,算子对象有读数属性(复合型读数如点(x,y)也可以理解成对象)。不同的算子对象具有不同的读数,有数据类,有文本类,或数组类。机器视觉大师里面的基本对象模型如下图:

应用程序对象根据当前的检测任务的不同,具有不同的属性(也称变量)。视场对象即相机所能成像的范围,表现为一个图像,但实际编程时可能与图像完全不搭边,所以只要记住,当前PC系统有几个相机,就可以理解有几个视场对象。视场下面的算子的数量根据用户自己实际添加的数量决定。
在编程中,所有的对象均使用名称标识,这些标识均系统已经自动命名, 应用程序对象的名字为mvs, 有且只有一个。视场对象的名字为sight, 后面紧接一个数字,表示不同的视场对象等等,如sight1。视场里面不同的算子分别有自己的名字,同类型的算子后面添加序号加以区分,与视场名字的命名规则差不多。
使用的时候,对象一定是从最顶层对象开始,然后往下一层,再往下一层,直到属性,不同的对象之间使用圆点”.”符号进行连接。例如,如果要获得视场一(sight1)里面的双态识别算子(dual1)的“检测结果”读数, 如:
n = sight1.dual1.res
算子对象的读数在运行一次检测以后,系统会自动给出结果,但是,应用程序对象的属性很多情况下,需要用户在脚本里面进行编程计算,如
mvs.good = 1,
这条语句将应用程序对象的good属性设置为1.
不同检测算子可用读数如下表(由于版本不断变化,请使用实际名称)
检测算子
|
读数名称
|
数据类型
|
说明
|
双态检测
|
res-结果
|
整数
|
模板索引。如果为0表示第一个模板,如果为1表示第2个模板。
|
定位
|
count – 实例个数
position –位置
abspos –绝对位置
offset – 偏移
|
整数
点
点
2D实数
|
如果找到实例,返回1,否则返回0
|
多态检测
|
result – 结果(最大分数的模板索引)
count –已经学习的模板数
pattname – 模板名称或说明
score – 当前识别的每个模板分数值
|
整数
整数
文本
实数
|
多态检测的识别结果为分数最高的模板索引。除非进行了实际的模板增或减操作,已经学习的模板数每次识别以后都不会变换。
|
模板识别
|
count – 实例个数
position –位置
angle – 角度
|
整数
点
实数
|
|
一维码
|
count – 条码个数
content –条码内容
|
整数
文本
|
|
二维码
|
count – 条码个数
content –条码内容
|
整数
文本
|
|
BLOB分析
|
count – blob个数
offset – 偏移
width – 宽度
length – 长度
centroid – 质心
dens – 密度
pixsum – 像素和
pixavg – 像素平均
pixvar—像素方差
strength – 强度
perim – 周长
area – 面积
circu -- 圆度
slant – 斜率
rect – 外接矩形
|
整数
2D实数
整数
整数
点
实数
实数
实数
实数
实数
整数
整数
实数
实数
矩形
|
|
文字识别
|
content –字符内容
|
文本
|
|
颜色识别
|
result – 结果
|
整数
|
返回颜色索引
|
边距测量
|
result – 结果
|
整数
|
返回实际的长度,以像素为单位
|
如果结果有多组相同属性,那么该属性即为属性数组,需要使用数组的方式进行引用,如
blob1.offset[1].x
数组序号从1开始。 记住: 凡是有多组相同属性的的算子,一般都会提供一个名称类似“count”的读数表示当前有多少组属性。如:
n = blob1.count
m = pmat1.count
万一忘记某个算子的读数,也可以在对应算子的参数设置窗口里面的读数页中得到,如下图:
逻辑判断和条件执行
机器视觉脚本编程机大部分上是对视场中算子的结果进行逻辑运行以后,然后对应用程序对象的相关属性进行赋值的一个过程。这样的简单的方式,极大地增强软件的功能,达到完全满足用户需求的目的。下面为脚本编辑的一般过程:
  。

出于简单易用的考虑,机器视觉大师支持最基本的逻辑判断表达式和条件执行语句。当然,最基本的赋值语句和算术表达式是必须支持的。语句不需要结束符如c语言中的”;”,但是需要使用空格隔开,出于可读性考虑,建议一个语句使用一行,最好采用缩进结构。
下表是逻辑运算表达式:
逻辑运算符或关系运算符,算术运算符,括号等构成逻辑表达式,其结果只能为true(真)或false(假)。
支持的逻辑或关系运算符如下:
算符或关键词
|
说明
|
类型
|
and
|
与,左右两边的表达式为true,结果才为true,否则为false
|
逻辑运算符
|
or
|
或,左右两边的任意一个表达式为true,结果为true,否则为false
|
逻辑运算符
|
not
|
非,如果右边的表达式为true,结果为false。反之如果右边的表达式为false,结果为true。
|
逻辑运算符
|
<
|
小于,左边的表达式值如果小于右边的表达式值,结果为true,否则为false.
|
关系运算符
|
>
|
大于,左边的表达式值如果大于右边的表达式值,结果为true,否则为false.
|
关系运算符
|
<=
|
小于等于,左边的表达式值如果小于等于右边的表达式值,结果为true,否则为false.
|
关系运算符
|
>=
|
大于等于,左边的表达式值如果大于等于右边的表达式值,结果为true,否则为false.
|
关系运算符
|
==
|
等于,左边的表达式值如果等于右边的表达式值,结果为true,否则为false.
|
关系运算符
|
~=
|
不等于,左边的表达式值如果不等于右边的表达式值,结果为true,否则为false.
|
关系运算符
|
算术表达式的算符如下:

一个表达式可能由不同的类型的的表达式组成。这些表达式在计算的时候遵守一定的优先顺序。运算符可以通过括号括起,括号里面的运算符号具有最高的优先级。当无括号的情况下,这些运算符的从高到低的优先顺序如下:
^
|
not,-
|
*, /, %
|
+, -
|
<, > , <=, >=, ==, ~=
|
and
|
or
|
在机器视觉大师脚本里面可以随意定义变量,这些变量不需要申明数据类型,直接将算术表达式或逻辑表达式赋值即可。变量的类型根据表达式的结果决定,可以是逻辑类,数值类或文本类。
逻辑类的变量只能为true或 false, 文本类的内容需要用双引号括起。如
label = “hello, world”
result = sight1.dual1.res == 0
if result == true then
//do something
end
机器视觉大师可以运行不同种类的自动检测任务。很多情况下,需要进行控制执行,对不同的属性进行赋值,以获得最终结果。机器视觉大师提供基本的控制关键词如if, while, for等
if then else
if语句先测试其条件,然后根据测试结果执行then部分或者else部分,else部分是可选的。如果要编写嵌套的if,可以使用elseif。如:
示例一
if a < 0 then
a = 0
end
示例二
if a < b then
a =b
else
a = a+1
end
示例三
if op == "+" then
r = a + b
elseif op == "-" then
r = a – b
end
while
while语句评估逻辑表达式的值,当结果为true的时候,执行程序块。如:
local a = 10
while a > 0 do
a = a - 1
end
for
for语句将指定的变量进行递增计算,循环一定次数。如:
for i= 1, 100, 1 do
# Do something
end
该段语句将反复执行程序段100次。在for语句里面,第一个数字为初始值,第二个数字为终止值,第三个数字为步长,通常情况下为1,如果为1的话,第三个数字可以省略。
如果需要返回不再往下执行,可以使用return关键词进行返回。跳出一些循环块,可以使用break关键词。如:
for i= 1, 100, 1 do
if i==50 then
break
end
end
n = 100
上面的语句段基本算法为当i等于50的时候,跳出循环,然后运行n=100语句。
机器视觉大师支持不同的检测任务类型,不同的检测类型下,可用的应用程序属性数量和含义是不一样的。这些属性如合格数,在检测运行过程中将在结果显示面板中被显示出来。下表为支持的所有属性(全局变量):
名称
|
说明
|
适用的检测类型
|
数据类型
|
rd1
|
读数1
|
常规检测(默认)
|
实数
|
rd2
|
读数2
|
常规检测(默认)
|
实数
|
rd3
|
读数3
|
常规检测(默认)
|
实数
|
rd4
|
读数4
|
常规检测(默认)
|
实数
|
rd5
|
读数5
|
常规检测(默认)
|
实数
|
rd6
|
读数6
|
常规检测(默认)
|
实数
|
rd7
|
读数7
|
常规检测(默认)
|
实数
|
rd8
|
读数8
|
常规检测(默认)
|
实数
|
good
|
合格品
|
质量检测
|
布尔类整数,仅为1或0
|
ng
|
缺陷品
|
质量检测
|
布尔类整数,仅为1或0
|
count
|
当前数
|
产品计数
|
整数(无小数部分)
|
diff
|
差数
|
产品计数
|
整数(无小数部分
|
want
|
目标数
|
产品计数
|
整数(无小数部分
|
ms1
|
测量到的实际值1
|
尺寸测量
|
实数
|
ws1
|
目标尺寸的标准值1
|
尺寸测量
|
实数
|
dif1
|
误差1
|
尺寸测量
|
实数
|
ms2
|
测量到的实际值2
|
尺寸测量
|
实数
|
ws2
|
目标尺寸的标准值2
|
尺寸测量
|
实数
|
dif2
|
误差2
|
尺寸测量
|
实数
|
ms3
|
测量到的实际值3
|
尺寸测量
|
实数
|
ws3
|
目标尺寸的标准值3
|
尺寸测量
|
实数
|
dif3
|
误差3
|
尺寸测量
|
实数
|
ms4
|
测量到的实际值4
|
尺寸测量
|
实数
|
ws4
|
目标尺寸的标准值4
|
尺寸测量
|
实数
|
dif4
|
误差4
|
尺寸测量
|
实数
|
最后,以一个实际检测的一个脚本结束本文。如下:
cnt = sight2.blob1.cnt
if cnt ~= 5 then
mvs.good = 0
mvs.ng =1
return
end
for i=1,5 do
if sight2.blob1.w[i] <25 then
mvs.good = 0
mvs.ng =1
return
end
if sight2.blob1.h[i] <12 then
mvs.good = 0
mvs.ng =1
return
end
end
mvs.good =1
mvs.ng =0
这个脚本算法解释如下:如果sight2中的blob1的个数不是5个,那么将good设置为0,ng属性设置为1后,直接返回。否则,逐个判断其高度或宽度,如果不合格则进行相应处理,然后返回。当所有的blob宽度和高度完全合格以后,将good设为1,ng设为0,然后返回。
|