0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)

正運(yùn)動(dòng)技術(shù) ? 2021-09-23 11:35 ? 次閱讀

視頻教程:《視頻教程:VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)》

今天,正運(yùn)動(dòng)技術(shù)為大家分享一下VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)——基于形狀匹配的視覺定位。

運(yùn)動(dòng)控制

上期課程,我們講述了機(jī)器視覺方案實(shí)施的基礎(chǔ)即相機(jī)的基本使用內(nèi)容,我們通過上期課程已經(jīng)能實(shí)現(xiàn)使用ZDevelop軟件獲取圖像進(jìn)行處理。

本期課程我們和大家一起分享機(jī)器視覺方案中常用的基于形狀匹配的視覺定位功能。

運(yùn)動(dòng)控制

視覺定位是指在視覺檢測(cè)中通過學(xué)習(xí)特定的模板或某些固定的特征,在檢測(cè)區(qū)域內(nèi)搜索滿足條件的特征,并返回特征在圖像坐標(biāo)中的位置信息,如坐標(biāo)位置X、坐標(biāo)位置Y、角度。

運(yùn)動(dòng)控制

形狀匹配是基于邊緣方向梯度的匹配,它是提取ROI中的邊緣特征結(jié)合灰度信息創(chuàng)建模板,然后在檢測(cè)區(qū)域ROI范圍內(nèi)搜索與模板的輪廓特征滿足一定相似程度的產(chǎn)品特征,并返回對(duì)應(yīng)位置信息。

運(yùn)動(dòng)控制

形狀匹配特點(diǎn)

1.適應(yīng)性強(qiáng):可適應(yīng)光照和圖像的灰度變化。

2.兼容性強(qiáng):可以支持搜索缺失局部邊緣、有噪聲干擾、有輕微變形和失焦的目標(biāo)。

3.多目標(biāo)搜索:支持同時(shí)搜索同一模板下的多個(gè)匹配目標(biāo)。

4.支持旋轉(zhuǎn)和縮放:在目標(biāo)圖像存在旋轉(zhuǎn)或縮放的情況下仍然能匹配到目標(biāo),但是需要在設(shè)定的旋轉(zhuǎn)和縮放比例范圍內(nèi)。

模板選擇

使用形狀匹配功能的前提是檢測(cè)目標(biāo)要有唯一且固定的特征。

1.在選擇模板時(shí),需要確保特征是檢測(cè)目標(biāo)唯一存在的特征,否則無法與其他檢測(cè)目標(biāo)區(qū)分。

2.盡量選擇圖像清晰形狀完整的標(biāo)準(zhǔn)產(chǎn)品作為模板,避免摻入噪點(diǎn)等干擾因素。

3.盡量避免選擇對(duì)稱的特征作為模板。

運(yùn)動(dòng)控制

如圖,閃電是目標(biāo)1唯一的特征,可以將目標(biāo)1和目標(biāo)2進(jìn)行區(qū)分。

運(yùn)動(dòng)控制

1 目標(biāo)定位

運(yùn)動(dòng)控制

在目標(biāo)輪廓特征清晰且定位精度要求不高時(shí),可直接使用形狀匹配輸出的位置結(jié)果做定位項(xiàng)目。

2 產(chǎn)品計(jì)數(shù)

運(yùn)動(dòng)控制

對(duì)具有相同形狀特征的產(chǎn)品進(jìn)行計(jì)數(shù)統(tǒng)計(jì)。

3 位置跟隨

運(yùn)動(dòng)控制

當(dāng)需要檢測(cè)的目標(biāo)位置不固定時(shí),一些檢測(cè)功能的ROI位置無法確定如檢測(cè)直線、檢測(cè)圓形等,我們可以利用檢測(cè)目標(biāo)周邊有固定距離的特征進(jìn)行位置跟隨。

運(yùn)動(dòng)控制

運(yùn)動(dòng)控制

形狀匹配流程圖

實(shí)例演示

1

新建項(xiàng)目→新建HMI文件→新建main.bas文件,用于編寫界面響應(yīng)函數(shù)→新建global_variable.bas文件用于存放全局變量并開啟HMI自動(dòng)運(yùn)行任務(wù)→新建InitLocator.bas文件用于初始化測(cè)量參數(shù)→新建camera.bas文件用于實(shí)現(xiàn)相機(jī)采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項(xiàng)目。

運(yùn)動(dòng)控制

2

設(shè)計(jì)主界面。

運(yùn)動(dòng)控制

3

在global_variable.bas文件中定義全局變量。

'''''全局變量大部分使用數(shù)組結(jié)構(gòu)'''''

''注:basic編程中很多函數(shù)會(huì)以TABLE(系統(tǒng)的數(shù)據(jù)結(jié)構(gòu))做為參數(shù)

''在這里table均是做為中間變量

''table 0-20 作為匹配時(shí)使用到的中間變量

''table 50-70 作為roi繪制時(shí)的中間變量使用

''table 21-22,表示鼠標(biāo)按鍵控件坐標(biāo)系

''table 31-35,表示控件坐標(biāo)轉(zhuǎn)換后對(duì)應(yīng)的圖像坐標(biāo)

''table 111-114,表示定位器區(qū)域roi參數(shù),屬于控件坐標(biāo)系

''table 121-124,表示橡皮擦區(qū)域roi參數(shù),屬于控件坐標(biāo)系

'***********定義程序任務(wù)相關(guān)變量**********************

'主任務(wù)狀態(tài)

'0 - 未初始化

'1 - 停止

'2 - 運(yùn)行中

'3 - 正在停止

GLOBAL DIM main_task_state

main_task_state = 1

'運(yùn)行任務(wù)開關(guān)

GLOBAL DIM run_switch

run_switch = 0

'采集任務(wù)開關(guān)

'0 - 停止采集

'1 - 請(qǐng)求采集

GLOBAL DIM grab_switch

grab_switch = 0

'定位檢測(cè)主任務(wù)id - 10

GLOBAL DIM main_task_id

main_task_id = 10

'相機(jī)連續(xù)采集線程id - 7

GLOBAL DIM grab_task_id

grab_task_id = 7

'***********結(jié)束定義程序任務(wù)相關(guān)變量******************

'***********定義相機(jī)采集相關(guān)變量**********************

'相機(jī)種類,"",此處使用??迪鄼C(jī)-"mvision"

GLOBAL DIM CAMERA_TYPE(100)

'CAMERA_TYPE = "mindvision;basler;mvision;huaray;basler;zmotion"

CAMERA_TYPE = "mvision"

'相機(jī)個(gè)數(shù)

GLOBAL cam_num

cam_num = 0

'相機(jī)模式,-1 連續(xù)采集,0-觸發(fā)采集

GLOBAL cam_mode

cam_mode = 0

'***********結(jié)束定義相機(jī)采集相關(guān)變量******************

'定義返回主界面標(biāo)志,1-已返回,0-未返回

GLOBAL DIM d_is_rtn_loc

d_is_rtn_loc = 1

'***********定義模板相關(guān)變量*************************

'定義創(chuàng)建模板標(biāo)志位,1-已創(chuàng)建模板,0-未創(chuàng)建模板

GLOBAL DIM d_is_creModel

d_is_creModel = 0

'學(xué)習(xí)模板參數(shù),starAngle、endAngle、minScale、maxScale、thresh、numlevel、reduce、angleStep、scaleStep

GLOBAL DIM d_mod_param(9)

'***********結(jié)束定義模板相關(guān)變量**********************

'***********定義編輯模板相關(guān)變量*********************

'定義編輯模板標(biāo)志,0-表示不編輯模板,1-表示編輯模板

GLOBAL DIM d_edit_m

d_edit_m = 0

'定義使用橡皮擦功能標(biāo)志,0-表示恢復(fù)擦除的區(qū)域,1-表示擦除區(qū)域

GLOBAL DIM d_isMask_m

d_isMask_m = 1

'定義橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標(biāo)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)

'定義鼠標(biāo)狀態(tài)標(biāo)志,0-表示鼠標(biāo)處于松開狀態(tài),1-表示鼠標(biāo)處于按下狀態(tài)

GLOBAL DIM d_mouse_s

d_mouse_s = 0

'***********結(jié)束定義編輯模板相關(guān)變量******************

'***********定義匹配檢測(cè)相關(guān)變量*********************

'匹配檢測(cè)參數(shù),minScore、matchNum、minDist、thresh、accuracy、speed、polor

GLOBAL DIM d_match_param(7)

'定義學(xué)習(xí)模板的roi參數(shù)和橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標(biāo)x、y、x、y

GLOBAL DIM d_locator_roi(4),d_eraser_roi(4)

'匹配結(jié)果,score、x、y、angle、scale, 目前對(duì)于多目標(biāo)匹配也只存第一個(gè)目標(biāo)

GLOBAL DIM d_match_rst(5)

GLOBAL DIM d_match_time '定義匹配定位消耗的時(shí)間變量

d_match_time = 0

'***********結(jié)束定義匹配檢測(cè)相關(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文件中初始化測(cè)量參數(shù)。

end

GLOBAL SUB init_meas_param() '初始化測(cè)量參數(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 '默認(rèn)金字塔層數(shù)

d_mod_param(6) = 0 '默認(rèn)約簡(jiǎn)特征點(diǎn)

d_mod_param(7) = 0 '默認(rèn)角度步長

d_mod_param(8) = 0 '默認(rèn)縮放步長

'初始化匹配測(cè)量參數(shù)

d_match_param(0) = 50 '最小分?jǐn)?shù)

d_match_param(1) = 1 '匹配個(gè)數(shù)

d_match_param(2) = 0 '默認(rèn)最小間距

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 '分?jǐn)?shù)

d_match_rst(1) = 0 '位置X

d_match_rst(2) = 0 '位置Y

d_match_rst(3) = 0 '角度

d_match_rst(4) = 0 '比例

'初始化匹配定位消耗時(shí)間

d_match_time = 0

END SUB

5

關(guān)聯(lián)主界面值顯示控件變量。

運(yùn)動(dòng)控制

6

在main.bas文件中添加主界面初始化函數(shù)。

'HMI界面初始化函數(shù),上電執(zhí)行一次

GLOBAL SUB hmi_init()

grab_switch = 0 '初始化采集任務(wù)開關(guān),不開啟采集任務(wù)

main_task_state = 1 '初始化定位檢測(cè)主任務(wù)狀態(tài)為停止?fàn)顟B(tài)1

ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) '設(shè)置鎖存的大小

init_meas_param() '初始化測(cè)量參數(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)按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

end

'主界面按下掃描相機(jī)按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB cam_scan_all()

ZV_SETSYSINT("LogLevel", 7) '設(shè)置控制器信息

ZV_SETSYSSTR("DataDir","")

CAM_SCAN(CAMERA_TYPE) '掃描相機(jī),CAMERA_TYPE="mvision"

cam_num = CAM_COUNT() '獲取掃描到的相機(jī)數(shù)量

if (0 = cam_num) then '如果相機(jī)數(shù)量=0,打印提示信息

? "未找到相機(jī)"

return '退出子函數(shù),不往下執(zhí)行

endif

?"cam_num = " cam_num '如果掃描到相機(jī),打印相機(jī)數(shù)量

cam_mode = 0 '設(shè)置軟觸發(fā)采集

CAM_SEL(0) '選擇掃描到的第一個(gè)相機(jī)進(jìn)行操作

CAM_SETEXPOSURE(100000) '設(shè)置相機(jī)曝光時(shí)間為100000us

CAM_SETMODE(cam_mode) '設(shè)置軟件觸發(fā)模式

CAM_START(0) '開啟相機(jī)

END SUB

'主界面按下單次采集按鈕執(zhí)行的函數(shù)

GLOBAL SUB btn_grab()

if cam_num = 0 then

?"請(qǐng)先掃描相機(jī)!"

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ù)采集按鈕響應(yīng)的函數(shù)

GLOBAL SUB btn_cgrab()

if grab_switch =1 then

?"正在連續(xù)運(yùn)行中,請(qǐng)勿重復(fù)操作!"

return

endif

if cam_num = 0 then

?"請(qǐng)先掃描相機(jī)!"

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

'采集任務(wù)實(shí)現(xiàn)函數(shù)

grab_task:

while(1)

if (0 = grab_switch) then

exit while

endif

CAM_START(0) '開啟相機(jī)

CAM_SETPARAM("TriggerSoftware", 0)

CAM_GET(grabImg, 0)

ZV_LATCH(grabImg, 0)

wend

END

'主界面按下停止采集按鈕響應(yīng)的函數(shù)

GLOBAL SUB btn_stopCgrab()

if grab_switch =0 then

?"未開啟連續(xù)采集!"

return

endif

grab_switch = 0

end sub

運(yùn)動(dòng)控制

8

點(diǎn)擊[元件]→[新建窗口],新建學(xué)習(xí)模板窗口,設(shè)計(jì)窗口布局。

運(yùn)動(dòng)控制

注意:需要設(shè)置窗口壟斷屬性。

9

在draw.bas文件中添加主界面【學(xué)習(xí)模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'主界面按下學(xué)習(xí)模板按鈕時(shí)響應(yīng)的函數(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坐標(biāo)轉(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) '圖像坐標(biāo)轉(zhuǎn)換到HMI控件坐標(biāo)

HMI_SHOWWINDOW(11)

END SUB

運(yùn)動(dòng)控制

10

在draw.bas文件中添加模板區(qū)域更新繪制函數(shù)。

'根據(jù)鼠標(biāo)操作更新定位器的區(qū)域即學(xué)習(xí)模板的有效區(qū)域

GLOBAL SUB update_locator()

if mouse_scan(21) = 1 then '掃描鼠標(biāo)按下操作

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) '只有按下時(shí)可以改變擊中位置

is_redraw = 1

endif

if mouse_scan(21) = -1 then '掃描鼠標(biāo)松開操作

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坐標(biāo)轉(zhuǎn)圖像roi坐標(biāo)

is_redraw = 0

ZV_POSTOIMG(0, 2, 111, 50) 'TABLE(50)作為中間變量臨時(shí)使用

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ù)更新的鼠標(biāo)位置坐標(biāo)繪制定位器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文件中添加【截取模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'創(chuàng)建模板界面按下截取模板按鈕后響應(yī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

運(yùn)動(dòng)控制

12

點(diǎn)擊[元件]→[新建窗口],新建編輯模板窗口,設(shè)計(jì)窗口布局。

運(yùn)動(dòng)控制

注意:需要設(shè)置窗口壟斷屬性。

13

在draw.bas文件中添加創(chuàng)建模板界面【橡皮擦】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'創(chuàng)建模板界面按下橡皮擦按鈕時(shí)響應(yī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è)置繪制時(shí)畫筆使用的顏色

ZV_LATCHCLEAR(1) '清空鎖存

ZV_IMGCOPY(subImg, copy_subImg) '復(fù)制模板子圖像到copy_subImg圖像變量中

ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區(qū)域,繪制顏色為黑色,用于掩模

ZV_LATCH(copy_subImg, 1) '顯示復(fù)制的模板圖

HMI_SHOWWINDOW(12) '打開編輯模板窗口

end sub

運(yùn)動(dòng)控制

14

在draw.bas文件中添加橡皮擦更新繪制函數(shù)。

'根據(jù)鼠標(biāo)操作更新橡皮擦擦除/恢復(fù)區(qū)域的位置

GLOBAL SUB update_eraser()

DIM c_size_eraser '橡皮擦在控件上對(duì)應(yīng)的尺寸

DIM eraser_pos_x,eraser_pos_y

d_mouse_s = MOUSE_STATE(21) '鼠標(biāo)處于按下狀態(tài)時(shí)

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 '如果鼠標(biāo)處于按下狀態(tài)且編輯模板標(biāo)志=1時(shí)

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) '計(jì)算modRe和tmp_re的差集并存放到modRe中

else '恢復(fù)

ZV_REUNION(modRe, tmp_re, modRe) '計(jì)算modRe和tmp_re的并集并存放到modRe中

endif

ZV_IMGCOPY(subImg, copy_subImg) '復(fù)制模板子圖像到copy_subImg圖像變量中

ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區(qū)域,繪制顏色為黑色,用于掩模

ZV_LATCH(copy_subImg, 1) '顯示復(fù)制的模板圖

end sub

'更新繪制橡皮擦區(qū)域

GLOBAL SUB draw_eraser()

if d_edit_m = 0 then '如果編輯模板標(biāo)志

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)建模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'編輯模板界面按下創(chuàng)建模板按鈕時(shí)響應(yī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)'計(jì)算剛性變換矩陣

ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1)'對(duì)輪廓或輪廓序列進(jìn)行仿射變換

ZV_CONTLIST(colorSubImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg圖像上繪制綠色的輪廓序列

ZV_LATCHCLEAR(2)

ZV_LATCH(colorSubImg, 2)

end sub

運(yùn)動(dòng)控制

16

在draw.bas文件中添加編輯模板界面【確定】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'編輯模板界面按下確定按鈕時(shí)執(zhí)行的函數(shù)

GLOBAL SUB btn_erase_cfm()

ZV_LATCHCLEAR(0)

ZV_LATCH(grabImg, 0) '顯示圖像在鎖存上

HMI_CLOSEWINDOW(12) '關(guān)閉編輯模板窗口

END SUB

運(yùn)動(dòng)控制

17

在main.bas文件中添加創(chuàng)建模板界面【測(cè)試】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'創(chuàng)建模板界面按下測(cè)試按鈕時(shí)響應(yī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))'計(jì)算剛性變換矩陣

ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1)'對(duì)輪廓或輪廓序列進(jìn)行仿射變換

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) '匹配時(shí)間

ZV_LATCH(colorImg, 0)

end sub

運(yùn)動(dòng)控制

18

在draw.bas文件中添加創(chuàng)建模板界面【確定】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'創(chuàng)建模板界面按下確定按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB btn_loc_cfm()

grab_switch = 0 '關(guān)閉補(bǔ)正源的連續(xù)采集

d_is_rtn_loc = 1

ZV_LATCHCLEAR(0)

ZV_LATCH(grabImg, 0) '顯示圖像在鎖存上

ZV_LATCH(grabImg, 1) '顯示圖像在鎖存上

HMI_CLOSEWINDOW(11)

END SUB

運(yùn)動(dòng)控制

19

在main.bas文件中添加主界面【單次執(zhí)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'主界面按下單次執(zhí)行按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB btn_test()

btn_grab()'單次采集圖像

btn_loc_test() '匹配測(cè)試函數(shù)

END SUB

運(yùn)動(dòng)控制

20

在main.bas文件中添加主界面【連續(xù)運(yùn)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制

'主界面點(diǎn)擊連續(xù)運(yùn)行按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB btn_run()

if(run_switch = 1) then

?"已開啟連續(xù)運(yùn)行,請(qǐng)勿重復(fù)操作!"

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ù)運(yùn)行主任務(wù)內(nèi)容

main_task:

while(1)

if (0 = run_switch) then

exit while

endif

'以下執(zhí)行相關(guān)定位操作

btn_grab()

btn_loc_test()

wend

END

運(yùn)動(dòng)控制

21

在main.bas文件中添加主界面【停止運(yùn)行】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

運(yùn)動(dòng)控制



'主界面點(diǎn)擊停止執(zhí)行按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB btn_stop()

if(run_switch = 0) then

?"未開啟連續(xù)運(yùn)行!"

return

endif

run_switch = 0

END SUB

運(yùn)動(dòng)控制

仿真演示效果

運(yùn)動(dòng)控制

本次,VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)——基于形狀匹配的視覺定位就分享到這里,更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào)。

本文由正運(yùn)動(dòng)技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來源。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器視覺
    +關(guān)注

    關(guān)注

    162

    文章

    4405

    瀏覽量

    120613
  • 人工智能
    +關(guān)注

    關(guān)注

    1796

    文章

    47643

    瀏覽量

    239861
  • 工業(yè)控制
    +關(guān)注

    關(guān)注

    38

    文章

    1468

    瀏覽量

    85980
  • 工廠自動(dòng)化
    +關(guān)注

    關(guān)注

    1

    文章

    48

    瀏覽量

    17283
  • 正運(yùn)動(dòng)技術(shù)

    關(guān)注

    0

    文章

    104

    瀏覽量

    443
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    工業(yè)一體機(jī)在工業(yè)視覺設(shè)備中的應(yīng)用

    工業(yè)一體機(jī)在工業(yè)視覺設(shè)備中的應(yīng)用十分廣泛,以下是對(duì)其應(yīng)用的詳細(xì)分析:
    的頭像 發(fā)表于 01-08 16:40 ?113次閱讀

    高集成機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)VPLC712!

    緊湊型機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)
    的頭像 發(fā)表于 12-20 09:55 ?244次閱讀
    高集成<b class='flag-5'>機(jī)器</b><b class='flag-5'>視覺</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制</b><b class='flag-5'>一體機(jī)</b><b class='flag-5'>VPLC</b>712!

    機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)在DELTA并聯(lián)機(jī)械手視覺上下料應(yīng)用

    機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)在DELTA并聯(lián)機(jī)械手視覺上下料的應(yīng)用
    的頭像 發(fā)表于 10-24 09:02 ?478次閱讀
    <b class='flag-5'>機(jī)器</b><b class='flag-5'>視覺</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制</b><b class='flag-5'>一體機(jī)</b>在DELTA并聯(lián)機(jī)械手<b class='flag-5'>視覺</b>上下料應(yīng)用

    聚徽-工控一體機(jī)有什么創(chuàng)新

    工控一體機(jī)作為新代的工業(yè)控制設(shè)備,具有多項(xiàng)創(chuàng)新點(diǎn),這些創(chuàng)新使得工控一體機(jī)能夠更好地滿足工業(yè)控制的需求,提高自動(dòng)化生產(chǎn)的效率和質(zhì)量。
    的頭像 發(fā)表于 09-14 09:34 ?375次閱讀

    藍(lán)海華騰參股公司頂控科技發(fā)布運(yùn)動(dòng)控制一體機(jī)系列產(chǎn)品

    藍(lán)海華騰參股公司深圳市頂控科技有限公司運(yùn)動(dòng)控制一體機(jī)系列產(chǎn)品上市!本次新品發(fā)布會(huì)發(fā)布個(gè)系列產(chǎn)品
    的頭像 發(fā)表于 09-03 09:28 ?563次閱讀

    機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)VPLC532E在汽車膠帶纏繞的開放式CNC應(yīng)用

    機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)VPLC532E在汽車膠帶纏繞的開放式CNC應(yīng)用
    的頭像 發(fā)表于 08-19 10:03 ?394次閱讀
    <b class='flag-5'>機(jī)器</b><b class='flag-5'>視覺</b><b class='flag-5'>運(yùn)動(dòng)</b><b class='flag-5'>控制</b><b class='flag-5'>一體機(jī)</b><b class='flag-5'>VPLC</b>532E在汽車膠帶纏繞的開放式CNC應(yīng)用

    VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)在五軸聯(lián)動(dòng)點(diǎn)膠上的應(yīng)用

    技術(shù)針對(duì)現(xiàn)有市場(chǎng)需求,開發(fā)了種基于VPLC系列機(jī)器視覺運(yùn)動(dòng)
    發(fā)表于 07-29 14:29

    聚徽觸控-工控一體機(jī)和 PLC 一體機(jī)有什么不同

    在工業(yè)自動(dòng)化領(lǐng)域,工控一體機(jī)和 PLC 一體機(jī)都扮演著重要角色。盡管它們?cè)谀撤N程度上有所重疊,但它們?cè)诠δ?、?yīng)用和設(shè)計(jì)結(jié)構(gòu)等方面存在顯著的不同。工控一體機(jī)和 PLC 一體機(jī)有什么不同,
    的頭像 發(fā)表于 06-21 10:05 ?555次閱讀

    集特一體機(jī)

    顯卡一體機(jī)
    jf_67464575
    發(fā)布于 :2024年05月22日 09:05:55

    基于VPLC711的曲面外觀檢測(cè)XYR運(yùn)動(dòng)控制解決方案

    中心線永遠(yuǎn)與產(chǎn)品表面垂直(曲面處相機(jī)中心線始終與切線方向垂直)。 (2)相機(jī)到被檢測(cè)產(chǎn)品的距離保持致,任何位置L1=L2 VPLC711機(jī)器視覺
    發(fā)表于 04-16 17:58

    機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)在喇叭跟隨點(diǎn)膠上的應(yīng)用

    等問題。 正運(yùn)動(dòng)技術(shù)視覺點(diǎn)膠整體解決方案: 在此背景下,正運(yùn)動(dòng)技術(shù)的視覺點(diǎn)膠整體解決方案脫穎而出,方案是基于VPLC
    發(fā)表于 04-16 17:37

    機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)在光伏匯流焊機(jī)器人系統(tǒng)的解決方案

    一體機(jī)結(jié)合SCARA機(jī)械手+機(jī)器視覺的電池片匯流焊解決方案??山鉀Q不同角度來料、規(guī)格等光伏太陽能電池板的串焊需求,實(shí)現(xiàn)生產(chǎn)效率和精度等大幅提升,同時(shí)將廢品率降至僅12%,并顯著加快數(shù)據(jù)處理速度,提高了
    發(fā)表于 02-28 15:01