發布日期:2022-04-25 點擊率:59
關鍵詞:正運動技術,機器視覺,運動控制一體機
摘要:順應現代生活的不斷發展,瓶裝液體成為人們日常生活中不可或缺的消費品。它的包裝中產品凈含量是否達標是檢測產品質量的一個重要指標,對于同一規格的包裝瓶中,其液位高度直接反映了瓶中液體的凈含量。
順應現代生活的不斷發展,瓶裝液體成為人們日常生活中不可或缺的消費品。它的包裝中產品凈含量是否達標是檢測產品質量的一個重要指標,對于同一規格的包裝瓶中,其液位高度直接反映了瓶中液體的凈含量。
在傳統的瓶裝液體灌裝工序中,其灌裝后的液位高度檢測通常采用的是人眼去目測液位高度,生產效率低下,且會產生較大誤差。隨著生產的規模的不斷擴大,因此對瓶裝液體的液位高度全自動檢測的需求越來越大。
目前市面上已有光電傳感器檢測、超聲波檢測和機器視覺液位檢測等液位檢測方法,其中機器視覺液位檢測是一種非接觸式、無損的檢測方法。因此它具有效率高、檢測精度高、設備維護簡單等優點,被廣泛應用于液位檢測項目中。
本次課程我們將與大家一起分享機器視覺運動控制一體機實現液位檢測的功能。
檢測原理
液位檢測:在機器視覺解決方案中,通常使用背向打光的方式將瓶內有液體的部分和沒有液體的部分加以區分,再計算出液體最高位與瓶底的距離即液位。檢測有顏色的液體通常使用普通背光源即可,如需檢測透明液體或瓶子上有字符或顏色干擾可使用穿透性較強的紅外背光。
視覺算法:使用兩個直線測量器獲得瓶底和液位的數據,再計算瓶底和液位的距離。使用形狀匹配結果作為直線測量器的補正源,使直線測量器跟隨產品移動。
二
軟件實現
(一)軟件實現
1.打開ZDevelop軟件:打開項目“基于形狀匹配的視覺定位”→在“global_variable.bas”文件中定義測量尺寸需要用到的全局變量。
'----------------------------分割線-----------------------------------------
'直線1測量參數數組,依次為中心cx、cy、w、h、angle、interp、sub_num、sub_width、filter_size、thresh、polor、select,都是圖像坐標
GLOBAL DIM d_meas_param1(12) 'd開頭表示數據結構
'直線2測量參數數組,依次為中心cx、cy、w、h、angle、interp、sub_num、sub_width、filter_size、thresh、polor、select,都是圖像坐標
GLOBAL DIM d_meas_param2(12) 'd開頭表示數據結構
'定義常用顏色變量,用于繪制圖形
GLOBAL C_RED, C_GREEN, C_BLUE, C_YELLOW
C_RED = RGB(255, 0, 0)
C_GREEN = RGB( 0,255, 0)
C_BLUE = RGB( 0, 0,255)
C_YELLOW= RGB(255,255, 0)
'創建模板時保存的直線1基準區域位置向量1,x、y、angle
GLOBAL DIM d_meas_base_v1(3)
d_meas_base_v1(0) = 0
d_meas_base_v1(1) = 0
d_meas_base_v1(2) = 0
'創建模板時保存的直線2基準區域位置向量2,x、y、angle
GLOBAL DIM d_meas_base_v2(3)
d_meas_base_v2(0) = 0
d_meas_base_v2(1) = 0
d_meas_base_v2(2) = 0
'直線1測量結果,依次為結果點stx、sty、endx、endy
GLOBAL DIM d_meas_rst1(4)
'直線2測量結果,依次為結果點stx、sty、endx、endy
GLOBAL DIM d_meas_rst2(4)
''創建模板時保存的模板基準點,score、x、y、angle、scale
GLOBAL DIM d_match_base_rst(5)
global dim d_meas_param(12)
'定義ROI標志變量,0-液位ROI,1-瓶底ROI
GLOBAL DIM roi_flag
roi_flag=0
'定義形狀匹配模板
ZVOBJECT shape_model
'定義保存配模板標志,1-已保存,0未保存
GLOBAL DIM is_saveMod
2.修改設計HMI界面。
3.新建主界面按下【液位設置】按鈕時彈出的液位參數設置窗口“Set_Select”,并設計界面布局。
4.關聯液位參數設置窗口“Set_Select”界面上的變量。
5.在“draw.bas”文件中添加“液位Roi”和“瓶底Roi”根據鼠標操作更新ROI位置的函數以及實時繪制Roi的函數,并在自定義元件中關聯刷新函數和繪制函數。
'-----------------分割線-------------------------
'測量器繪制
'''''''''''''''''''''''''''''''''''
'根據鼠標操作更新Roi的位置
GLOBAL SUB update_roi()
if roi_flag=0 then '如果選擇設置液位ROI
SET_REDRAW'全區域繪制
if (mouse_scan(21) = 1 )then '如果掃描到鼠標按下操作
'根據鼠標所在Roi的不同位置返回調整標志
hit_pos = ZV_HMIADJRECT2(table(21), table(22), 11, -1)
is_redraw = 1'繪圖標志置1
endif
if mouse_scan(21) = -1 then '如果掃描到鼠標松開操作
'如果鼠標指在Roi1區域之外
if TABLE(21)
hit_pos=-1'調整標志=-1
endif
ZV_HMIADJRECT2(table(21), table(22), 11, hit_pos)'調整Roi1位置
is_redraw = 1
endif
if (MOUSE_state(21)) then'如果鼠標按下時
ZV_HMIADJRECT2(table(21), table(22), 11, hit_pos)'調整Roi1位置
is_redraw = 1'繪圖標志置1
endif
if (1 = is_redraw ) then'如果繪圖標志為1時
is_redraw = 0'繪圖標志置0
'將控件坐標轉換到圖像坐標,并賦值給相應變量
ZV_POSTOIMG(0, 1, 11, 31)
d_meas_param1(0) = TABLE(31)
d_meas_param1(1) = TABLE(32)
d_meas_param1(2) = ZV_LENTOIMG(0, TABLE(13))
d_meas_param1(3) = ZV_LENTOIMG(0, TABLE(14))
d_meas_param1(4) = TABLE(15)
set_base_roi()'設置基準Roi數據
SET_REDRAW'全區域繪制
endif
else '否則選擇設置瓶底ROI
SET_REDRAW'全區域繪制
if (mouse_scan(21) = 1 )then '如果掃描到鼠標按下操作
'根據鼠標所在Roi的不同位置返回調整標志
hit_pos = ZV_HMIADJRECT2(table(21), table(22), 41, -1)
is_redraw = 1'繪圖標志置1
endif
if mouse_scan(21) = -1 then '如果掃描到鼠標松開操作
'如果鼠標指在Roi2區域之外
if TABLE(21)
hit_pos=-1'調整標志=-1
endif
ZV_HMIADJRECT2(table(21), table(22), 41, hit_pos)'調整Roi2位置
is_redraw = 1
endif
if (MOUSE_state(21)) then'如果鼠標按下時
ZV_HMIADJRECT2(table(21), table(22), 41, hit_pos)'調整Roi2位置
is_redraw = 1'繪圖標志置1
endif
if (1 = is_redraw ) then'如果繪圖標志為1時
is_redraw = 0'繪圖標志置0
'將控件坐標轉換到圖像坐標,并賦值給相應變量
ZV_POSTOIMG(0, 1, 41, 91)
d_meas_param2(0) = TABLE(91)
d_meas_param2(1) = TABLE(92)
d_meas_param2(2) = ZV_LENTOIMG(0, TABLE(43))
d_meas_param2(3) = ZV_LENTOIMG(0, TABLE(44))
d_meas_param2(4) = TABLE(45)
set_base_roi()'設置基準Roi數據
SET_REDRAW'全區域繪制
endif
endif
END SUB
6.在“main.bas”文件中添加“Set_Select”窗口界面按下【測試】按鈕時響應的函數并關聯動作函數名。
'液位設置界面按下測試按鈕時響應的函數
GLOBAL SUB btn_mea_test()
'選擇補正源時先執行定位檢測
if(TABLE(110) = 1) then
btn_loc_test()
endif
ZVOBJECT mr1,mr2,mr3,mr4,rst1,rst2,rst3,rst4,colorImg
ZVOBJECT contlist, tsContlist, mat_rigid
LOCAL show_rst
'測量區域roi補正
if(TABLE(110) = 1 AND d_is_creModel = 1) then '如果使用補正源已經開啟且模板已經創建
'計算剛性變換矩陣
ZV_GETRIGIDVECTOR(mat_rigid1,d_match_base_rst(1),d_match_base_rst(2),d_match_base_rst(3), d_match_rst(1), d_match_rst(2), d_match_rst(3))
'使用變換矩陣mat_rigid對輸入Roi1基準向量進行補正,補正后的向量存入開始索引為0的TABLE中
ZV_VECTORCORRECT(mat_rigid1, d_meas_base_v1(0), d_meas_base_v1(1),d_meas_base_v1(2), 0)
'將補正后的坐標數據賦值給測量器區域變量
d_meas_param1(0) = TABLE(0)
d_meas_param1(1) = TABLE(1)
d_meas_param1(4) = TABLE(2)
'使用變換矩陣mat_rigid對輸入Roi2基準向量進行補正,補正后的向量存入開始索引為0的TABLE中
ZV_VECTORCORRECT(mat_rigid1, d_meas_base_v2(0), d_meas_base_v2(1),d_meas_base_v2(2), 0)
'將補正后的坐標數據賦值給測量器區域變量
d_meas_param2(0) = TABLE(0)
d_meas_param2(1) = TABLE(1)
d_meas_param2(4) = TABLE(2)
endif
'生成直線1測量的旋轉區域
ZV_MRGENLINE(mr1, d_meas_param1(0), d_meas_param1(1), d_meas_param1(2), d_meas_param1(3), d_meas_param1(4), 1, d_meas_param1(6), d_meas_param1(7))
'設置直線1的檢測參數,包括濾波器尺寸,閾值,邊緣極性,邊緣位置
ZV_MRSETADV(mr1, d_meas_param1(8), d_meas_param1(9), d_meas_param1(10), d_meas_param1(11))
'生成直線2測量的旋轉區域
ZV_MRGENLINE(mr2, d_meas_param2(0), d_meas_param2(1), d_meas_param2(2), d_meas_param2(3), d_meas_param2(4), 1, d_meas_param2(6), d_meas_param2(7))
'設置直線2的檢測參數,包括濾波器尺寸,閾值,邊緣極性,邊緣位置
ZV_MRSETADV(mr2, d_meas_param2(8), d_meas_param2(9), d_meas_param2(10), d_meas_param2(11))
'將矩形測量區域測量到的目標直線1端點存儲到起始索引為61的TABLE
ZV_MRLINE(mr1, grabImg, rst1, 61)
'將直線1結果賦值給直線1結果變量
d_meas_rst1(0) = TABLE(61)
d_meas_rst1(1) = TABLE(62)
d_meas_rst1(2) = TABLE(63)
d_meas_rst1(3) = TABLE(64)
'將矩形測量區域測量到的目標直線2端點存儲到起始索引為71的TABLE
ZV_MRLINE(mr2, grabImg, rst2, 71)
'將直線1結果賦值給直線2結果變量
d_meas_rst2(0) = TABLE(71)
d_meas_rst2(1) = TABLE(72)
d_meas_rst2(2) = TABLE(73)
d_meas_rst2(3) = TABLE(74)
'計算兩條直線的距離寬度
length1()
'將灰度圖轉換成RGB圖像,用于繪制檢測結果圖像
ZV_GRAYTORGB(grabImg, colorImg)
'繪制液位檢測和瓶底檢測的測量器
ZV_MEASURER(colorImg,mr1,ZV_COLOR(0,0,255),ZV_COLOR (0,255,0))
ZV_MEASURER(colorImg,mr2,ZV_COLOR(0,0,255),ZV_COLOR (0,255,0))
'繪制直線結果
ZV_LINE(colorImg, TABLE(61), TABLE(62), TABLE(63), TABLE(64), C_BLUE)
ZV_LINE(colorImg, TABLE(71), TABLE(72), TABLE(73), TABLE(74), C_BLUE)
if(TABLE(110) = 1) then'如果使用補正源
ZV_MARKER(colorImg,TABLE(4),TABLE(5),0,10,C_GREEN)'繪制匹配中心標志點
endif
ZV_LATCH(colorImg,0)'顯示結果圖像
END SUB
7.在“main.bas”文件中添加“Set_Select”窗口界面按下【返回主界面】按鈕時響應的函數并關聯動作函數名。
'按下返回主界面按鈕時響應的函數
GLOBAL SUB Goto_Main()
'設置鎖存通道0的大小,以適應圖片元件大小
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10,2), HMI_ConTROLSIZEY(10,2))
ZV_LATCHCLEAR(0)'清空鎖存通道0
ZV_LATCH(grabImg,0)'將圖片顯示到鎖存通道0中
HMI_CLOSEWINDOW(13)'關閉測量參數設置窗口
END SUB
8.在“main.bas”文件中修改主界面按下【單次執行】按鈕時響應的函數并關聯動作函數名。
'主界面按下單次執行按鈕時響應的函數
GLOBAL SUB btn_test()
'采集一幀圖像
btn_grab
'執行測量測試部分代碼
btn_mea_test()
END SUB
三
檢測原理
(一)操作步驟
查看運行效果:將項目下載到仿真器中→運行程序,測試程序運行效果。→使用本地圖片→單次采集→學習模板→液位設置→使用補正源→單次執行→結束
完整代碼獲取地址
▼
本次,正運動技術機器視覺運動控制一體機應用例程(六)液位檢測,就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
關于正運動技術
正運動技術專注于運動控制技術研究和通用運動控制軟硬件產品的研發,是國家級高新技術企業,主要產品有運動控制器、運動控制卡、視覺運動控制一體機、人機界面以及擴展模塊等。
正運動技術匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校協同運動控制基礎技術的研究,是國內工控領域發展最快的企業之一,也是國內少有、完整掌握運動控制核心技術和實時工控軟件平臺技術的企業。
下一篇: PLC、DCS、FCS三大控
上一篇: ZMC運動控制器SCARA機