發布日期:2022-04-25 點擊率:41
關鍵詞:正運動技術,PLC,機器視覺
摘要:在《會PLC也能玩轉機器視覺(二)》的課程中,我們講述了ZPLC調用BASIC子程序完成機器視覺識別條形碼的功能。
本期課程我們將通過BLOB斑點定位的視覺功能,繼續和大家一起探討使用ZPLC語言實現機器視覺功能的方法。
一檢測原理
(一)BLOB斑點檢測
使用形態學方法(如二值化、膨脹、腐蝕等)將灰度圖像轉換成二值化圖像,轉換同時將檢測特征處理成BLOB斑點并將干擾因素處理成圖像背景,就可以準確地對檢測特征進行提取并進一步處理。
(二)BLOB斑點定位
當需要檢測的樣品具有固定形狀(如為圓環小零件)時,檢測到BLOB斑點區域后,可以根據區域的特性,獲取BLOB斑點區域的面積和中心位置XY,從而達到BLOB斑點定位的目的。同時還可以根據BLOB斑點區域擬合成最小外接矩形,并根據矩形寬高比過濾篩選掉不符合條件的BLOB斑點。
二軟件演示
(一)檢測要求
使用ZDevelop軟件的ZBASIC編程語言編寫程序,用于檢測以下路徑中圖片的樣品重心位置XY。再使用ZPLC編程語言調用BASIC程序的主任務,進行循環檢測識別。
(二)實例演示
1.打開ZDevelop軟件:新建項目→新建HMI文件→新建main.bas文件→新建global_variable.bas文件→新建Plc1.plc文件,用于編寫PLC執行程序→文件添加到項目。
2.設計HMI界面。
3.在global_variable.bas文件中添加全局變量。
'''''全局變量大部分使用數組結構'''''
''注:basic編程中很多函數會以TABLE(系統的數據結構)做為參數
''table 說明 table 說明
''2 亮區域的面積 6 連通區域的數量
''40~42 小圓斑點的面積和位置X,Y數據
'主任務狀態
'0 - 未初始化
'1 - 停止
'2 - 運行中
'3 - 正在停止
GLOBAL DIM main_task_state
main_task_state = 1
' 定義主任務id - 10
GLOBAL DIM main_task_id
main_task_id = 10
'定義全局圖像變量
GLOBAL ZVOBJECT grabImg,disImg ''采集圖像,顯示圖像
'檢測消耗時間
GLOBal DIM d_detect_time
'小圓的位置x/y結果
GLOBal DIM d_circle_rst(24)
'顯示打印的字符
GLOBAL ShowString(64)
'定義本地圖片索引
GLOBAL DIM d_index
'定義讀取圖片的路徑
GLOBAL DIM File_Name(100)
'運行HMI文件
RUN "Hmi.hmi",1
4.關聯HMI界面控件變量。
5.在main.bas文件中添加界面初始化函數,并在hmi系統設置中關聯初始化函數名。
end
'注:
'凡是要使用Region有關的算子在系統初始化時都要調用ZV_RESETCLIPSIZE(width, height)這個算子設置下圖像尺寸,以滿足相機分辨率,因為默認的是640*480尺寸
'HMI界面初始化函數
GLOBAL SUB hmi_init()
main_task_state = 1 '主任務停止運行
ZV_RESETCLIPSIZE(1280, 960)'初始化時依據圖像分辨率設置區域的裁剪尺寸,此處圖像分辨率為1280x960
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 7), HMI_ConTROLSIZEY(10, 7)) '設置鎖存的大小
'初始化測量參數
d_index = 0
TABLE(6)=0 '將小圓數量初始化為0
for i=0 to 23
d_circle_rst(i)=0
next
ZV_SETSYSDBL("CamGetTimeout", 1000) '設置采集超時
ZV_LATCHCLEAR(0) '清空鎖存通道0
END SUB
6.在main.bas文件中添加HMI界面按下測試按鈕響應的函數,并關聯動作函數名。
'HMI界面按下測試按鈕時響應的函數
GLOBAL SUB btn_test()
TICKS=0
'循環讀取本地圖片
if(d_index=3) then
d_index=0
endif
File_Name="圓定位"+TOSTR(d_index,1,0)+".bmp" '.../flash/圓定位/目錄下的圖片所在的路徑名稱
ZV_IMGREAD(grabImg,File_Name,0)
ZV_LATCH(grabImg, 0)
TABLE(6)=0 '檢測前先將數據清0
d_detect_time=0
for i=0 to 23
d_circle_rst(i)=0
next
'定義變量,依次為白色像素連通區域,掩模區域,連通區域結果列表,小圓斑點區域
ZVOBJECT regionWhite, regionMask, re_connecte,circle_connect
ZV_REGENFULLIMG(grabImg,regionMask)
'根據低閾值和高閾值參數生成白色像素圖像regionWhite
ZV_RETHRESH(grabImg, regionMask, regionWhite, 128,255)
'對白色像素區域進行一次1*1的開運算
ZV_REOPENING(regionWhite,regionWhite,1,1)
'對白色像素區域進行一次1*1的閉運算
ZV_RECLOSING(regionWhite,regionWhite,1,1)
'計算BLOB面積
ZV_REAREA(regionWhite, 2) '計算regionWhite亮區域的面積,存放到table(2)中
if(TABLE(2)>0) then '如果獲取到的白色像素數量大于0
ZV_REConNECT(regionWhite,re_connecte) '計算區域的連通區域,存放到re_connecte列表中
zv_refilter(re_connecte,0,11000,12000,0)'對區域列表中的區域進行過濾,保留面積在11000到12000的區域,面積不在此范圍的區域將被過濾掉
zv_refilter(re_connecte,20,0.9,1.1,0)'對區域列表中的連通區域進行過濾,保留最小外接矩形高寬比在0.9 到 1.1 的區域
ZV_RESORT(re_connecte,1,1) '對區域列表中的區域按照重心X的數據進行升序排序
ZV_LISTCOUNT(re_connecte,6) '獲取列表中的連通區域的數量,存放到table(6)中
endif
ZV_GRAYTORGB(grabImg,disImg)'將灰度圖轉換到RGB圖像,用于繪制檢測結果圖像
ZV_REGION(disImg, regionMask, 0, ZV_COLOR(0,0,0))'在disImg中繪制黑色的regionMask區域
ZV_REGION(disImg, regionWhite, 0, ZV_COLOR(255,255,255))'在disImg中繪制白色的regionWhite區域
for i=0 to TABLE(6)-1 '循環獲取小圓斑點的位置XY信息生成圓測量器,檢測圓心位置
ZV_LISTGET(re_connecte,circle_connect,i) '獲取列表中序號為i的元素,即依次獲取列表中小圓斑點的連通區域
ZV_REGION(disImg,circle_connect,0,ZV_COLOR(255,255,0))'繪制斑點區域
ZV_REAREACENTER(circle_connect,40) '計算斑點區域的面積與中心位置,將位置放入TABLE(40)中
ZV_MARKER(disImg,TABLE(41),TABLE(42),0,50,zv_color(0,255,0)) '在圖像img中繪制十字
ShowString=TOSTR(i,1,0) '將BLOB的數量轉換成字符串變量
ZV_TEXT(disImg,ShowString,TABLE(41),TABLE(42),50,ZV_COLOR(0,0,255)) '顯示結果文本
d_circle_rst(i*2+0)=TABLE(41)'將測量圓的結果賦值給圓心變量,顯示到界面中
d_circle_rst(i*2+1)=TABLE(42)
next
ZV_LATCH(disImg, 0) '在鎖存通道0中顯示結果圖像
d_index=d_index+1
d_detect_time=ABS(TICKS)'計算檢測消耗時間
END SUB
7.在main.bas文件中添加HMI界面按下運行按鈕響應的函數,并關聯動作函數名。
'HMI界面按下運行按鈕時響應的函數
GLOBAL SUB btn_run()
if(2 = main_task_state) then '如果主任務處于運行狀態,打印提示信息并退出函數
?"已經開啟連續運行任務,請勿重復操作!"
return
endif
if (1 = main_task_state) then '如果主任務處于停止狀態
if (0 = PROC_STATUS(main_task_id)) then '如果任務未開啟
main_task_state = 2 '主任務狀態設置為2,表示正在執行連續任務
RUNTASK main_task_id, main_task '開啟主任務
endif
endif
END SUB
''主任務實現函數
'main_task:
' while(1)
' if (3 = main_task_state) then '如果主任務狀態處于3即按下停止按鈕時
' main_task_state = 1 '將主任務狀態置為1
' exit while '退出循環
' endif
'
' '重復執行采集和檢測函數
' btn_test()
'
' wend
'END
8.在main.bas文件中添加HMI界面按下停止按鈕響應的函數,并關聯動作函數名。
'HMI界面按下停止按鈕時響應的函數
GLOBAL SUB btn_stop()
if (2 = main_task_state) then '如果主任務狀態處于3即正在連續執行任務時
main_task_state = 3 '將主任務狀態置為3,退出循環
endif
END SUB
9.在main.bas文件中注釋連續運行執行的主任務的函數部分,在Plc1.plc文件中添加ZPLC調用主任務執行函數子程序的代碼。
仿真演示效果1
仿真演示效果2
仿真演示效果3
本次,正運動技術會PLC也能玩轉機器視覺(三) BLOB斑點定位,就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
關于正運動技術
正運動技術專注于運動控制技術研究和通用運動控制軟硬件產品的研發,是國家級高新技術企業,主要產品有運動控制器、運動控制卡、視覺運動控制一體機、人機界面以及擴展模塊等。
正運動技術匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校協同運動控制基礎技術的研究,是國內工控領域發展最快的企業之一,也是國內少有、完整掌握運動控制核心技術和實時工控軟件平臺技術的企業。
下一篇: PLC、DCS、FCS三大控
上一篇: ZBasic結合Qt實現機器