時間:2021-01-19 10:15:56來源:正運動技術(shù)
視頻教程:《視頻教程:VPLC系列機器視覺運動控制一體機快速入門(三)》
今天,正運動技術(shù)為大家分享一下VPLC系列機器視覺運動控制一體機快速入門(三)——基于形狀匹配的視覺定位。
上期課程,我們講述了機器視覺方案實施的基礎(chǔ)即相機的基本使用內(nèi)容,我們通過上期課程已經(jīng)能實現(xiàn)使用ZDevelop軟件獲取圖像進行處理。
本期課程我們和大家一起分享機器視覺方案中常用的基于形狀匹配的視覺定位功能。
視覺定位是指在視覺檢測中通過學習特定的模板或某些固定的特征,在檢測區(qū)域內(nèi)搜索滿足條件的特征,并返回特征在圖像坐標中的位置信息,如坐標位置X、坐標位置Y、角度。
形狀匹配是基于邊緣方向梯度的匹配,它是提取ROI中的邊緣特征結(jié)合灰度信息創(chuàng)建模板,然后在檢測區(qū)域ROI范圍內(nèi)搜索與模板的輪廓特征滿足一定相似程度的產(chǎn)品特征,并返回對應位置信息。
形狀匹配特點
1.適應性強:可適應光照和圖像的灰度變化。
2.兼容性強:可以支持搜索缺失局部邊緣、有噪聲干擾、有輕微變形和失焦的目標。
3.多目標搜索:支持同時搜索同一模板下的多個匹配目標。
4.支持旋轉(zhuǎn)和縮放:在目標圖像存在旋轉(zhuǎn)或縮放的情況下仍然能匹配到目標,但是需要在設(shè)定的旋轉(zhuǎn)和縮放比例范圍內(nèi)。
模板選擇
使用形狀匹配功能的前提是檢測目標要有唯一且固定的特征。
1.在選擇模板時,需要確保特征是檢測目標唯一存在的特征,否則無法與其他檢測目標區(qū)分。
2.盡量選擇圖像清晰形狀完整的標準產(chǎn)品作為模板,避免摻入噪點等干擾因素。
3.盡量避免選擇對稱的特征作為模板。
如圖,閃電是目標1唯一的特征,可以將目標1和目標2進行區(qū)分。
1 目標定位
在目標輪廓特征清晰且定位精度要求不高時,可直接使用形狀匹配輸出的位置結(jié)果做定位項目。
2 產(chǎn)品計數(shù)
對具有相同形狀特征的產(chǎn)品進行計數(shù)統(tǒng)計。
3 位置跟隨
當需要檢測的目標位置不固定時,一些檢測功能的ROI位置無法確定如檢測直線、檢測圓形等,我們可以利用檢測目標周邊有固定距離的特征進行位置跟隨。
形狀匹配流程圖
實例演示
1
新建項目→新建HMI文件→新建main.bas文件,用于編寫界面響應函數(shù)→新建global_variable.bas文件用于存放全局變量并開啟HMI自動運行任務→新建InitLocator.bas文件用于初始化測量參數(shù)→新建camera.bas文件用于實現(xiàn)相機采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項目。
2
設(shè)計主界面。
3
在global_variable.bas文件中定義全局變量。
'''''全局變量大部分使用數(shù)組結(jié)構(gòu)'''''
''注:basic編程中很多函數(shù)會以TABLE(系統(tǒng)的數(shù)據(jù)結(jié)構(gòu))做為參數(shù)
''在這里table均是做為中間變量
''table 0-20 作為匹配時使用到的中間變量
''table 50-70 作為roi繪制時的中間變量使用
''table 21-22,表示鼠標按鍵控件坐標系
''table 31-35,表示控件坐標轉(zhuǎn)換后對應的圖像坐標
''table 111-114,表示定位器區(qū)域roi參數(shù),屬于控件坐標系
''table 121-124,表示橡皮擦區(qū)域roi參數(shù),屬于控件坐標系
'***********定義程序任務相關(guān)變量**********************
'主任務狀態(tài)
'0 - 未初始化
'1 - 停止
'2 - 運行中
'3 - 正在停止
GLOBAL DIM main_task_state
main_task_state = 1
'運行任務開關(guān)
GLOBAL DIM run_switch
run_switch = 0
'采集任務開關(guān)
'0 - 停止采集
'1 - 請求采集
GLOBAL DIM grab_switch
grab_switch = 0
'定位檢測主任務id - 10
GLOBAL DIM main_task_id
main_task_id = 10
'相機連續(xù)采集線程id - 7
GLOBAL DIM grab_task_id
grab_task_id = 7
'***********結(jié)束定義程序任務相關(guān)變量******************
'***********定義相機采集相關(guān)變量**********************
'相機種類,"",此處使用??迪鄼C-"mvision"
GLOBAL DIM CAMERA_TYPE(100)
'CAMERA_TYPE = "mindvision;basler;mvision;huaray;basler;zmotion"
CAMERA_TYPE = "mvision"
'相機個數(shù)
GLOBAL cam_num
cam_num = 0
'相機模式,-1 連續(xù)采集,0-觸發(fā)采集
GLOBAL cam_mode
cam_mode = 0
'***********結(jié)束定義相機采集相關(guān)變量******************
'定義返回主界面標志,1-已返回,0-未返回
GLOBAL DIM d_is_rtn_loc
d_is_rtn_loc = 1
'***********定義模板相關(guān)變量*************************
'定義創(chuàng)建模板標志位,1-已創(chuàng)建模板,0-未創(chuàng)建模板
GLOBAL DIM d_is_creModel
d_is_creModel = 0
'學習模板參數(shù),starAngle、endAngle、minScale、maxScale、thresh、numlevel、reduce、angleStep、scaleStep
GLOBAL DIM d_mod_param(9)
'***********結(jié)束定義模板相關(guān)變量**********************
'***********定義編輯模板相關(guān)變量*********************
'定義編輯模板標志,0-表示不編輯模板,1-表示編輯模板
GLOBAL DIM d_edit_m
d_edit_m = 0
'定義使用橡皮擦功能標志,0-表示恢復擦除的區(qū)域,1-表示擦除區(qū)域
GLOBAL DIM d_isMask_m
d_isMask_m = 1
'定義橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標x、y、x、y
GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
'定義正方形橡皮擦尺寸寬度
GLOBAL DIM d_eraser_size
d_eraser_size = 5
'定義界面控件上橡皮擦的矩形區(qū)域
GLOBAL DIM c_rect(4)
'定義鼠標狀態(tài)標志,0-表示鼠標處于松開狀態(tài),1-表示鼠標處于按下狀態(tài)
GLOBAL DIM d_mouse_s
d_mouse_s = 0
'***********結(jié)束定義編輯模板相關(guān)變量******************
'***********定義匹配檢測相關(guān)變量*********************
'匹配檢測參數(shù),minScore、matchNum、minDist、thresh、accuracy、speed、polor
GLOBAL DIM d_match_param(7)
'定義學習模板的roi參數(shù)和橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標x、y、x、y
GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
'匹配結(jié)果,score、x、y、angle、scale, 目前對于多目標匹配也只存第一個目標
GLOBAL DIM d_match_rst(5)
GLOBAL DIM d_match_time '定義匹配定位消耗的時間變量
d_match_time = 0
'***********結(jié)束定義匹配檢測相關(guān)變量******************
'定義程序執(zhí)行過程中緩存中間圖片和結(jié)果圖片的變量
GLOBAL ZVOBJECT grabImg
GLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_mod
GLOBAL ZVOBJECT modRe
RUN"Hmi1.hmi",1
4
在InitLocator.bas文件中初始化測量參數(shù)。
end
GLOBAL SUB init_meas_param() '初始化測量參數(shù)
'初始化定位器roi參數(shù)
d_locator_roi(0) = 240 '左上角x
d_locator_roi(1) = 180 '左上角y
d_locator_roi(2) = 400 '右下角x
d_locator_roi(3) = 300 '右下角y
'初始化模板參數(shù)
d_mod_param(0) = -180 '起始角度
d_mod_param(1) = 180 '終止角度
d_mod_param(2) = 1 '最小縮放
d_mod_param(3) = 1 '最大縮放
d_mod_param(4) = 80 '閾值
d_mod_param(5) = 0 '默認金字塔層數(shù)
d_mod_param(6) = 0 '默認約簡特征點
d_mod_param(7) = 0 '默認角度步長
d_mod_param(8) = 0 '默認縮放步長
'初始化匹配測量參數(shù)
d_match_param(0) = 50 '最小分數(shù)
d_match_param(1) = 1 '匹配個數(shù)
d_match_param(2) = 0 '默認最小間距
d_match_param(3) = 40 '最小閾值
d_match_param(4) = 0 '精度
d_match_param(5) = 9 '速度
d_match_param(6) = 0 '極性
'初始化匹配定位結(jié)果
d_match_rst(0) = 0 '分數(shù)
d_match_rst(1) = 0 '位置X
d_match_rst(2) = 0 '位置Y
d_match_rst(3) = 0 '角度
d_match_rst(4) = 0 '比例
'初始化匹配定位消耗時間
d_match_time = 0
END SUB
5
關(guān)聯(lián)主界面值顯示控件變量。
6
在main.bas文件中添加主界面初始化函數(shù)。
'HMI界面初始化函數(shù),上電執(zhí)行一次
GLOBAL SUB hmi_init()
grab_switch = 0 '初始化采集任務開關(guān),不開啟采集任務
main_task_state = 1 '初始化定位檢測主任務狀態(tài)為停止狀態(tài)1
ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) '設(shè)置鎖存的大小
init_meas_param() '初始化測量參數(shù)
ZV_IMGGENCONST(subImg,40,30,1,0,0) '初始化模板子圖像
'初始化一些全局參數(shù)
ZVOBJECT contlist1, tsContlist1, mat_rigid1
ZVOBJECT contlist2, tsContlist2, mat_rigid2
ZV_READIMAGE(grabImg,"1.bmp",1) '讀取.../flash目錄下的show.bmp的灰度圖像,存放到grabImg變量中
ZV_LATCH(grabImg,0) '顯示到鎖存通道0中,作為顯示區(qū)域背景圖片
END SUB
7
在camera.bas文件中添加主界面中采集相關(guān)按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
end
'主界面按下掃描相機按鈕時響應的函數(shù)
GLOBAL SUB cam_scan_all()
ZV_SETSYSINT("LogLevel", 7) '設(shè)置控制器信息
ZV_SETSYSSTR("DataDir","")
CAM_SCAN(CAMERA_TYPE) '掃描相機,CAMERA_TYPE="mvision"
cam_num = CAM_COUNT() '獲取掃描到的相機數(shù)量
if (0 = cam_num) then '如果相機數(shù)量=0,打印提示信息
? "未找到相機"
return '退出子函數(shù),不往下執(zhí)行
endif
?"cam_num = " cam_num '如果掃描到相機,打印相機數(shù)量
cam_mode = 0 '設(shè)置軟觸發(fā)采集
CAM_SEL(0) '選擇掃描到的第一個相機進行操作
CAM_SETEXPOSURE(100000) '設(shè)置相機曝光時間為100000us
CAM_SETMODE(cam_mode) '設(shè)置軟件觸發(fā)模式
CAM_START(0) '開啟相機
END SUB
'主界面按下單次采集按鈕執(zhí)行的函數(shù)
GLOBAL SUB btn_grab()
if cam_num = 0 then
?"請先掃描相機!"
return
endif
CAM_SETPARAM("TriggerSoftware", 0)
CAM_GET(grabImg, 0)
ZV_LATCH(grabImg, 0)
ZV_IMGINFO(grabImg,3000) '獲取grabImg變量緩存的圖片的基本信息,并存放到起始地址為3000的table數(shù)組中
end sub
'主界面按下連續(xù)采集按鈕響應的函數(shù)
GLOBAL SUB btn_cgrab()
if grab_switch =1 then
?"正在連續(xù)運行中,請勿重復操作!"
return
endif
if cam_num = 0 then
?"請先掃描相機!"
return
endif
grab_switch = 1
if (1 = grab_switch) then
if (0 = PROC_STATUS(grab_task_id)) then
RUNTASK grab_task_id, grab_task
endif
endif
end sub
'采集任務實現(xiàn)函數(shù)
grab_task:
while(1)
if (0 = grab_switch) then
exit while
endif
CAM_START(0) '開啟相機
CAM_SETPARAM("TriggerSoftware", 0)
CAM_GET(grabImg, 0)
ZV_LATCH(grabImg, 0)
wend
END
'主界面按下停止采集按鈕響應的函數(shù)
GLOBAL SUB btn_stopCgrab()
if grab_switch =0 then
?"未開啟連續(xù)采集!"
return
endif
grab_switch = 0
end sub
↓
8
點擊[元件]→[新建窗口],新建學習模板窗口,設(shè)計窗口布局。
注意:需要設(shè)置窗口壟斷屬性。
9
在draw.bas文件中添加主界面【學習模板】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'主界面按下學習模板按鈕時響應的函數(shù)
GLOBAL SUB btn_sel_loc()
ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(11, 60), HMI_CONTROLSIZEY(11, 60)) '設(shè)置創(chuàng)建模板窗口鎖存通道0的鎖存大小
SET_COLOR(RGB(0,255,0)) '指定draw指令使用的顏色
ZV_LATCHCLEAR(0) '將鎖存通道0清空
ZV_LATCH(grabImg, 0) '顯示采集圖像顯示到鎖存通道0中
ZV_LATCH(colorSubImg, 1) '顯示模板圖像顯示到鎖存通道1中
'圖像roi坐標轉(zhuǎn)控件roi
is_redraw = 0
d_is_rtn_loc = 0
TABLE(111, d_locator_roi(0), d_locator_roi(1),d_locator_roi(2),d_locator_roi(3))
ZV_POSFROMIMG(0, 2, 111, 111) '圖像坐標轉(zhuǎn)換到HMI控件坐標
HMI_SHOWWINDOW(11)
END SUB
↓
10
在draw.bas文件中添加模板區(qū)域更新繪制函數(shù)。
'根據(jù)鼠標操作更新定位器的區(qū)域即學習模板的有效區(qū)域
GLOBAL SUB update_locator()
if mouse_scan(21) = 1 then '掃描鼠標按下操作
is_set_roi_m_down = 1
sr_mpos_x = table(21)
sr_mpos_y = table(22)
hit_pos = ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 111, -1) '只有按下時可以改變擊中位置
is_redraw = 1
endif
if mouse_scan(21) = -1 then '掃描鼠標松開操作
is_set_roi_m_down = 0
sr_mpos_x = table(21)
sr_mpos_y = table(22)
ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 111, hit_pos)
is_redraw = 1
endif
if (is_set_roi_m_down and MOUSE_state(21)) then
sr_mpos_x = table(21)
sr_mpos_y = table(22)
ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 111, hit_pos)
is_redraw = 1
endif
if (1 = is_redraw) then
'控件roi坐標轉(zhuǎn)圖像roi坐標
is_redraw = 0
ZV_POSTOIMG(0, 2, 111, 50) 'TABLE(50)作為中間變量臨時使用
d_locator_roi(0) = TABLE(50)
d_locator_roi(1) = TABLE(51)
d_locator_roi(2) = TABLE(52)
d_locator_roi(3) = TABLE(53)
SET_REDRAW
endif
END SUB
'根據(jù)更新的鼠標位置坐標繪制定位器roi
GLOBAL SUB draw_locator()
DRAWRECT(TABLE(111), TABLE(112), TABLE(113), TABLE(114))
local cx,cy
cx = (TABLE(111) + TABLE(113)) / 2
cy = (TABLE(112) + TABLE(114)) / 2
DRAWLINE(cx-5, cy, cx+5, cy) '中心十字線
DRAWLINE(cx, cy-5, cx, cy+5)
END SUB
11
在main.bas文件中添加【截取模板】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'創(chuàng)建模板界面按下截取模板按鈕后響應的函數(shù)
global sub btn_getSubImg()
LOCAL mod_w,mod_h
ZV_IMGGETSUB(grabImg, subImg, d_locator_roi(0), d_locator_roi(1), d_locator_roi(2)-d_locator_roi(0)+1, d_locator_roi(3)-d_locator_roi(1)+1)
ZV_IMGINFO(subImg,0)
mod_w = TABLE(0)
mod_h = TABLE(1)
ZV_REGENRECT(modRe,0,0,mod_w, mod_h)
ZV_LATCHCLEAR(1)
ZV_LATCH(subImg, 1)
end sub
↓
12
點擊[元件]→[新建窗口],新建編輯模板窗口,設(shè)計窗口布局。
注意:需要設(shè)置窗口壟斷屬性。
13
在draw.bas文件中添加創(chuàng)建模板界面【橡皮擦】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'創(chuàng)建模板界面按下橡皮擦按鈕時響應的函數(shù)
GLOBAL SUB btn_sel_erase()
ZV_LATCHSETSIZE(1, HMI_CONTROLSIZEX(12, 1), HMI_CONTROLSIZEY(12, 1)) '設(shè)置鎖存的大小
SET_COLOR(RGB(0,255,0)) '設(shè)置繪制時畫筆使用的顏色
ZV_LATCHCLEAR(1) '清空鎖存
ZV_IMGCOPY(subImg, copy_subImg) '復制模板子圖像到copy_subImg圖像變量中
ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區(qū)域,繪制顏色為黑色,用于掩模
ZV_LATCH(copy_subImg, 1) '顯示復制的模板圖
HMI_SHOWWINDOW(12) '打開編輯模板窗口
end sub
↓
14
在draw.bas文件中添加橡皮擦更新繪制函數(shù)。
'根據(jù)鼠標操作更新橡皮擦擦除/恢復區(qū)域的位置
GLOBAL SUB update_eraser()
DIM c_size_eraser '橡皮擦在控件上對應的尺寸
DIM eraser_pos_x,eraser_pos_y
d_mouse_s = MOUSE_STATE(21) '鼠標處于按下狀態(tài)時
eraser_pos_x = TABLE(21)
eraser_pos_y = TABLE(22)
c_size_eraser = ZV_LENFROMIMG(0, d_eraser_size) '將橡皮擦的圖像尺寸轉(zhuǎn)換成控件尺寸
c_rect(0, eraser_pos_x - c_size_eraser, eraser_pos_y - c_size_eraser, eraser_pos_x + c_size_eraser, eraser_pos_y + c_size_eraser)
'繪制以(eraser_pos_x,eraser_pos_y)為中心,2*c_size_eraser為邊長的正方形橡皮擦區(qū)域
DIM hmi_w,hmi_h
if (eraser_pos_x >= c_size_eraser) and (eraser_pos_y >= c_size_eraser) and (eraser_pos_x <= HMI_CONTROLSIZEX(12, 1) - c_size_eraser)and (eraser_pos_y <= HMI_CONTROLSIZEy(12, 1) - c_size_eraser) THEN
SET_REDRAW(0,0, HMI_CONTROLSIZEX(12, 1), HMI_CONTROLSIZEY(12, 1))'重新繪制編輯模板窗口上的鎖存通道0區(qū)域
endif
if d_mouse_s = 1 and d_edit_m = 1 then '如果鼠標處于按下狀態(tài)且編輯模板標志=1時
btn_pro_eraser() '執(zhí)行處理橡皮擦函數(shù)
endif
END SUB
'處理橡皮擦函數(shù)
global sub btn_pro_eraser()
ZVOBJECT tmp_re
TABLE(121, c_rect(0), c_rect(1))
ZV_POSTOIMG(1, 1, 121, 121)
ZV_REGENRECT(tmp_re, TABLE(121), TABLE(122), 2 * d_eraser_size + 1, 2 * d_eraser_size + 1)
if (d_isMask_m = 1) then '屏蔽
ZV_REDIFF(modRe, tmp_re, modRe) '計算modRe和tmp_re的差集并存放到modRe中
else '恢復
ZV_REUNION(modRe, tmp_re, modRe) '計算modRe和tmp_re的并集并存放到modRe中
endif
ZV_IMGCOPY(subImg, copy_subImg) '復制模板子圖像到copy_subImg圖像變量中
ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區(qū)域,繪制顏色為黑色,用于掩模
ZV_LATCH(copy_subImg, 1) '顯示復制的模板圖
end sub
'更新繪制橡皮擦區(qū)域
GLOBAL SUB draw_eraser()
if d_edit_m = 0 then '如果編輯模板標志
return '返回子函數(shù),不繼續(xù)往下執(zhí)行
endif
DRAWRECT(c_rect(0), c_rect(1), c_rect(2), c_rect(3))'繪制橡皮擦區(qū)域
END SUB
15
在main.bas文件中添加編輯模板界面【創(chuàng)建模板】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'編輯模板界面按下創(chuàng)建模板按鈕時響應的函數(shù)
GLOBAL SUB btn_loc_creModel()
d_is_creModel = 1
ZV_SHAPECREATERE(subImg, modRe,s_mod, d_mod_param(0), d_mod_param(1), d_mod_param(2), d_mod_param(3), d_mod_param(4), d_mod_param(5), d_mod_param(6), d_mod_param(7), d_mod_param(8))
'創(chuàng)建模板
ZV_SHAPECONTOURS(s_mod, contlist1, 0) '獲取第0層金字塔上的模板輪廓
ZV_GRAYTORGB(subImg, colorSubImg) '灰度圖轉(zhuǎn)換成RGB圖
ZV_IMGINFO(colorSubImg, 0) '獲取colorSubImg圖像信息,并存放到table0中
ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(0)/2, TABLE(1)/2, 0)'計算剛性變換矩陣
ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1)'對輪廓或輪廓序列進行仿射變換
ZV_CONTLIST(colorSubImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg圖像上繪制綠色的輪廓序列
ZV_LATCHCLEAR(2)
ZV_LATCH(colorSubImg, 2)
end sub
↓
16
在draw.bas文件中添加編輯模板界面【確定】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'編輯模板界面按下確定按鈕時執(zhí)行的函數(shù)
GLOBAL SUB btn_erase_cfm()
ZV_LATCHCLEAR(0)
ZV_LATCH(grabImg, 0) '顯示圖像在鎖存上
HMI_CLOSEWINDOW(12) '關(guān)閉編輯模板窗口
END SUB
↓
17
在main.bas文件中添加創(chuàng)建模板界面【測試】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'創(chuàng)建模板界面按下測試按鈕時響應的函數(shù)
GLOBAL SUB btn_loc_test()
if (d_is_creModel = 0) then
?"未創(chuàng)建模板!"
return
endif
'開始匹配
TICKS = 0
ZVOBJECT match_rst, sImg, colorImg
ZV_GAUSSBLUR(grabImg, sImg, 3)
ZV_SHAPEFIND(s_mod, sImg, match_rst, d_match_param(0), d_match_param(1), d_match_param(2), d_match_param(3), d_match_param(4), d_match_param(5), d_match_param(6))
ZV_MATINFO(match_rst, 0)
ZV_GRAYTORGB(sImg, colorImg)
if TABLE(0) > 0 then
local rowr
for rowr = 0 to TABLE(0)-1
ZV_MATGETROW(match_rst, rowr, 5, 3) '獲取match_rst矩陣中第rowr行的數(shù)據(jù)到table中,table最大長度5
if(rowr = 0) then
d_match_rst(0) = TABLE(3)
d_match_rst(1) = TABLE(4)
d_match_rst(2) = TABLE(5)
d_match_rst(3) = TABLE(6)
d_match_rst(4) = TABLE(7)
ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(4), TABLE(5), TABLE(6))'計算剛性變換矩陣
 nbsp; ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1)'對輪廓或輪廓序列進行仿射變換
ZV_CONTLIST(colorImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg圖像上繪制綠色的輪廓序列
endif
next
else
d_match_rst(0) = -1
d_match_rst(1) = -1
d_match_rst(2) = -1
d_match_rst(3) = -1
d_match_rst(4) = -1
endif
d_match_time = abs(TICKS) '匹配時間
ZV_LATCH(colorImg, 0)
end sub
↓
18
在draw.bas文件中添加創(chuàng)建模板界面【確定】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'創(chuàng)建模板界面按下確定按鈕時響應的函數(shù)
GLOBAL SUB btn_loc_cfm()
grab_switch = 0 '關(guān)閉補正源的連續(xù)采集
d_is_rtn_loc = 1
ZV_LATCHCLEAR(0)
ZV_LATCH(grabImg, 0) '顯示圖像在鎖存上
ZV_LATCH(grabImg, 1) '顯示圖像在鎖存上
HMI_CLOSEWINDOW(11)
END SUB
↓
19
在main.bas文件中添加主界面【單次執(zhí)行】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'主界面按下單次執(zhí)行按鈕時響應的函數(shù)
GLOBAL SUB btn_test()
btn_grab() '單次采集圖像
btn_loc_test() '匹配測試函數(shù)
END SUB
↓
20
在main.bas文件中添加主界面【連續(xù)運行】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'主界面點擊連續(xù)運行按鈕時響應的函數(shù)
GLOBAL SUB btn_run()
if(run_switch = 1) then
?"已開啟連續(xù)運行,請勿重復操作!"
return
endif
run_switch = 1
if (1 = run_switch) then
if (0 = PROC_STATUS(main_task_id)) then
RUNTASK main_task_id, main_task
endif
endif
END SUB
'連續(xù)運行主任務內(nèi)容
main_task:
while(1)
if (0 = run_switch) then
exit while
endif
'以下執(zhí)行相關(guān)定位操作
btn_grab()
btn_loc_test()
wend
END
↓
21
在main.bas文件中添加主界面【停止運行】按鈕響應的函數(shù)并關(guān)聯(lián)動作函數(shù)。
↓
'主界面點擊停止執(zhí)行按鈕時響應的函數(shù)
GLOBAL SUB btn_stop()
if(run_switch = 0) then
?"未開啟連續(xù)運行!"
return
endif
run_switch = 0
END SUB
↓
仿真演示效果
本次,VPLC系列機器視覺運動控制一體機快速入門(三)——基于形狀匹配的視覺定位就分享到這里,更多精彩內(nèi)容請關(guān)注“正運動小助手”公眾號。
本文由正運動技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學習,一起提高中國智能制造水平。文章版權(quán)歸正運動技術(shù)所有,如有轉(zhuǎn)載請注明文章來源。
標簽:
中國傳動網(wǎng)版權(quán)與免責聲明:凡本網(wǎng)注明[來源:中國傳動網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動網(wǎng)(m.u63ivq3.com)獨家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個人轉(zhuǎn)載使用時須注明來源“中國傳動網(wǎng)”,違反者本網(wǎng)將追究其法律責任。
本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負版權(quán)法律責任。