機(jī)器視覺(jué)大師腳本編程
機(jī)器視覺(jué)大師(MVS),一體式可編程機(jī)器視覺(jué)操控器(FVS), 可組態(tài)機(jī)器視覺(jué)操控器(EVS)都支撐腳本編程。盡管機(jī)器視覺(jué)大師腳本編程最簡(jiǎn)略,可是許多用戶遍及感覺(jué)好像很難入門,筆者將具體介紹一下這些機(jī)器視覺(jué)大師的腳本編程原理和進(jìn)程。
機(jī)器視覺(jué)大師在主動(dòng)檢測(cè)形式下,能夠支撐用戶腳本編程。為什么要這樣的功用呢?這需求簡(jiǎn)略介紹一下機(jī)器視覺(jué)大師供給主動(dòng)檢測(cè)功用的意圖說(shuō)起。
機(jī)器視覺(jué)大師主動(dòng)檢測(cè)功用首要用于開發(fā)全主動(dòng)機(jī)器視覺(jué)主動(dòng)化體系的前期試驗(yàn)剖析(圖形預(yù)處理,特征算法等)或桌面式半主動(dòng)機(jī)器視覺(jué)運(yùn)用。機(jī)器視覺(jué)在主動(dòng)化范疇的運(yùn)用從軟件開發(fā)方面來(lái)講首要觸及圖畫預(yù)處理,特征剖析,形式辨認(rèn)算法等,完結(jié)工業(yè)范疇常用的如定位,色彩區(qū)別,缺點(diǎn)檢測(cè),生產(chǎn)日期檢測(cè)或辨認(rèn),條碼辨認(rèn)等。如果一個(gè)新的需求悉數(shù)從頭開端開發(fā)的話,工作量非常巨大,而且需求開發(fā)人員既具有圖畫處理方面的常識(shí),也需求具備比較強(qiáng)的編程才能,一般來(lái)說(shuō),是非常困難的。
機(jī)器視覺(jué)大師將圖畫剖析和常用的形式辨認(rèn)等算法徹底封裝成檢測(cè)算子,選用可視化修改的方法,用戶只需求動(dòng)動(dòng)鼠標(biāo)扒拉幾下, 不到幾分鐘,一個(gè)機(jī)器視覺(jué)運(yùn)用體系原型將很快樹立起來(lái)??墒牵?yàn)檫\(yùn)用的復(fù)雜化,機(jī)器視覺(jué)大師供給的算子可能不能徹底適用用戶的實(shí)踐需求。這就需求用戶進(jìn)行終究的處理即腳本編程,來(lái)完結(jié)終究的方針。打個(gè)比方來(lái)說(shuō),機(jī)器視覺(jué)大師就好比一個(gè)城市樹立的地鐵體系,盡管方便快捷,可是終究一公里還需求一種交通工具如同享單車,才能使乘客很舒暢地抵達(dá)意圖地。腳本編程好像是同享單車,盡管不是全主動(dòng)的,需求用點(diǎn)力,可是操作實(shí)在是很簡(jiǎn)略,只需把握好方向盤,用力蹬就行了。
機(jī)器視覺(jué)大師里邊設(shè)計(jì)一個(gè)簡(jiǎn)略的機(jī)器視覺(jué)或印象主動(dòng)檢測(cè)運(yùn)用,根本進(jìn)程如下:
言歸正傳,在機(jī)器視覺(jué)大師里邊進(jìn)行腳本編程其實(shí)也是很簡(jiǎn)略的一件事。不像一些高檔編程言語(yǔ)如c/c++,java, 網(wǎng)頁(yè)腳本php,這些言語(yǔ)功用較強(qiáng),支撐類,函數(shù),事情等,需求把握的常識(shí)點(diǎn)較多,學(xué)習(xí)起來(lái)比較復(fù)雜,綿長(zhǎng)。機(jī)器視覺(jué)大師的腳本編程只需求把握兩點(diǎn):1. 了解和把握方針和特點(diǎn)的概念; 2. 了解和運(yùn)用邏輯判別和循環(huán)或次序履行。徹底不需求自界說(shuō)什么類,函數(shù)什么的。這些概念是全部編程言語(yǔ)里邊最根本的內(nèi)容。所以,別憂慮,全部會(huì)是那么的簡(jiǎn)略。
方針模型
在機(jī)器視覺(jué)大師里邊,編程的時(shí)分必定是以方針為主。 頂層方針只需兩種,即視場(chǎng)方針和整個(gè)運(yùn)用程序方針。 視場(chǎng)方針下面有算子方針,算子方針有讀數(shù)特點(diǎn)(復(fù)合型讀數(shù)如點(diǎn)(x,y)也能夠了解成方針)。不同的算子方針具有不同的讀數(shù),有數(shù)據(jù)類,有文本類,或數(shù)組類。機(jī)器視覺(jué)大師里邊的根本方針模型如下圖:
運(yùn)用程序方針依據(jù)當(dāng)時(shí)的檢測(cè)使命的不同,具有不同的特點(diǎn)(也稱變量)。視場(chǎng)方針即相機(jī)所能成像的規(guī)模,表現(xiàn)為一個(gè)圖畫,但實(shí)踐編程時(shí)可能與圖畫徹底不搭邊,所以只需記住,當(dāng)時(shí)PC體系有幾個(gè)相機(jī),就能夠了解有幾個(gè)視場(chǎng)方針。視場(chǎng)下面的算子的數(shù)量依據(jù)用戶自己實(shí)踐增加的數(shù)量決議。
在編程中,全部的方針均運(yùn)用稱號(hào)標(biāo)識(shí),這些標(biāo)識(shí)均體系現(xiàn)已主動(dòng)命名, 運(yùn)用程序方針的姓名為mvs, 有且只需一個(gè)。視場(chǎng)方針的姓名為sight, 后邊緊接一個(gè)數(shù)字,表明不同的視場(chǎng)方針等等,如sight1。視場(chǎng)里邊不同的算子分別有自己的姓名,同類型的算子后邊增加序號(hào)加以區(qū)別,與視場(chǎng)姓名的命名規(guī)矩差不多。
運(yùn)用的時(shí)分,方針必定是從最頂層方針開端,然后往下一層,再往下一層,直到特點(diǎn),不同的方針之間運(yùn)用圓點(diǎn)”.”符號(hào)進(jìn)行連接。例如,如果要取得視場(chǎng)一(sight1)里邊的雙態(tài)辨認(rèn)算子(dual1)的“檢測(cè)成果”讀數(shù), 如:
n = sight1.dual1.res
算子方針的讀數(shù)在運(yùn)轉(zhuǎn)一次檢測(cè)今后,體系會(huì)主動(dòng)給出成果,可是,運(yùn)用程序方針的特點(diǎn)許多情況下,需求用戶在腳本里邊進(jìn)行編程核算,如
mvs.good = 1,
這條句子將運(yùn)用程序方針的good特點(diǎn)設(shè)置為1.
不同檢測(cè)算子可用讀數(shù)如下表(因?yàn)榘鎰e不斷變化,請(qǐng)運(yùn)用實(shí)踐稱號(hào))
檢測(cè)算子 |
讀數(shù)稱號(hào) |
數(shù)據(jù)類型 |
闡明 |
雙態(tài)檢測(cè) |
res-成果 |
整數(shù) |
模板索引。如果為0表明第一個(gè)模板,如果為1表明第2個(gè)模板。 |
定位 |
count – 實(shí)例個(gè)數(shù) position –方位 abspos –肯定方位 offset – 偏移 |
整數(shù) 點(diǎn) 點(diǎn) 2D實(shí)數(shù) |
如果找到實(shí)例,回來(lái)1,不然回來(lái)0 |
多態(tài)檢測(cè) |
result – 成果(最大分?jǐn)?shù)的模板索引) count –現(xiàn)已學(xué)習(xí)的模板數(shù) pattname – 模板稱號(hào)或闡明 score – 當(dāng)時(shí)辨認(rèn)的每個(gè)模板分?jǐn)?shù)值 |
整數(shù) 整數(shù) 文本 實(shí)數(shù) |
多態(tài)檢測(cè)的辨認(rèn)成果為分?jǐn)?shù)最高的模板索引。除非進(jìn)行了實(shí)踐的模板增或減操作,現(xiàn)已學(xué)習(xí)的模板數(shù)每次辨認(rèn)今后都不會(huì)改換。 |
模板辨認(rèn) |
count – 實(shí)例個(gè)數(shù) position –方位 angle – 視點(diǎn) |
整數(shù) 點(diǎn) 實(shí)數(shù) |
|
一維碼 |
count – 條碼個(gè)數(shù) content –條碼內(nèi)容 |
整數(shù) 文本 |
|
二維碼 |
count – 條碼個(gè)數(shù) content –條碼內(nèi)容 |
整數(shù) 文本 |
|
BLOB剖析 |
count – blob個(gè)數(shù) offset – 偏移 width – 寬度 length – 長(zhǎng)度 centroid – 質(zhì)心 dens – 密度 pixsum – 像素和 pixavg – 像素平均 pixvar—像素方差 strength – 強(qiáng)度 perim – 周長(zhǎng) area – 面積 circu -- 圓度 slant – 斜率 rect – 外接矩形 |
整數(shù) 2D實(shí)數(shù) 整數(shù) 整數(shù) 點(diǎn) 實(shí)數(shù) 實(shí)數(shù) 實(shí)數(shù) 實(shí)數(shù) 實(shí)數(shù) 整數(shù) 整數(shù) 實(shí)數(shù) 實(shí)數(shù) 矩形 |
|
文字辨認(rèn) |
content –字符內(nèi)容 |
文本 |
|
色彩辨認(rèn) |
result – 成果 |
整數(shù) |
回來(lái)色彩索引 |
邊距丈量 |
result – 成果 |
整數(shù) |
回來(lái)實(shí)踐的長(zhǎng)度,以像素為單位 |
如果成果有多組相同特點(diǎn),那么該特點(diǎn)即為特點(diǎn)數(shù)組,需求運(yùn)用數(shù)組的方法進(jìn)行引證,如
blob1.offset[1].x
數(shù)組序號(hào)從1開端。 記?。?但凡有多組相同特點(diǎn)的的算子,一般都會(huì)供給一個(gè)稱號(hào)相似“count”的讀數(shù)表明當(dāng)時(shí)有多少組特點(diǎn)。如:
n = blob1.count
m = pmat1.count
如果忘掉某個(gè)算子的讀數(shù),也能夠在對(duì)應(yīng)算子的參數(shù)設(shè)置窗口里邊的讀數(shù)頁(yè)中得到,如下圖:
邏輯判別和條件履行
機(jī)器視覺(jué)腳本編程機(jī)大部分上是對(duì)視場(chǎng)中算子的成果進(jìn)行邏輯運(yùn)轉(zhuǎn)今后,然后對(duì)運(yùn)用程序方針的相關(guān)特點(diǎn)進(jìn)行賦值的一個(gè)進(jìn)程。這樣的簡(jiǎn)略的方法,極大地增強(qiáng)軟件的功用,達(dá)到徹底滿意用戶需求的意圖。下面為腳本修改的一般進(jìn)程:
出于簡(jiǎn)略易用的考慮,機(jī)器視覺(jué)大師支撐最根本的邏輯判別表達(dá)式和條件履行句子。當(dāng)然,最根本的賦值句子和算術(shù)表達(dá)式是必須支撐的。句子不需求完畢符如c言語(yǔ)中的”;”,可是需求運(yùn)用空格隔開,出于可讀性考慮,主張一個(gè)句子運(yùn)用一行,最好選用縮進(jìn)結(jié)構(gòu)。
下表是邏輯運(yùn)算表達(dá)式:
邏輯運(yùn)算符或聯(lián)系運(yùn)算符,算術(shù)運(yùn)算符,括號(hào)等構(gòu)成邏輯表達(dá)式,其成果只能為true(真)或false(假)。
支撐的邏輯或聯(lián)系運(yùn)算符如下:
算符或關(guān)鍵詞 |
闡明 |
類型 |
and |
與,左右兩頭的表達(dá)式為true,成果才為true,不然為false |
邏輯運(yùn)算符 |
or |
或,左右兩頭的恣意一個(gè)表達(dá)式為true,成果為true,不然為false |
邏輯運(yùn)算符 |
not |
非,如果右邊的表達(dá)式為true,成果為false。反之如果右邊的表達(dá)式為false,成果為true。 |
邏輯運(yùn)算符 |
< |
小于,左面的表達(dá)式值如果小于右邊的表達(dá)式值,成果為true,不然為false. |
聯(lián)系運(yùn)算符 |
> |
大于,左面的表達(dá)式值如果大于右邊的表達(dá)式值,成果為true,不然為false. |
聯(lián)系運(yùn)算符 |
<= |
小于等于,左面的表達(dá)式值如果小于等于右邊的表達(dá)式值,成果為true,不然為false. |
聯(lián)系運(yùn)算符 |
>= |
大于等于,左面的表達(dá)式值如果大于等于右邊的表達(dá)式值,成果為true,不然為false. |
聯(lián)系運(yùn)算符 |
== |
等于,左面的表達(dá)式值如果等于右邊的表達(dá)式值,成果為true,不然為false. |
聯(lián)系運(yùn)算符 |
~= |
不等于,左面的表達(dá)式值如果不等于右邊的表達(dá)式值,成果為true,不然為false. |
聯(lián)系運(yùn)算符 |
算術(shù)表達(dá)式的算符如下:
一個(gè)表達(dá)式可能由不同的類型的的表達(dá)式組成。這些表達(dá)式在核算的時(shí)分恪守必定的優(yōu)先次序。運(yùn)算符能夠經(jīng)過(guò)括號(hào)括起,括號(hào)里邊的運(yùn)算符號(hào)具有最高的優(yōu)先級(jí)。當(dāng)無(wú)括號(hào)的情況下,這些運(yùn)算符的從高到低的優(yōu)先次序如下:
^ |
not,- |
*, /, % |
+, - |
<, > , <=, >=, ==, ~= |
and |
or |
在機(jī)器視覺(jué)大師腳本里邊能夠隨意界說(shuō)變量,這些變量不需求聲明數(shù)據(jù)類型,直接將算術(shù)表達(dá)式或邏輯表達(dá)式賦值即可。變量的類型依據(jù)表達(dá)式的成果決議,能夠是邏輯類,數(shù)值類或文本類。
邏輯類的變量只能為true或 false, 文本類的內(nèi)容需求用雙引號(hào)括起。如
label = “hello, world”
result = sight1.dual1.res == 0
if result == true then
//do something
end
機(jī)器視覺(jué)大師能夠運(yùn)轉(zhuǎn)不同品種的主動(dòng)檢測(cè)使命。許多情況下,需求進(jìn)行操控履行,對(duì)不同的特點(diǎn)進(jìn)行賦值,以取得終究成果。機(jī)器視覺(jué)大師供給根本的操控關(guān)鍵詞如if, while, for等
if then else
if句子先測(cè)試其條件,然后依據(jù)測(cè)試成果履行then部分或許else部分,else部分是可選的。如果要編寫嵌套的if,能夠運(yùn)用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句子評(píng)價(jià)邏輯表達(dá)式的值,當(dāng)成果為true的時(shí)分,履行程序塊。如:
local a = 10
while a > 0 do
a = a - 1
end
for
for句子將指定的變量進(jìn)行遞加核算,循環(huán)必定次數(shù)。如:
for i= 1, 100, 1 do
# Do something
end
該段句子將重復(fù)履行程序段100次。在for句子里邊,第一個(gè)數(shù)字為初始值,第二個(gè)數(shù)字為終止值,第三個(gè)數(shù)字為步長(zhǎng),通常情況下為1,如果為1的話,第三個(gè)數(shù)字能夠省掉。
如果需求回來(lái)不再往下履行,能夠運(yùn)用return關(guān)鍵詞進(jìn)行回來(lái)。跳出一些循環(huán)塊,能夠運(yùn)用break關(guān)鍵詞。如:
for i= 1, 100, 1 do
if i==50 then
break
end
end
n = 100
上面的句子段根本算法為當(dāng)i等于50的時(shí)分,跳出循環(huán),然后運(yùn)轉(zhuǎn)n=100句子。
機(jī)器視覺(jué)大師支撐不同的檢測(cè)使命類型,不同的檢測(cè)類型下,可用的運(yùn)用程序特點(diǎn)數(shù)量和意義是不一樣的。這些特點(diǎn)如合格數(shù),在檢測(cè)運(yùn)轉(zhuǎn)進(jìn)程中將在成果顯示面板中被顯示出來(lái)。下表為支撐的全部特點(diǎn)(全局變量):
稱號(hào) |
闡明 |
適用的檢測(cè)類型 |
數(shù)據(jù)類型 |
rd1 |
讀數(shù)1 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd2 |
讀數(shù)2 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd3 |
讀數(shù)3 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd4 |
讀數(shù)4 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd5 |
讀數(shù)5 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd6 |
讀數(shù)6 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd7 |
讀數(shù)7 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
rd8 |
讀數(shù)8 |
慣例檢測(cè)(默許) |
實(shí)數(shù) |
good |
合格品 |
質(zhì)量檢測(cè) |
布爾類整數(shù),僅為1或0 |
ng |
缺點(diǎn)品 |
質(zhì)量檢測(cè) |
布爾類整數(shù),僅為1或0 |
count |
當(dāng)時(shí)數(shù) |
產(chǎn)品計(jì)數(shù) |
整數(shù)(無(wú)小數(shù)部分) |
diff |
差數(shù) |
產(chǎn)品計(jì)數(shù) |
整數(shù)(無(wú)小數(shù)部分 |
want |
方針數(shù) |
產(chǎn)品計(jì)數(shù) |
整數(shù)(無(wú)小數(shù)部分 |
ms1 |
丈量到的實(shí)踐值1 |
尺度丈量 |
實(shí)數(shù) |
ws1 |
方針尺度的規(guī)范值1 |
尺度丈量 |
實(shí)數(shù) |
dif1 |
差錯(cuò)1 |
尺度丈量 |
實(shí)數(shù) |
ms2 |
丈量到的實(shí)踐值2 |
尺度丈量 |
實(shí)數(shù) |
ws2 |
方針尺度的規(guī)范值2 |
尺度丈量 |
實(shí)數(shù) |
dif2 |
差錯(cuò)2 |
尺度丈量 |
實(shí)數(shù) |
ms3 |
丈量到的實(shí)踐值3 |
尺度丈量 |
實(shí)數(shù) |
ws3 |
方針尺度的規(guī)范值3 |
尺度丈量 |
實(shí)數(shù) |
dif3 |
差錯(cuò)3 |
尺度丈量 |
實(shí)數(shù) |
ms4 |
丈量到的實(shí)踐值4 |
尺度丈量 |
實(shí)數(shù) |
ws4 |
方針尺度的規(guī)范值4 |
尺度丈量 |
實(shí)數(shù) |
dif4 |
差錯(cuò)4 |
尺度丈量 |
實(shí)數(shù) |
終究,以一個(gè)實(shí)踐檢測(cè)的一個(gè)腳本完畢本文。如下:
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
這個(gè)腳本算法解說(shuō)如下:如果sight2中的blob1的個(gè)數(shù)不是5個(gè),那么將good設(shè)置為0,ng特點(diǎn)設(shè)置為1后,直接回來(lái)。不然,逐一判別其高度或?qū)挾?,如果不合格則進(jìn)行相應(yīng)處理,然后回來(lái)。當(dāng)全部的blob寬度和高度徹底合格今后,將good設(shè)為1,ng設(shè)為0,然后回來(lái)。