在线免费观看成年人视频-在线免费观看国产-在线免费观看国产精品-在线免费观看黄网站-在线免费观看精品

產(chǎn)品分類

當(dāng)前位置: 首頁(yè) > 工業(yè)電氣產(chǎn)品 > 端子與連接器 > 線路板連接器 > FFC連接器

類型分類:
科普知識(shí)
數(shù)據(jù)分類:
FFC連接器

VPLC系列機(jī)器視覺(jué)運(yùn)動(dòng)控制一體機(jī)快速入門(十一)多輪廓匹配

發(fā)布日期:2022-04-25 點(diǎn)擊率:63

  • 關(guān)鍵詞:正運(yùn)動(dòng)技術(shù),機(jī)器視覺(jué),運(yùn)動(dòng)一體機(jī)


  • 摘要:形狀匹配是基于邊緣梯度的輪廓相似度搜索匹配功能,經(jīng)常用于批量生產(chǎn)的具有固定形狀的產(chǎn)品的定位檢測(cè)項(xiàng)目,或者輔助其他視覺(jué)檢測(cè)算法做位置補(bǔ)正功能,但是它只能識(shí)別一種形狀的產(chǎn)品。


1.jpg


形狀匹配是基于邊緣梯度的輪廓相似度搜索匹配功能,經(jīng)常用于批量生產(chǎn)的具有固定形狀的產(chǎn)品的定位檢測(cè)項(xiàng)目,或者輔助其他視覺(jué)檢測(cè)算法做位置補(bǔ)正功能,但是它只能識(shí)別一種形狀的產(chǎn)品。


在工業(yè)生產(chǎn)環(huán)節(jié)中,同一個(gè)檢測(cè)工位可能會(huì)對(duì)不同的物料的多種形狀進(jìn)行分類拾取操作時(shí),需要識(shí)別與定位,此時(shí)需要可以同時(shí)支持匹配多種模板輪廓的功能,因此,我們正運(yùn)動(dòng)視覺(jué)指令引入了多輪廓匹配的功能。


上期課程,我們講述了機(jī)器視覺(jué)方案中齒輪缺齒檢測(cè)的應(yīng)用例程,本期課程我們將和大家一起分享如何實(shí)現(xiàn)多輪廓匹配的功能。


一檢測(cè)原理


多輪廓匹配的檢測(cè)算法是在形狀匹配的基礎(chǔ)上增加存儲(chǔ)多種模板輪廓信息的列表,創(chuàng)建模板完成后將對(duì)應(yīng)模板信息添加到模板列表中,并生成模板對(duì)應(yīng)的唯一ID(默認(rèn)ID從0開始,依次遞增)。在執(zhí)行多輪廓匹配時(shí),會(huì)將當(dāng)前圖像中的所有目標(biāo)特征和模板列表進(jìn)行相似度對(duì)比,返回所有滿足匹配條件的結(jié)果信息,包括分?jǐn)?shù)、位置X、位置Y、角度、比例、模板ID。


二軟件實(shí)現(xiàn)


(一)軟件實(shí)現(xiàn)


1.打開ZDevelop軟件:新建項(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)目。


image.png


2.設(shè)計(jì)HMI界面。


image.png


3.在“global_variable.bas”文件中定義全局變量,定義完成后運(yùn)行“Hmi.hmi”文件。


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

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

''table      說(shuō)明              table      說(shuō)明

''0~1  獲取到的圖像寬高      15~18  定位器roi圖像坐標(biāo)數(shù)據(jù)

''0~1  匹配結(jié)果矩陣的行列數(shù)    25~28  定位器roi控件和圖像數(shù)據(jù)

''53~62  匹配結(jié)果              30~31  橡皮擦roi坐標(biāo)

''11~12  鼠標(biāo)操作時(shí)獲取的坐標(biāo)    40~46 匹配參數(shù)


'***********定義程序任務(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;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)變量*************************

'定義鼠標(biāo)按下標(biāo)志位,1-已按下,0-未按下

GLOBAL DIM is_set_roi_m_down

is_set_roi_m_down = 0


'定義創(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īng)顟B(tài)

GLOBAL DIM d_mouse_s

d_mouse_s = 0


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


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


'定義學(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í)行過(guò)程中緩存中間圖片和結(jié)果圖片的變量

GLOBAL ZVOBJECT grabImg

GLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_mod,modList,mat_param

GLOBAL ZVOBJECT modRe


GLOBAL DIM C_RED, C_GREEN, C_BLUE, C_YELLOW

C_RED   = ZV_COLOR(255,  0,  0)

C_GREEN = ZV_COLOR(  0,255,  0)

C_BLUE  = ZV_COLOR(  0,  0,255)

C_YELLOW= ZV_COLOR(255,255,  0)


'顯示打印的字符

GLOBAL ShowString(64),ShowString1(64)


'***********定義讀取本地文件功能相關(guān)變量**************

''注意,該功能只在使用仿真器時(shí)有效

'定義是否使用本地圖片標(biāo)志

GLOBAL DIM d_use_imgfile


'定義本地圖片索引

GLOBAL DIM d_index


'定義讀取圖片的路徑

GLOBAL DIM File_Name(100)   


'***********結(jié)束定義讀取本地文件功能相關(guān)變量**********


'初始化全局變量完成后開啟HMI文件

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)角度步長(zhǎng)

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

  

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

    TABLE(40) = 70    '最小分?jǐn)?shù)

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

    TABLE(42) = 10    '默認(rèn)最小間距

    TABLE(43) = 40    '最小閾值

    TABLE(44) = 0     '精度

    TABLE(45) = 9     '速度

    TABLE(46) = 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

    

    d_use_imgfile = 1           '默認(rèn)使用本地圖片

    d_index      = 0


END SUB

5.關(guān)聯(lián)HMI界面控件變量。


image.png


6.在“main.bas”文件中添加HMI界面初始化函數(shù)并在Hmi系統(tǒng)設(shè)置中關(guān)聯(lián)初始化函數(shù)。


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

GLOBAL SUB hmi_init()


    ZV_ENVINIT()

    ZV_SETSYSSTR("DataDir","")               '設(shè)置默認(rèn)數(shù)據(jù)目錄

    ZV_SETSYSINT("LineWidth",6)              '設(shè)置線寬為 10    

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

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

    ZV_RESETCLIPSIZE(1280, 960)              '根據(jù)圖像分辨率設(shè)置圖像區(qū)域的裁剪尺寸,此處圖像分辨率為1280x960

    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)       '初始化模板子圖像

    '初始化匹配使用到的中間變量

    ZVOBJECT contlist1, tsContlist1, mat_rigid1

    ZVOBJECT contlist2, tsContlist2, mat_rigid2

    ZV_LATCHCLEAR(0)                         '清空鎖存通道

    ZV_MATGENDATA(mat_param, 1, 7, 40)       '將TABLE中1行9列40的數(shù)據(jù)生成到矩陣mat_param中

  

END SUB

image.png


7.在“camera.bas”文件中添加HMI界面中采集相關(guān)按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。(說(shuō)明:具體實(shí)現(xiàn)函數(shù)前面兩篇課程內(nèi)容已經(jīng)有操作演示,此處不做贅述。)


image.png


8.點(diǎn)擊[元件]→[新建窗口],新建學(xué)習(xí)模板窗口,設(shè)計(jì)窗口布局,關(guān)聯(lián)變量。


image.png


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


'主界面按下學(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中

  

    is_redraw = 0               '將繪圖標(biāo)志置0

    d_is_rtn_loc = 0            '將返回界面標(biāo)志置0

    '將模板區(qū)域的圖像坐標(biāo)存放到起始地址為25的table數(shù)組中

    TABLE(25, d_locator_roi(0), d_locator_roi(1),d_locator_roi(2),d_locator_roi(3)) 

    ZV_POSFROMIMG(0, 2, 25, 25) '將圖像坐標(biāo)轉(zhuǎn)換到HMI控件坐標(biāo)

    HMI_SHOWWINDOW(11)          '彈出窗口號(hào)為11的創(chuàng)建模板窗口


END SUB

image.png

10.在“draw.bas”文件中添加模板區(qū)域更新繪制函數(shù),并在學(xué)習(xí)模板界面的自定義控件上關(guān)聯(lián)刷新函數(shù)名和繪圖函數(shù)名。


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

GLOBAL SUB update_locator()


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

        is_set_roi_m_down = 1       '鼠標(biāo)按下標(biāo)志置1

        sr_mpos_x = table(11)      '將當(dāng)前鼠標(biāo)按下位置的坐標(biāo)賦值給變量

        sr_mpos_y = table(12)

        '只有按下時(shí)可以改變擊中位置,獲取鼠標(biāo)點(diǎn)擊位置對(duì)應(yīng)的擊中區(qū)域編號(hào)

        hit_pos = ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 25, -1) 

        is_redraw = 1              '繪圖標(biāo)志置1

    endif

  

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

        is_set_roi_m_down = 0       '鼠標(biāo)按下標(biāo)志置0

        sr_mpos_x = table(11)       '將當(dāng)前鼠標(biāo)松開位置的坐標(biāo)賦值給變量

        sr_mpos_y = table(12)

        '根據(jù)區(qū)域編號(hào)調(diào)整定位器區(qū)域位置

        ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 25, hit_pos)

        is_redraw = 1               '繪圖標(biāo)志置1

    endif

    

    '如果鼠標(biāo)按下時(shí)

    if (is_set_roi_m_down and MOUSE_state(11)) then

        sr_mpos_x = table(11)       '將當(dāng)前鼠標(biāo)按下位置的坐標(biāo)賦值給變量

        sr_mpos_y = table(12)

        '根據(jù)區(qū)域編號(hào)調(diào)整定位器區(qū)域位置

        ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 25, hit_pos)

        is_redraw = 1               '繪圖標(biāo)志置1

    endif 

    

    if (1 = is_redraw) then       '如果繪制標(biāo)志=1  

        is_redraw = 0              '將繪制標(biāo)志置0

        '控件roi坐標(biāo)轉(zhuǎn)圖像roi坐標(biāo),控件坐標(biāo)存放在起始地址為25的數(shù)組,圖像坐標(biāo)存放在起始地址為15的數(shù)組

        ZV_POSTOIMG(0, 2, 25, 15)

        '將圖像坐標(biāo)的數(shù)據(jù)賦值給ROI變量中

        d_locator_roi(0) = TABLE(15)

        d_locator_roi(1) = TABLE(16)

        d_locator_roi(2) = TABLE(17)

        d_locator_roi(3) = TABLE(18)

        SET_REDRAW  '重新繪制全部區(qū)域

    endif

  

END SUB

image.png


11.在“main.bas”文件中添加【截取模板】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。


'創(chuàng)建模板界面按下截取模板按鈕后響應(yīng)的函數(shù)

GLOBAL SUB btn_getSubImg()


    LOCAL mod_w,mod_h

    '根據(jù)ROI數(shù)據(jù)生成模板子圖像

    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)

      

    '獲取圖像信息,存放到起始地址為0的table數(shù)組中

    ZV_IMGINFO(subImg,0)

    mod_w = TABLE(0)

    mod_h = TABLE(1)

    

    '根據(jù)圖像信息生成模板區(qū)域

    ZV_REGENRECT(modRe,0,0,mod_w, mod_h)

    

    '清空鎖存通道1

    ZV_LATCHCLEAR(1)

    '將模板子圖像顯示到鎖存通道1中

    ZV_LATCH(subImg, 1)

  

END SUB

image.png


12.點(diǎn)擊[元件]→[新建窗口],新建編輯模板窗口,設(shè)計(jì)窗口布局,并關(guān)聯(lián)變量。


image.png

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


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

GLOBAL SUB btn_sel_erase()


    ZV_LATCHSETSIZE(1, HMI_ConTROLSIZEX(12, 1), HMI_ConTROLSIZEY(12, 1)) '設(shè)置鎖存通道1的大小

    SET_COLOR(RGB(0,255,0))              '設(shè)置繪制時(shí)畫筆使用的顏色

    ZV_LATCHCLEAR(1)                     '清空鎖存通道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

image.png

14.在“draw.bas”文件中添加橡皮擦更新繪制函數(shù),并在編輯模板界面的自定義控件上關(guān)聯(lián)刷新函數(shù)名和繪圖函數(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(11)     '鼠標(biāo)處于按下?tīng)顟B(tài)時(shí)

    eraser_pos_x = TABLE(11)         '將當(dāng)前鼠標(biāo)按下位置的坐標(biāo)賦值給橡皮擦控件坐標(biāo)變量

    eraser_pos_y = TABLE(12)

    

    c_size_eraser = ZV_LENFROMIMG(0, d_eraser_size) '將橡皮擦的圖像尺寸轉(zhuǎn)換成控件尺寸

    '生成以(eraser_pos_x,eraser_pos_y)為中心,2*c_size_eraser為邊長(zhǎng)的正方形橡皮擦區(qū)域

    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)

     

    DIM hmi_w,hmi_h

    '限制橡皮擦坐標(biāo)在圖片元件區(qū)域內(nèi)

    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

        '重新繪制編輯模板窗口上的鎖存通道0區(qū)域

        SET_REDRAW(0,0, HMI_ConTROLSIZEX(12, 1), HMI_ConTROLSIZEY(12, 1))

    endif

  

    if d_mouse_s = 1 and d_edit_m = 1 then '如果鼠標(biāo)處于按下?tīng)顟B(tài)且編輯模板標(biāo)志=1時(shí)

        btn_pro_eraser()                   '執(zhí)行處理橡皮擦函數(shù)

    endif

    

END SUB


'處理橡皮擦函數(shù)

GLOBAL SUB btn_pro_eraser()

    ZVOBJECT tmp_re

    '將橡皮擦區(qū)域的左上角坐標(biāo)x,y存放到起始地址為30的數(shù)組中

    TABLE(30, c_rect(0), c_rect(1))

    '將控件坐標(biāo)轉(zhuǎn)換到圖像坐標(biāo)中

    ZV_POSTOIMG(1, 1, 30, 30)

    '根據(jù)圖像坐標(biāo)系下的數(shù)據(jù)生成正方形橡皮擦區(qū)域,并存放到tmp_re變量中

    ZV_REGENRECT(tmp_re, TABLE(30), TABLE(31), 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中,即取橡皮擦區(qū)域以外的模板子圖像區(qū)域

    else  '如果選擇恢復(fù)功能

        ZV_REUNIOn(modRe, tmp_re, modRe)  '計(jì)算modRe和tmp_re的并集并存放到modRe中,即取當(dāng)前模板子圖像區(qū)域

    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)志為0    

       return                             '返回子函數(shù),不繼續(xù)往下執(zhí)行

    endif

      '繪制正方形橡皮擦區(qū)域

    DRAWRECT(c_rect(0), c_rect(1), c_rect(2), c_rect(3))

  

END SUB

image.png


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


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

GLOBAL SUB btn_loc_creModel()


    d_is_creModel = 1  '創(chuàng)建模板標(biāo)志置1

    '根據(jù)模板參數(shù)和模板子圖像創(chuàng)建模板,并將模板結(jié)果存放到s_mod變量中

    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)) 

    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)                         '清空鎖存通道2

    ZV_LATCH(colorSubImg, 2)                 '顯示圖像結(jié)果到鎖存通道2中

  

END SUB

image.png


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


'編輯模板界面按下添加模板按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB btn_loc_addModel()


    DIM count

    if d_is_creModel = 1  then 

         

         zv_listinsert(s_mod, modList)

         count = ZV_LISTCOUNT(modList)   '獲取列表中的數(shù)量

         ShowString="已添加模板"+TOSTR(count)

         ?ShowString

    

    endif

  

END SUB

image.png


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


'編輯模板界面按下清空模板列表按鈕時(shí)響應(yīng)的函數(shù)

GLOBAL SUB btn_loc_clrMods()

    ZV_CLEAR(modList)

    ?"已清空模板列表!"

END SUB

image.png


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


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

GLOBAL SUB btn_erase_cfm()


    ZV_LATCHCLEAR(0)      '清空鎖存通道0

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

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

   

END SUB

image.png

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


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

GLOBAL SUB btn_loc_test()

    

    if (d_is_creModel = 0 OR ZV_LISTCOUNT(modList)=0 ) then 

        ?"未創(chuàng)建模板!"          '提示未創(chuàng)建模板毛病返回子函數(shù)不往下執(zhí)行

      return

    endif

    

    '開始匹配

    TICKS = 0 '開始計(jì)時(shí)

    ZVOBJECT match_rst, sImg, colorImg,contours

    ZV_CLEAR(match_rst)

    ZV_MATINFO(match_rst, 0)     '獲取矩陣結(jié)果信息。并存放到起始地址為0的table數(shù)組中

    '對(duì)圖像進(jìn)行3*3高斯平滑處理,處理后的圖像輸出到sImg變量中

    ZV_GAUSSBLUR(grabImg, sImg, 3)

    ZV_SHAPEFINDS(modlist,mat_param,sImg,match_rst,3,0)'多目標(biāo)匹配

  

    ZV_MATINFO(match_rst, 0)     '獲取矩陣結(jié)果信息。并存放到起始地址為0的table數(shù)組中

    

    ZV_GRAYTORGB(sImg, colorImg) '灰度圖轉(zhuǎn)換到RGB圖,作為匹配結(jié)果圖像

    

    if TABLE(0) > 0 then         '如果匹配到目標(biāo)

        

        local rowr

        for rowr = 0 to TABLE(0)-1

              '獲取match_rst矩陣中第rowr行的數(shù)據(jù)存放到起始地址為53的table數(shù)組中,table最大長(zhǎng)度6

            ZV_MATGETROW(match_rst, rowr, 6, 53)  

            zv_listget(modList, s_mod, table(58))

            ZV_SHAPEConTOURS(s_mod, contours, 0)'獲取模板輪廓  

            ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(54), TABLE(55), TABLE(56))

            ZV_ConTAFFINE(contours, mat_rigid1, contours)

            ZV_ConTLIST(colorImg, contours, C_GREEN, 0)

            if TABLE(58)=0 then 

                ShowString="target1:"

              

            elseif TABLE(58)=1 then 

                ShowString="target2:"

            else 

                ShowString="target3:"

            endif

            ShowString1=TOSTR(TABLE(54),1,2)+","+TOSTR(TABLE(55),1,2)+","+TOSTR(TABLE(56),1,2)

            TABLE(54)=TABLE(54)-40 

            ZV_TEXT(colorImg,ShowString,TABLE(54), TABLE(55),50,ZV_COLOR(255,0,255) )

            TABLE(55)=TABLE(55)+50 

            ZV_TEXT(colorImg,ShowString1,TABLE(54), TABLE(55),50,ZV_COLOR(255,0,255) )

            

            next

            else '未匹配到目標(biāo)時(shí),將結(jié)果賦值為-1

            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) '計(jì)算匹配消耗時(shí)間

    ZV_LATCH(colorImg, 0)     '顯示匹配結(jié)果圖像

  

END SUB

image.png


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


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

GLOBAL SUB btn_loc_cfm()


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

    d_is_rtn_loc = 1     '返回主界面標(biāo)志置為1

    '設(shè)置鎖存通道0的大小

    ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 2), HMI_ConTROLSIZEY(10, 2))

    ZV_LATCHCLEAR(0)     '清空鎖存通道0

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

    HMI_CLOSEWINDOW(11)  '關(guān)閉創(chuàng)建模板窗口

   

END SUB

image.png


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


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

GLOBAL SUB btn_test()


    '執(zhí)行單次采集響應(yīng)函數(shù)獲取一幀圖像

    btn_grab() 

    '執(zhí)行測(cè)試按鈕響應(yīng)函數(shù)進(jìn)行匹配定位檢測(cè)          

    btn_loc_test()     

  

END SUB

image.png


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


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

GLOBAL SUB btn_run()

    if(run_switch = 1) then  '如果已經(jīng)開啟連續(xù)運(yùn)行

       ?"已開啟連續(xù)運(yùn)行,請(qǐng)勿重復(fù)操作!" '提示信息并退出子函數(shù),不往下執(zhí)行

      return 

    endif

  

    run_switch = 1      '主任務(wù)開關(guān)置1

    if (1 = run_switch) then   '如果主任務(wù)開關(guān)=1

        if (0 = PROC_STATUS(main_task_id)) then '如果main_task_id任務(wù)未開啟

           RUNTASK  main_task_id, main_task    '開啟main_task任務(wù)

        endif

    endif

END SUB


'主任務(wù)執(zhí)行的內(nèi)容

main_task:

    while(1)

        if (0 = run_switch) then '如果主任務(wù)開關(guān)=0即停止運(yùn)行按鈕按下時(shí)

          exit while           '退出循環(huán)

        endif

      

        '否則重復(fù)執(zhí)行以下操作

        if (d_use_imgfile=1) then   '如果d_use_imgfile=1時(shí)使用讀取本地圖片功能 

            if(d_index=3) then 

               d_index=0

            endif

            File_Name="多輪廓/"+TOSTR(d_index,1,0)+".bmp"   '讀取本地圖片時(shí)圖片所在的路徑名稱

            ZV_IMGREAD(grabImg,File_Name,0)

            d_index=d_index+1

        else 

       

            '如果相機(jī)數(shù)量為0,提示先掃描相機(jī),并退出子函數(shù)不往下執(zhí)行

              if cam_num = 0   then 

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

                return 

              endif

            CAM_SETPARAM("TriggerSoftware", 0)  '發(fā)送觸發(fā)指令

            CAM_GET(grabImg, 0) 

        endif

  

        '執(zhí)行測(cè)試按鈕響應(yīng)函數(shù)進(jìn)行匹配定位檢測(cè)          

        btn_loc_test() 

    wend

  

END

image.png


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


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

GLOBAL SUB btn_stop()


    if(run_switch = 0) then   '如果主任務(wù)開關(guān)=0

       ?"未開啟連續(xù)運(yùn)行!"      '提示未開啟循環(huán)任務(wù),并退出子函數(shù)不往下執(zhí)行

     return 

    endif

    run_switch = 0             '主任務(wù)開關(guān)置0,退出循環(huán)

  

END SUB

image.png

三操作演示

(一)操作步驟


查看運(yùn)行效果:將項(xiàng)目下載到仿真器中→使用本地圖片→單次采集→學(xué)習(xí)模板→截取模板→橡皮檫依次創(chuàng)建所需的幾個(gè)模板→依次添加幾個(gè)模板→點(diǎn)擊測(cè)試查看效果圖,再點(diǎn)擊確定返回主界面。→點(diǎn)擊連續(xù)運(yùn)行,查看運(yùn)行效果→結(jié)束。


image.png


本次,正運(yùn)動(dòng)技術(shù)VPLC系列機(jī)器視覺(jué)運(yùn)動(dòng)控制一體機(jī)快速入門(十一)多輪廓匹配,就分享到這里。


更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。


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


關(guān)于正運(yùn)動(dòng)技術(shù)


正運(yùn)動(dòng)技術(shù)專注于運(yùn)動(dòng)控制技術(shù)研究和通用運(yùn)動(dòng)控制軟硬件產(chǎn)品的研發(fā),是國(guó)家級(jí)高新技術(shù)企業(yè),主要產(chǎn)品有運(yùn)動(dòng)控制器、運(yùn)動(dòng)控制卡、視覺(jué)運(yùn)動(dòng)控制一體機(jī)、人機(jī)界面以及擴(kuò)展模塊等。


正運(yùn)動(dòng)技術(shù)匯集了來(lái)自華為、中興等公司的優(yōu)秀人才,在堅(jiān)持自主創(chuàng)新的同時(shí),積極聯(lián)合各大高校協(xié)同運(yùn)動(dòng)控制基礎(chǔ)技術(shù)的研究,是國(guó)內(nèi)工控領(lǐng)域發(fā)展最快的企業(yè)之一,也是國(guó)內(nèi)少有、完整掌握運(yùn)動(dòng)控制核心技術(shù)和實(shí)時(shí)工控軟件平臺(tái)技術(shù)的企業(yè)。 


下一篇: PLC、DCS、FCS三大控

上一篇: 各類智能材料在機(jī)器人

推薦產(chǎn)品

更多