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