此前,我們依次講解了軟硬件介紹及計數實例、相機的基本使用、基于形狀匹配的視覺定位以及BLOB有無檢測等。
今天,正運動技術為大家分享一下VPLC系列機器視覺運動控制一體機快速入門(五),和大家一起分享機器視覺常用的檢測功能---測量尺寸。
測量尺寸:在機器視覺中常用的測量尺寸的原理就是使用兩個直線測量器,分別檢測出產品兩條尺寸邊緣的點擬合成直線后取兩條直線的距離。
尺寸測量本質是基于邊緣檢測的測量,它需要先檢測出亮暗過渡滿足一定閾值的邊緣點,然后再提取邊緣點數據進行處理計算后輸出最終的結果。
測量尺寸特點
1.準確度高
選擇合適的硬件選型方案可以達到很高的檢測精度。常用遠心鏡頭減少畸變,增大景深,減小測量誤差。
2.圖像干擾少
單純的測量尺寸項目常用背光的打光方式,突出產品邊緣尺寸,過濾表面干擾因素。
3.實現簡單
測量尺寸的算法是基于邊緣檢測的算法,易于實現。
4.需要位置跟隨
測量尺寸的測量器本身不具有定位功能,如果檢測產品位置不固定將無法確定測量器對應的位置,此時需要依賴匹配等定位功能做位置跟隨。
標定
標定是指將機器視覺處理的像素結果(單位:像素)轉換成現實中使用到的實際結果(單位:毫米),或者是將機器視覺中使用的圖像坐標轉換成世界坐標。
我們在實際測量尺寸時,使用的尺寸單位一般是國際標準單位如米,厘米,毫米等。因此機器視覺測量尺寸項目中需要將獲取到的像素尺寸轉換成實際尺寸(毫米)輸出到用戶端,供用戶直接使用。
測量尺寸標定方法
1.測量標定
使用已知尺寸的標準模塊如圓、小方塊、或刻度尺等,在圖像中檢測到像素尺寸后將已知實際尺寸值除以像素值即可得出像素比例值(單位:mm/pixel)。測量尺寸項目中常用測量標定方法。
2.坐標標定
輸入幾組圖像坐標(至少9組),然后再輸入圖像坐標對應的世界坐標,經過公式計算得出矩陣變換系數,即可實現將圖像坐標轉換到實際坐標。在測量精度要求比較高的測量尺寸項目可以考慮使用坐標標定,具體實現內容我們在下一期課程再做詳細說明。
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)
'定義顯示在界面上的長度變量
GLOBAL DIM d_show_rst
''創建模板時保存的模板基準點,score、x、y、angle、scale
GLOBAL DIM d_match_base_rst(5)
global dim d_meas_param(12)
'定義測量標定時使用到的變量
GLOBAL PixLength,WorldLength,CalibParam
2.補充設計主界面。
3.新建主界面按下【測量設置】按鈕時彈出的測量參數設置窗口“Set_Select”,并設計界面布局。
4.在main.bas文件中添加主界面按下【測量設置】按鈕時響應的函數并關聯動作函數名。
'主界面按下測量設置按鈕時響應的函數
GLOBAL SUB Goto_Meas()
HMI_SHOWWINDOW(13)
END SUB
↓
5.在InitLocator.bas文件中初始化測量參數。
'---------------------分割線------------------
'初始化測量參數1
d_meas_param1(0) = 320.0 'roi中心x
d_meas_param1(1) = 240.0 'roi中心y
d_meas_param1(2) = 160 'roi寬
d_meas_param1(3) = 120.0 'roi高
d_meas_param1(4) = 0.0 'roi角度
d_meas_param1(5) = 1 '插值方式
d_meas_param1(6) = 20 '子區域的個數
d_meas_param1(7) = 5 '子區域的尺寸
d_meas_param1(8) = 3 '濾波尺寸
d_meas_param1(9) = 50 '閾值
d_meas_param1(10) = 0 '極性
d_meas_param1(11) = 0 '選擇邊緣位置
'初始化測量參數2
d_meas_param2(0) = 320.0 'roi中心x
d_meas_param2(1) = 240.0 'roi中心y
d_meas_param2(2) = 160 'roi寬
d_meas_param2(3) = 120.0 'roi高
d_meas_param2(4) = 0.0 'roi角度
d_meas_param2(5) = 1 '插值方式
d_meas_param2(6) = 20 '子區域的個數
d_meas_param2(7) = 5 '子區域的尺寸
d_meas_param2(8) = 3 '濾波尺寸
d_meas_param2(9) = 50 '閾值
d_meas_param2(10) = 0 '極性
d_meas_param2(11) = 0 '選擇邊緣位置
'初始化界面上顯示的結果值
d_meas_rst1(0) = 0
d_meas_rst1(1) = 0
d_meas_rst1(2) = 0
d_meas_rst1(3) = 0
d_meas_rst2(0) = 0
d_meas_rst2(1) = 0
d_meas_rst2(2) = 0
d_meas_rst2(3) = 0
d_show_rst = 0
'初始化標定參數和像素比例
CalibParam = 0
WorldLength = 0
PixLength = 0
6.新建在“Set_Select”窗口界面按下【選擇測量器區域1】按鈕時彈出的“Set_Roi1”窗口,用于創建第一條尺寸邊緣的直線測量器并設置檢測直線的參數。
7.在draw.bas文件中添加在“Set_Select”窗口界面按下【選擇測量器區域1】按鈕時響應的函數并關聯動作函數名。
'-----------------分割線-------------------------
'測量器繪制
DIM is_redraw
is_redraw = 0
DIM set_roi_open_init
set_roi_open_init = 0
DIM sr_mpos_x, sr_mpos_y, hit_pos
'''''''''''''''''''''''''''''''''''
'按下選擇測量器區域1按鈕時響應的函數
GLOBAL SUB btn_sel_roi1()
ZV_LATCHCLEAR(1) '清除鎖存
ZV_LATCHSETSIZE(1, HMI_CONTROLSIZEX(14, 1), HMI_CONTROLSIZEY(14,1)) '設置鎖存的大小
ZV_LATCH(grabImg, 1) '顯示圖像在鎖存上
SET_COLOR(RGB(0,255,0))
'圖像roi轉控件roi
is_redraw = 0
TABLE(11, d_meas_param1(0), d_meas_param1(1))
ZV_POSFROMIMG(1, 1, 11, 11) '圖像坐標轉換到HMI控件坐標
TABLE(13) = ZV_LENFROMIMG(1, d_meas_param1(2))
TABLE(14) = ZV_LENFROMIMG(1, d_meas_param1(3))
TABLE(15) = d_meas_param1(4)
HMI_SHOWWINDOW(14)
END SUB
↓
8.在draw.bas文件中添加Roi1根據鼠標操作更新ROI位置的函數以及實時繪制Roi1的函數。
'根據鼠標操作更新Roi1的位置
GLOBAL SUB update_roi1()
if mouse_scan(21) = 1 then '
掃描按下操作
hit_pos = ZV_HMIADJRECT2(table(21), table(22), 11, -1) '只有按下時可以改變擊中位置
?TABLE(21),TABLE(22)
is_redraw = 1
endif
if mouse_scan(21) = -1 then '
掃描松開操作
if TABLE(21)<(table(11)-table(13) or="">(TABLE(11)+TABLE(13)/2) or TABLE(22)<(table(12)-table(14) or="">(TABLE(12)+TABLE(14)/2) then
hit_pos=-1
endif
ZV_HMIADJRECT2(table(21), table(22), 11, hit_pos)
?*TABLE(11,4)
is_redraw = 1
endif
if (MOUSE_state(21)) then
ZV_HMIADJRECT2(table(21), table(22), 11, hit_pos)
is_redraw = 1
endif
if (1 = is_redraw) then
is_redraw = 0
ZV_POSTOIMG(1, 1, 11, 31)
d_meas_param1(0) = TABLE(31)
d_meas_param1(1) = TABLE(32)
d_meas_param1(2) = ZV_LENTOIMG(1, TABLE(13))
d_meas_param1(3) = ZV_LENTOIMG(1, TABLE(14))
d_meas_param1(4) = TABLE(15)
'如果選擇了補正源,就保存roi基準
if(TABLE(110) = 1) then
set_base_roi()
endif
SET_REDRAW
endif
END SUB
'設置測量區域的基準roi
GLoBAL SUB set_base_roi()
d_meas_base_v1(0) = d_meas_param1(0)
d_meas_base_v1(1) = d_meas_param1(1)
d_meas_base_v1(2) = d_meas_param1(4)
d_meas_base_v2(0) = d_meas_param2(0)
d_meas_base_v2(1) = d_meas_param2(1)
d_meas_base_v2(2) = d_meas_param2(4)
END SUB
'更新Roi1位置后實時繪制圖形
GLOBAL SUB draw_roi1()
SET_COLOR(C_BLUE)
TABLE(16, d_meas_param1(6), d_meas_param1(7)) '設置子區域個數和寬度兩個參數
ZV_HMIRECT2(11, 300)
DRAWLINE(TABLE(300), TABLE(301), TABLE(302), TABLE(303)) '外矩形
DRAWLINE(TABLE(302), TABLE(303), TABLE(304), TABLE(305))
DRAWLINE(TABLE(304), TABLE(305), TABLE(306), TABLE(307))
DRAWLINE(TABLE(306), TABLE(307), TABLE(300), TABLE(301))
DRAWLINE(TABLE(308), TABLE(309), TABLE(310), TABLE(311)) '方向箭頭
DRAWLINE(TABLE(312), TABLE(313), TABLE(310), TABLE(311))
DRAWLINE(TABLE(314), TABLE(315), TABLE(310), TABLE(311))
if (0 = TABLE(316)) then return
SET_COLOR(C_GREEN)
DIM idx
for idx = 0 to TABLE(316)-1
DRAWLINE(TABLE(317+idx*4), TABLE(318+idx*4), TABLE(319+idx*4), TABLE(320+idx*4))
next
END SUB
9.在draw.bas文件中添加在“Set_Roi1”窗口界面按下【確定】按鈕時響應的函數并關聯動作函數名。
'設置Roi1窗口按下確定按鈕時響應的函數
GLOBAL SUB btn_meas_confirm1()
HMI_CLOSEWINDOW(14)
END SUB
↓
10.新建在“Set_Select”窗口界面按下【選擇測量器區域2】按鈕時彈出的“Set_Roi2”窗口,用于創建第二條尺寸邊緣的直線測量器并設置檢測直線的參數。
11.在draw.bas文件中添加在“Set_Select”窗口界面按下【選擇測量器區域2】按鈕時響應的函數并關聯動作函數名。
'按下選擇測量器區域2按鈕時響應的函數
GLOBAL SUB btn_sel_roi2()
ZV_LATCHCLEAR(1) '清除鎖存
ZV_LATCHSETSIZE(1, HMI_CONTROLSIZEX(15, 1), HMI_CONTROLSIZEY(15,1)) '設置鎖存的大小
ZV_LATCH(grabImg, 1) '顯示圖像在鎖存上
SET_COLOR(RGB(0,255,0))
'圖像roi坐標轉控件roi
is_redraw = 0
TABLE(11, d_meas_param2(0), d_meas_param2(1))
ZV_POSFROMIMG(1, 1, 11, 11) '圖像坐標轉換到HMI控件坐標
TABLE(13) = ZV_LENFROMIMG(1, d_meas_param2(2))
TABLE(14) = ZV_LENFROMIMG(1, d_meas_param2(3))
TABLE(15) = d_meas_param2(4)
HMI_SHOWWINDOW(15)
END SUB
↓
12.在draw.bas文件中添加Roi2根據鼠標操作更新ROI位置的函數以及實時繪制Roi1的函數。
'根據鼠標操作更新Roi2的位置
GLOBAL SUB update_roi2()
if mouse_scan(21) = 1 then '掃描按下操作
hit_pos = ZV_HMIADJRECT2(table(21), table(22), 11, -1) '只有按下時可以改變擊中位置
is_redraw = 1
endif
if mouse_scan(21) = -1 then '掃描松開操作
ZV_HMIADJRECT2(table(21), table(22), 11, hit_pos)
is_redraw = 1
endif
if (MOUSE_state(21)) then
ZV_HMIADJRECT2(table(21), table(22), 11, hit_pos)
is_redraw = 1
endif
if (1 = is_redraw) then
is_redraw = 0
ZV_POSTOIMG(1, 1, 11, 31)
d_meas_param2(0) = TABLE(31)
d_meas_param2(1) = TABLE(32)
d_meas_param2(2) = ZV_LENTOIMG(1, TABLE(13))
d_meas_param2(3) = ZV_LENTOIMG(1, TABLE(14))
d_meas_param2(4) = TABLE(15)
'如果選擇補正源,就保存roi基準位置
if(TABLE(110) = 1) then
set_base_roi()
endif
SET_REDRAW
endif
END SUB
'更新Roi2位置后實時繪制圖形
GLOBAL SUB draw_roi2()
SET_COLOR(C_BLUE)
TABLE(16, d_meas_param2(6), d_meas_param2(7)) '設置子區域個數和寬度兩個參數
ZV_HMIRECT2(11, 300) '計算控件的矩形roi相應的頂點和箭頭錨點
DRAWLINE(TABLE(300), TABLE(301), TABLE(302), TABLE(303)) '外矩形
DRAWLINE(TABLE(302), TABLE(303), TABLE(304), TABLE(305))
DRAWLINE(TABLE(304), TABLE(305), TABLE(306), TABLE(307))
DRAWLINE(TABLE(306), TABLE(307), TABLE(300), TABLE(301))
DRAWLINE(TABLE(308), TABLE(309), TABLE(310), TABLE(311)) '方向箭頭
DRAWLINE(TABLE(312), TABLE(313), TABLE(310), TABLE(311))
DRAWLINE(TABLE(314), TABLE(315), TABLE(310), TABLE(311))
if (0 = TABLE(316)) then return
SET_COLOR(C_GREEN)
DIM idx
for idx = 0 to TABLE(316)-1
DRAWLINE(TABLE(317+idx*4), TABLE(318+idx*4), TABLE(319+idx*4), TABLE(320+idx*4))
next
END SUB
13.在draw.bas文件中添加在“Set_Roi2”窗口界面按下【確定】按鈕時響應的函數并關聯動作函數名。
'設置Roi2窗口按下確定按鈕時響應的函數
GLOBAL SUB btn_meas_confirm2()
HMI_CLOSEWINDOW(15)
END SUB
↓
14.新建meas.bas文件用于存放計算兩條直線的距離函數和標定函數等測量相關函數,并在文件中添加實現函數。
'計算兩條直線的距離寬度
global sub length1()
LOCAL dist,dist1,dist2
local dis_tmp,dst_tmp1
'計算直線2的起始點到直線1之間的距離
dist = ZV_DISTPL(d_meas_rst2(0),d_meas_rst2(1),d_meas_rst1(0),d_meas_rst1(1),d_meas_rst1(2),d_meas_rst1(3))
'計算直線2的終點到直線1之間的距離
dist1 = ZV_DISTPL(d_meas_rst2(2),d_meas_rst2(3),d_meas_rst1(0),d_meas_rst1(1),d_meas_rst1(2),d_meas_rst1(3))
'計算直線2的中點位置坐標
dis_tmp=(d_meas_rst2(0)+d_meas_rst2(2))/2
dst_tmp1=(d_meas_rst2(1)+d_meas_rst2(3))/2
'計算直線2的中點到直線1之間的距離
dist2 = ZV_DISTPL(dis_tmp,dst_tmp1,d_meas_rst1(0),d_meas_rst1(1),d_meas_rst1(2),d_meas_rst1(3))
TABLE(500)=(dist+dist1+dist2)/3 '兩直線之間的距離
PixLength=TABLE(500)
?TABLE(500)
end sub
'計算實際尺寸值
global sub length2()
'實際尺寸=像素尺寸*像素比例
TABLE(501)=TABLE(500)*CalibParam
end sub
'計算像素比例,即實際值/像素值
global sub calculation()
CalibParam=WorldLength/TABLE(500)
end sub
15.在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_rigid, 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_rigid, 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_rigid, 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
'生成直線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
'生成直線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)
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)
ZV_MATINFO(rst2, 0) 'table(0)作為臨時變量
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()
d_show_rst=TABLE(500)
if(CalibParam>0) then
'計算實際長度
length2()
d_show_rst=TABLE(501)
endif
'繪制結果線
ZV_GRAYTORGB(grabImg, colorImg)
ZV_LINE(colorImg, TABLE(61), TABLE(62), TABLE(63), TABLE(64), C_GREEN)
ZV_LINE(colorImg, TABLE(65), TABLE(66), TABLE(67), TABLE(68), C_GREEN)
ZV_LINE(colorImg, TABLE(71), TABLE(72), TABLE(73), TABLE(74), C_GREEN)
ZV_LINE(colorImg, TABLE(75), TABLE(76), TABLE(77), TABLE(78), C_GREEN)
ZV_LATCH(colorImg,0)
END SUB
↓
在main.bas文件中添加“Set_Select”窗口界面按下【測試】按鈕時仿真的效果圖。
測試按鈕效果圖
16.設置“Set_Select”窗口界面【計算】按鈕關聯動作函數名。
在“Set_Select”窗口界面按下【計算】按鈕時仿真的效果圖。
計算按鈕效果圖
17.在“Set_Select”窗口界面中關聯界面控件變量。
18.在main.bas文件中添加“Set_Select”窗口界面按下【返回主界面】按鈕時響應的函數并關聯動作函數名。
'按下返回主界面按鈕時響應的函數
GLOBAL SUB Goto_Main()
HMI_CLOSEWINDOW(13)
END SUB
↓
19.在main.bas文件中修改主界面按下【單次執行】按鈕時響應的函數并關聯動作函數名。
'主界面按下單次執行按鈕時響應的函數
GLOBAL SUB btn_test()
'采集一幀圖像
btn_grab
'執行測量測試部分代碼
btn_mea_test()
END SUB
↓
在主界面按下【單次執行】按鈕時仿真的效果圖。
20.在main.bas文件中修改主界面按下【連續執行】按鈕時響應的函數中執行的任務函數內容。
main_task:
while(1)
if (0 = run_switch) then
exit while
endif
'以下執行相關定位操作
btn_grab()
btn_mea_test()
wend
END
在主界面按下【連續執行】按鈕時仿真仿真執行的效果圖。
連續運行效果圖1
連續運行效果圖2
在不同位置以不同角度放置時,均能檢測到對應尺寸。
本次,正運動技術VPLC系列機器視覺運動控制一體機快速入門(五)——尺寸測量就分享到這里,更多精彩內容請關注“ 正運動小助手”公眾號。
本文由 正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
-
機器視覺
+關注
關注
161文章
4348瀏覽量
120134 -
尺寸測量
+關注
關注
0文章
66瀏覽量
8242 -
工業機器視覺
+關注
關注
0文章
27瀏覽量
7593 -
正運動技術
+關注
關注
0文章
97瀏覽量
335
發布評論請先 登錄
相關推薦
評論