技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國傳動(dòng)網(wǎng) > 技術(shù)頻道 > 應(yīng)用方案 > 【正運(yùn)動(dòng)】機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)應(yīng)用例程(九)線束顏色排序識別

【正運(yùn)動(dòng)】機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)應(yīng)用例程(九)線束顏色排序識別

時(shí)間:2021-07-16 14:06:39來源:深圳市正運(yùn)動(dòng)技術(shù)有限公司

導(dǎo)語:?線材在生產(chǎn)制造過程中需要按規(guī)范的顏色來進(jìn)行排序,以往用傳統(tǒng)人工去檢測易出現(xiàn)漏檢、錯(cuò)檢的情況,通過正運(yùn)動(dòng)技術(shù)機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)線束顏色排序識別系統(tǒng),可自動(dòng)識別線束顏色及排列順序是否有誤或插錯(cuò)空位等情況。

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

  線材在生產(chǎn)制造過程中需要按規(guī)范的顏色來進(jìn)行排序,以往用傳統(tǒng)人工去檢測易出現(xiàn)漏檢、錯(cuò)檢的情況,通過正運(yùn)動(dòng)技術(shù)機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)線束顏色排序識別系統(tǒng),可自動(dòng)識別線束顏色及排列順序是否有誤或插錯(cuò)空位等情況。

  它能夠24小時(shí)不停止運(yùn)行,工作效率高,提高產(chǎn)能。以及它的檢測結(jié)果和人工檢測相比一致性較高、可靠性強(qiáng)。

  上期課程,我們講述了機(jī)器視覺方案中零件分揀的應(yīng)用例程,本期課程我們將和大家一起分享如何實(shí)現(xiàn)線束顏色排序識別的功能。

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

  教學(xué)視頻

  一檢測原理梯形圖介紹

  (一)檢測需求

  識別出線束的線材顏色排序是否規(guī)范,并顯示當(dāng)前的線材識別的顏色和檢測結(jié)果。

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

  (二)軟件算法

  先用彩色相機(jī)拍攝圖片后依次截取線束上不同顏色區(qū)域進(jìn)行顏色樣本學(xué)習(xí),將顏色樣本結(jié)果存放到列表中。

  其次將RGB圖像轉(zhuǎn)為灰度圖后用形狀匹配工具學(xué)習(xí)模板,將模板位置結(jié)果作為基準(zhǔn)位置。

  當(dāng)前匹配到的目標(biāo)結(jié)果和基準(zhǔn)位置結(jié)果進(jìn)行計(jì)算輸出位置變換矩陣,3個(gè)顏色識別的ROI區(qū)域和創(chuàng)建模板時(shí)設(shè)置的ROI區(qū)域位置使用同一個(gè)變換矩陣進(jìn)行仿射變換,即使用形狀匹配作為識別顏色區(qū)域的補(bǔ)正源。

  最后將識別的線束顏色的顏色排序?yàn)椤皉ed”“black”“yellow”才會(huì)輸出“OK”的狀態(tài)結(jié)果,否則輸出“NG”的狀態(tài)結(jié)果。

  二軟件實(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”文件用于初始化測量參數(shù)→新建“camera.bas”文件用于實(shí)現(xiàn)相機(jī)采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項(xiàng)目。

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

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

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

  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 說明 table 說明''0~1 獲取到的圖像寬高 15~18 定位器roi圖像坐標(biāo)數(shù)據(jù)''0~1 匹配結(jié)果矩陣的行列數(shù) 25~28 定位器roi控件和圖像數(shù)據(jù)''3~7 匹配結(jié)果 30~31 橡皮擦roi坐標(biāo)''11~12 鼠標(biāo)操作時(shí)獲取的坐標(biāo) 50~81 線1識別顏色結(jié)果''82~113 線2識別顏色結(jié)果 114~145 線3識別顏色結(jié)果''160 識別分?jǐn)?shù) 150 線1識別ID''151 線2識別ID 152 線3識別ID''170~172 線1ROI區(qū)域數(shù)據(jù) 173~175 線2ROI區(qū)域數(shù)據(jù)''176~178 線3ROI區(qū)域數(shù)據(jù) ''225~228 訓(xùn)練樣本ROI控件坐標(biāo)數(shù)據(jù) 231~235 線1ROI控件坐標(biāo)數(shù)據(jù)''331~335 線2ROI控件坐標(biāo)數(shù)據(jù) 431~435 線3ROI控件坐標(biāo)數(shù)據(jù)''VR(0) 模板保存標(biāo)志,1-已保存 VR(1) 參數(shù)保存標(biāo)志,1-已保存''VR(10)~(18)模板參數(shù)斷電保存地址 VR(20)~(26)匹配參數(shù)斷電保存地址''VR(30)~(34)線1ROI坐標(biāo)數(shù)據(jù) VR(40)~(44)線2ROI坐標(biāo)數(shù)據(jù)''VR(50)~(54)線3ROI坐標(biāo)數(shù)據(jù) VR(60)~(63)訓(xùn)練學(xué)習(xí)ROI坐標(biāo)數(shù)據(jù)''VR(70)~(74)匹配基準(zhǔn)數(shù)據(jù) VR(76) 識別分?jǐn)?shù)'***********定義程序任務(wù)相關(guān)變量**********************

  '主任務(wù)狀態(tài)'0 - 未初始化'1 - 停止'2 - 運(yùn)行中'3 - 正在停止GLOBAL DIM main_task_statemain_task_state = 1

  '運(yùn)行任務(wù)開關(guān)GLOBAL DIM run_switchrun_switch = 0

  '采集任務(wù)開關(guān)'0 - 停止采集'1 - 請求采集GLOBAL DIM grab_switchgrab_switch = 0

  '定位檢測主任務(wù)id - 10GLOBAL DIM main_task_idmain_task_id = 10

  '相機(jī)連續(xù)采集線程id - 7GLOBAL DIM grab_task_idgrab_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_numcam_num = 0

  '相機(jī)模式,-1 連續(xù)采集,0-軟件觸發(fā)采集GLOBAL cam_modecam_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_downis_set_roi_m_down = 0

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

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

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

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

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

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

  '定義橡皮擦的roi參數(shù),依次是矩形左上角和右下角圖像坐標(biāo)x、y、x、yGLOBAL DIM d_locator_roi(4),d_eraser_roi(4)

  '定義正方形橡皮擦尺寸寬度GLOBAL DIM d_eraser_sized_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_sd_mouse_s = 0

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

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

  '匹配檢測參數(shù),minScore、matchNum、minDist、thresh、accuracy、speed、polorGLOBAL DIM d_match_param(7)

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

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

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

  '***********結(jié)束定義匹配檢測相關(guān)變量******************

  '定義程序執(zhí)行過程中緩存中間圖片和結(jié)果圖片的變量GLOBAL ZVOBJECT grabImg,colorImgGLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_modGLOBAL ZVOBJECT modRe

  '定義程序執(zhí)行過程中顏色樣本模板變量和顏色模板列表變量GLOBAL ZVOBJECT grabImg,ColorMod,Clrmod_list

  '設(shè)置創(chuàng)建模板的基準(zhǔn)坐標(biāo)GLOBAL DIM d_match_base_rst(5)

  '定義檢測識別顏色的ROI區(qū)域GLOBAL DIM d_reg_roi1(5),d_reg_roi2(5),d_reg_roi3(5)

  '定義訓(xùn)練學(xué)習(xí)顏色樣本的ROI區(qū)域GLOBAL DIM d_learn_roi(4)

  '定義選擇顏色識別ROI的類型GLOBAL DIM d_select_regROId_select_regROI=0

  '定義排線顏色順序檢測結(jié)果狀態(tài)GLOBAL DIM d_rst_status d_rst_status=0

  '常用顏色變量GLOBAL C_RED, C_GREEN, C_BLUE, C_YELLOW,C_WHITEC_RED = RGB(255, 0, 0)C_GREEN = RGB( 0,255, 0)C_BLUE = RGB( 0, 0,255)C_YELLOW= RGB(255,255, 0)C_WHITE = RGB(255,255, 255)

  '定義輸入需要進(jìn)行學(xué)習(xí)的顏色樣本名稱GLOBAL DIM d_sample_name(128)d_sample_name=""

  '定義檢測到的顏色結(jié)果GLOBAL DIM d_color_rst1(32),d_color_rst2(32),d_color_rst3(32)

  GLOBAL DIM d_detect_time '定義消耗的時(shí)間變量d_detect_time = 0

  '***********定義讀取本地文件功能相關(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”文件中初始化測量參數(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 '默認(rèn)金字塔層數(shù) d_mod_param(6) = 0 '默認(rèn)約簡特征點(diǎn) d_mod_param(7) = 0 '默認(rèn)角度步長 d_mod_param(8) = 0 '默認(rèn)縮放步長 '初始化匹配測量參數(shù) d_match_param(0) = 50 '最小分?jǐn)?shù) d_match_param(1) = 1 '匹配個(gè)數(shù) d_match_param(2) = 10 '默認(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 '比例 d_reg_roi1(0)=160 '識別顏色ROI1 d_reg_roi1(1)=110 d_reg_roi1(2)=40 d_reg_roi1(3)=40 d_reg_roi1(4)=0 d_reg_roi2(0)=260 '識別顏色ROI1 d_reg_roi2(1)=110 d_reg_roi2(2)=40 d_reg_roi2(3)=40 d_reg_roi2(4)=0 d_reg_roi3(0)=360 '識別顏色ROI1 d_reg_roi3(1)=110 d_reg_roi3(2)=40 d_reg_roi3(3)=40 d_reg_roi3(4)=0 d_learn_roi(0)=360 d_learn_roi(1)=190 d_learn_roi(2)=400 d_learn_roi(3)=230 TABLE(160) = 60 '初始化匹配定位消耗時(shí)間 d_match_time = 0 d_use_imgfile = 1 '默認(rèn)使用本地圖片 d_index = 0

  END SUB

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

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

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

  end

  'HMI界面初始化函數(shù),上電執(zhí)行一次GLOBAL SUB hmi_init() ZV_ENVINIT() DMSET table(50,96,0) ZV_SETSYSSTR("DataDir","") '設(shè)置默認(rèn)數(shù)據(jù)目錄 ZV_SETSYSINT("LineWidth",6) '設(shè)置線寬為 10 ZV_RESETCLIPSIZE(1280, 1024) '根據(jù)圖像分辨率設(shè)置圖像區(qū)域的裁剪尺寸,此處圖像分辨率為1280x1024 ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) '設(shè)置鎖存的大小 init_meas_param() '初始化測量參數(shù) ZV_IMGGENCONST(subImg,40,30,1,0,0) '初始化模板子圖像 '初始化匹配使用到的中間變量 ZVOBJECT contlist1, tsContlist1, mat_rigid1 ZVOBJECT contlist2, tsContlist2, mat_rigid2 ZV_IMGREAD(colorImg,"顏色排序/0.bmp",0) ZV_LATCH(colorImg, 0) if VR(0)=1 then '如果已經(jīng)保存過模板 ZV_READSHAPEMOD(s_mod,"顏色排序/shape.zvb") '讀取當(dāng)前路徑下的形狀模板 ?"讀取模板成功!" d_is_creModel = 1 ZV_READIMAGE(subImg,"顏色排序/subimg.bmp",0) '讀取模板子圖像 ZV_SHAPECONTOURS(s_mod, contlist1, 0) '將模板輪廓繪制在子圖像上并顯示在鎖存通道2中 ZV_GRAYTORGB(subImg, colorSubImg) ZV_IMGINFO(colorSubImg, 0) 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) ZV_LATCHCLEAR(2) ZV_LATCH(colorSubImg, 2) endif if VR(1)=1 then '如果已經(jīng)保存過模板匹配參數(shù) for i=0 to 8 d_mod_param(i)=VR(10+i) next for i=0 to 6 d_match_param(i)=VR(20+i) next for i=0 to 4 d_reg_roi1(i)=VR(30+i) d_reg_roi2(i)=VR(40+i) d_reg_roi3(i)=VR(50+i) d_match_base_rst(i)=VR(70+i) next for i=0 to 3 d_learn_roi(i)=VR(60+i) next TABLE(160)=VR(76) endif '將ROI1的中心坐標(biāo)x,y,寬,高,角度等圖像坐標(biāo)數(shù)據(jù)轉(zhuǎn)換到控件坐標(biāo)數(shù)據(jù) TABLE(231,d_reg_roi1(0),d_reg_roi1(1)) ZV_POSFROMIMG(0, 1, 231, 231) TABLE(233) = ZV_LENFROMIMG(0, d_reg_roi1(2)) TABLE(234) = ZV_LENFROMIMG(0, d_reg_roi1(3)) TABLE(235) = d_reg_roi1(4) '將ROI2的中心坐標(biāo)x,y,寬,高,角度等圖像坐標(biāo)數(shù)據(jù)轉(zhuǎn)換到控件坐標(biāo)數(shù)據(jù) TABLE(331,d_reg_roi2(0),d_reg_roi2(1)) ZV_POSFROMIMG(0, 1, 331, 331) TABLE(333) = ZV_LENFROMIMG(0, d_reg_roi2(2)) TABLE(334) = ZV_LENFROMIMG(0, d_reg_roi2(3)) TABLE(335) = d_reg_roi2(4) '將ROI3的中心坐標(biāo)x,y,寬,高,角度等圖像坐標(biāo)數(shù)據(jù)轉(zhuǎn)換到控件坐標(biāo)數(shù)據(jù) TABLE(431,d_reg_roi3(0),d_reg_roi3(1)) ZV_POSFROMIMG(0, 1, 431, 431) TABLE(433) = ZV_LENFROMIMG(0, d_reg_roi3(2)) TABLE(434) = ZV_LENFROMIMG(0, d_reg_roi3(3)) TABLE(435) = d_reg_roi3(4) ZV_LATCHCLEAR(0) '清空鎖存通道 END SUB

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

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

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

  8.點(diǎn)擊[元件]→[新建窗口],新建學(xué)習(xí)顏色樣本窗口,設(shè)計(jì)窗口布局,并關(guān)聯(lián)變量和設(shè)置軟鍵盤窗口號。

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

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

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

 'HMI界面按下訓(xùn)練樣本按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_OpenLearning()

  ZV_LATCHCLEAR(0) ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(13, 1), HMI_CONTROLSIZEY(13, 1)) '設(shè)置創(chuàng)建模板窗口鎖存通道0的鎖存大小 ZV_LATCH(colorImg,0) '將訓(xùn)練學(xué)習(xí)ROI的中心坐標(biāo)x,y,寬,高,角度等圖像坐標(biāo)數(shù)據(jù)轉(zhuǎn)換到控件坐標(biāo)數(shù)據(jù) TABLE(225,d_learn_roi(0),d_learn_roi(1),d_learn_roi(2),d_learn_roi(3)) ZV_POSFROMIMG(0,2, 225, 225) HMI_SHOWWINDOW(13)

  END SUB

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

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

  '定義訓(xùn)練顏色樣本界面按下學(xué)習(xí)樣本按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_Learning()

  ZVOBJECT region ZV_REGENRECT(region,d_learn_roi(0),d_learn_roi(1),d_learn_roi(2)-d_learn_roi(0)+1,d_learn_roi(3)-d_learn_roi(1)+1) '生成矩形區(qū)域 if (STRCOMP(d_sample_name, "")=0) then ?"請先輸入需要學(xué)習(xí)的顏色樣本名稱!" return else ZV_CLRGENMODELRE(colorImg,region,ColorMod,d_sample_name,0)'在 RGB 顏色空間生成顏色模型 ZV_LISTINSERT(ColorMod,Clrmod_list,-1) '將顏色模型插入到列表 ?"學(xué)習(xí)"d_sample_name"樣本成功!" endif

  END SUB

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

  11.在“main.bas”文件中添加學(xué)習(xí)顏色樣本界面【清空樣本】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

  '定義訓(xùn)練顏色樣本界面按下清空樣本按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_Clear() if(ZV_ISEMPTY(Clrmod_list)=0) then '如果訓(xùn)練樣本庫不為空 ZV_CLEAR(Clrmod_list) ?"已清空樣本列表!" endif

  END SUB

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

  12.在“main.bas”文件中添加學(xué)習(xí)顏色樣本界面【確定】按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。

  '定義訓(xùn)練顏色樣本界面按下確定按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_Confirm()

  HMI_CLOSEWINDOW(13) ZV_LATCHCLEAR(0) ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) ZV_LATCH(colorImg,0)

  END SUB

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

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

  '根據(jù)鼠標(biāo)操作更新訓(xùn)練顏色樣本的有效區(qū)域GLOBAL SUB update_learnroi()

  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)擊位置對應(yīng)的擊中區(qū)域編號 hit_pos = ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 225, -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ū)域編號調(diào)整定位器區(qū)域位置 ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 225, 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ū)域編號調(diào)整定位器區(qū)域位置 ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 225, 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, 225, 15) '將圖像坐標(biāo)的數(shù)據(jù)賦值給ROI變量中 d_learn_roi(0) = TABLE(15) d_learn_roi(1) = TABLE(16) d_learn_roi(2) = TABLE(17) d_learn_roi(3) = TABLE(18) SET_REDRAW '重新繪制全部區(qū)域 endif END SUB

  '根據(jù)更新的鼠標(biāo)位置坐標(biāo)繪制訓(xùn)練顏色樣本區(qū)域GLOBAL SUB draw_learnroi() '根據(jù)控件坐標(biāo)數(shù)據(jù)繪制矩形 DRAWRECT(TABLE(225), TABLE(226), TABLE(227), TABLE(228)) local cx,cy '定義局部變量 cx = (TABLE(225) + TABLE(227)) / 2 '計(jì)算矩形的中心坐標(biāo)x、y cy = (TABLE(226) + TABLE(228)) / 2 DRAWLINE(cx-5, cy, cx+5, cy) '繪制中心十字線 DRAWLINE(cx, cy-5, cx, cy+5) END SUB

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

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

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

  15.在“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) '彈出窗口號為11的創(chuàng)建模板窗口 END SUB

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

  16.在“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)擊位置對應(yīng)的擊中區(qū)域編號 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ū)域編號調(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ū)域編號調(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

  '根據(jù)更新的鼠標(biāo)位置坐標(biāo)繪制定位器roiGLOBAL SUB draw_locator()

  '根據(jù)控件坐標(biāo)數(shù)據(jù)繪制矩形 DRAWRECT(TABLE(25), TABLE(26), TABLE(27), TABLE(28)) local cx,cy '定義局部變量 cx = (TABLE(25) + TABLE(27)) / 2 '計(jì)算矩形的中心坐標(biāo)x、y cy = (TABLE(26) + TABLE(28)) / 2 DRAWLINE(cx-5, cy, cx+5, cy) '繪制中心十字線 DRAWLINE(cx, cy-5, cx, cy+5) END SUB

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

  17.在“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

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

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

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

  19.在“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

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

  20.在“draw.bas”文件中添加橡皮擦更新繪制函數(shù),并在編輯模板界面的自定義控件上關(guān)聯(lián)刷新函數(shù)名和繪圖函數(shù)名。

  '根據(jù)鼠標(biāo)操作更新橡皮擦擦除/恢復(fù)區(qū)域的位置GLOBAL SUB update_eraser() DIM c_size_eraser '橡皮擦在控件上對應(yīng)的尺寸 DIM eraser_pos_x,eraser_pos_y d_mouse_s = MOUSE_STATE(11) '鼠標(biāo)處于按下狀態(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為邊長的正方形橡皮擦區(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à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

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

  21.在“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)'對輪廓或輪廓序列進(jìn)行仿射變換 ZV_CONTLIST(colorSubImg, tsContlist1, ZV_COLOR(0, 255, 0), 0)'在colorSubImg圖像上繪制綠色的輪廓序列 ZV_LATCHCLEAR(2) '清空鎖存通道2 ZV_LATCH(colorSubImg, 2) '顯示圖像結(jié)果到鎖存通道2中 btn_loc_test() d_match_base_rst(0) = d_match_rst(0) d_match_base_rst(1) = d_match_rst(1) d_match_base_rst(2) = d_match_rst(2) d_match_base_rst(3) = d_match_rst(3) d_match_base_rst(4) = d_match_rst(4) END SUB

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

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

  '編輯模板界面按下保存模板按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_loc_savModel() if d_is_creModel = 1 then ZV_WRITESHAPEMOD(s_mod,"顏色排序/shape.zvb") ZV_WRITEIMAGE(subImg,"顏色排序/subimg.bmp",0) VR(0)=1 ?"保存模板成功!" else ?"請先創(chuàng)建模板!" return endifEND SUB

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

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

  '編輯模板界面按下讀取模板按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_loc_redModel() if VR(0)=1 then ZV_READSHAPEMOD(s_mod,"顏色排序/shape.zvb") ?"讀取模板成功!" else ?"請先保存模板!" return endifEND SUB

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

  24.在“draw.bas” 文件中添加編輯模板界面【確定】按鈕響應(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(colorImg, 0) '顯示圖像在鎖存通道0上 HMI_CLOSEWINDOW(11) '關(guān)閉創(chuàng)建模板窗口 END SUB

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

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

  '創(chuàng)建模板界面按下測試按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_loc_test() if (d_is_creModel = 0) then '如果創(chuàng)建模板標(biāo)志=0 ?"未創(chuàng)建模板!" '提示未創(chuàng)建模板毛病返回子函數(shù)不往下執(zhí)行 return endif '開始匹配 TICKS = 0 '開始計(jì)時(shí) ZVOBJECT match_rst, sImg, showImg '對圖像進(jìn)行3*3高斯平滑處理,處理后的圖像輸出到sImg變量中 ZV_GAUSSBLUR(grabImg, sImg, 3) '根據(jù)模板子圖像和搜索參數(shù)進(jìn)行目標(biāo)匹配,并將匹配結(jié)果存放到match_rst矩陣中 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) '獲取矩陣結(jié)果信息。并存放到起始地址為0的table數(shù)組中 ' ZV_GRAYTORGB(sImg, showImg) '灰度圖轉(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ù)存放到起始地址為3的table數(shù)組中,table最大長度5 ZV_MATGETROW(match_rst, rowr, 5, 3) if(rowr = 0) then '取第一行的匹配結(jié)果信息即第一個(gè)匹配目標(biāo)的結(jié)果 d_match_rst(0) = TABLE(3) '將匹配結(jié)果賦值給定義的結(jié)果變量,顯示到界面 d_match_rst(1) = TABLE(4) d_match_rst(2) = TABLE(5) d_match_rst(3) = TABLE(6) d_match_rst(4) = TABLE(7) '計(jì)算剛性變換矩陣 ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(4), TABLE(5), TABLE(6)) '對輪廓或輪廓序列進(jìn)行仿射變換 ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1) '在colorSubImg圖像上繪制綠色的輪廓序列 ZV_CONTLIST(colorImg, tsContlist1, ZV_COLOR(0, 255, 0), 0) endif 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

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

  26.在“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(colorImg, 0) '顯示圖像在鎖存通道0上 HMI_CLOSEWINDOW(11) '關(guān)閉創(chuàng)建模板窗口 END SUB

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

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

  '主界面按下測試按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_test() TICKS=0 DMSET d_color_rst1(0,4,0) DMSET d_color_rst2(0,4,0) DMSET d_color_rst3(0,4,0) d_rst_status=0 ZVOBJECT regionMask1,regionMask2,regionMask3 '先進(jìn)行匹配定位,補(bǔ)正ROI位置 if (d_is_creModel = 0) then '如果創(chuàng)建模板標(biāo)志=0 ?"未創(chuàng)建模板!" '提示未創(chuàng)建模板毛病返回子函數(shù)不往下執(zhí)行 return endif ZVOBJECT match_rst, sImg, showImg '對圖像進(jìn)行3*3高斯平滑處理,處理后的圖像輸出到sImg變量中 ZV_GAUSSBLUR(grabImg, sImg, 3) '根據(jù)模板子圖像和搜索參數(shù)進(jìn)行目標(biāo)匹配,并將匹配結(jié)果存放到match_rst矩陣中 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) '獲取矩陣結(jié)果信息。并存放到起始地址為0的table數(shù)組中 ZV_IMGCOPY(colorImg,showImg) if TABLE(0) > 0 then '如果匹配到目標(biāo) local rowr for rowr = 0 to TABLE(0)-1 '獲取match_rst矩陣中第rowr行的數(shù)據(jù)存放到起始地址為3的table數(shù)組中,table最大長度5 ZV_MATGETROW(match_rst, rowr, 5, 3)

  if(rowr = 0) then '取第一行的匹配結(jié)果信息即第一個(gè)匹配目標(biāo)的結(jié)果 d_match_rst(0) = TABLE(3) '將匹配結(jié)果賦值給定義的結(jié)果變量,顯示到界面 d_match_rst(1) = TABLE(4) d_match_rst(2) = TABLE(5) d_match_rst(3) = TABLE(6) d_match_rst(4) = TABLE(7) '計(jì)算剛性變換矩陣 ZV_GETRIGIDVECTOR(mat_rigid1, 0, 0, 0, TABLE(4), TABLE(5), TABLE(6)) '對輪廓或輪廓序列進(jìn)行仿射變換 ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1) '在colorSubImg圖像上繪制綠色的輪廓序列 ZV_CONTLIST(showImg, tsContlist1, ZV_COLOR(0, 255, 0), 0) endif 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 '計(jì)算變換矩陣 ZV_GETRIGIDVECTOR(mat_rigid2, d_match_base_rst(1), d_match_base_rst(2), d_match_base_rst(3),TABLE(4),TABLE(5), d_match_rst(3)) '初始化顏色識別區(qū)域 ZV_REGENRECT2(regionMask1, d_reg_roi1(0), d_reg_roi1(1), d_reg_roi1(2), d_reg_roi1(3), d_reg_roi1(4)) ZV_REGENRECT2(regionMask2, d_reg_roi2(0), d_reg_roi2(1), d_reg_roi2(2), d_reg_roi2(3), d_reg_roi2(4)) ZV_REGENRECT2(regionMask3, d_reg_roi3(0), d_reg_roi3(1), d_reg_roi3(2), d_reg_roi3(3), d_reg_roi3(4)) '變換識別區(qū)域 ZV_REAFFINE(regionMask1,mat_rigid2,regionMask1) ZV_REAFFINE(regionMask2,mat_rigid2,regionMask2) ZV_REAFFINE(regionMask3,mat_rigid2,regionMask3) if(ZV_ISEMPTY(Clrmod_list)=1) then '如果訓(xùn)練樣本庫為空 ?"顏色模型庫為空!" return else DMSET table(50,96,0) ZV_CLRMODELCLASSIFY(Clrmod_list,colorImg,regionMask1,32,50,150,table(160))'顏色識別 ZV_CLRMODELCLASSIFY(Clrmod_list,colorImg,regionMask2,32,82,151,table(160))'顏色識別 ZV_CLRMODELCLASSIFY(Clrmod_list,colorImg,regionMask3,32,114,152,table(160))'顏色識別 DMCPY d_color_rst1(0), TABLE(50), 32'將識別的顏色結(jié)果復(fù)制到數(shù)組變量中 DMCPY d_color_rst2(0), TABLE(82), 32 DMCPY d_color_rst3(0), TABLE(114), 32 if STRCOMP(d_color_rst1, "red")=0 AND STRCOMP(d_color_rst2, "black")=0 AND STRCOMP(d_color_rst3, "yellow")=0 then d_rst_status=1 endif ZV_REAREACENTER(regionMask1,170)'計(jì)算識別區(qū)域的面積和重心位置XY ZV_REAREACENTER(regionMask2,173) ZV_REAREACENTER(regionMask3,176) ZV_TEXT(showImg,d_color_rst1,TABLE(171),TABLE(172),50,ZV_COLOR(0,255,0))'顯示識別樣本名稱 ZV_TEXT(showImg,d_color_rst2,TABLE(174),TABLE(175),50,ZV_COLOR(0,255,0)) ZV_TEXT(showImg,d_color_rst3,TABLE(177),TABLE(178),50,ZV_COLOR(0,255,0))

  endif ZV_LATCH(showImg,0) d_detect_time=abs(TICKS) END SUB

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

  28.在“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)行,請勿重復(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 endifEND 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,1) ZV_IMGREAD(colorImg,File_Name,0) d_index=d_index+1 else '如果相機(jī)數(shù)量為0,提示先掃描相機(jī),并退出子函數(shù)不往下執(zhí)行 if cam_num = 0 then ?"請先掃描相機(jī)!" return endif CAM_SETPARAM("TriggerSoftware", 0) '發(fā)送觸發(fā)指令 CAM_GET(grabImg, 0) endif

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

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

  29.在“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

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

  30.在“main.bas”文件添加主界面按下【保存參數(shù)】按鈕時(shí)響應(yīng)的函數(shù),并關(guān)聯(lián)動(dòng)作函數(shù)。

  '主界面按下保存匹配參數(shù)按鈕時(shí)響應(yīng)的函數(shù)GLOBAL SUB btn_loc_saveParam()

  VR(1)=1 '匹配參數(shù)保存標(biāo)志置1 for i=0 to 8 VR(10+i)=d_mod_param(i) next for i=0 to 6 VR(20+i)=d_match_param(i) next for i=0 to 4 VR(30+i)=d_reg_roi1(i) VR(40+i)=d_reg_roi2(i) VR(50+i)=d_reg_roi3(i) VR(70+i)=d_match_base_rst(i) next for i=0 to 3 VR(60+i)=d_learn_roi(i) next VR(76)=TABLE(160) ?"已保存檢測參數(shù)!" END SUB

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

  31.在“draw.bas”文件中ROI區(qū)域更新繪制函數(shù),并在主界面的自定義控件上關(guān)聯(lián)刷新函數(shù)名和繪圖函數(shù)名。

  '根據(jù)鼠標(biāo)操作更新ROI位置區(qū)域函數(shù)GLOBAL SUB update_roi()

  if d_select_regROI=1 then SET_REDRAW if mouse_scan(11) = 1 then '掃描鼠標(biāo)按下操作 '只有按下時(shí)可以改變擊中位置,獲取調(diào)整區(qū)域標(biāo)志 hit_pos = ZV_HMIADJRECT2(table(11), table(12), 231, -1) is_redraw = 1 '將繪圖標(biāo)志置1 endif if mouse_scan(11) = -1 then '掃描鼠標(biāo)松開操作 '調(diào)整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 231, hit_pos) is_redraw = 1 '將繪圖標(biāo)志置1 endif if (MOUSE_state(11)) then '調(diào)整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 231, hit_pos) is_redraw = 1 '將繪圖標(biāo)志置1 endif if (1 = is_redraw) then '繪制 is_redraw = 0 '將繪圖標(biāo)志置0 ZV_POSTOIMG(0, 1, 231, 241)'將ROI的控件坐標(biāo)數(shù)據(jù)轉(zhuǎn)到圖像坐標(biāo)數(shù)據(jù) d_reg_roi1(0) = TABLE(241)'將ROI的圖像坐標(biāo)數(shù)據(jù)賦值給定義的變量 d_reg_roi1(1) = TABLE(242) '將ROI在控件坐標(biāo)系下的寬度、高度轉(zhuǎn)到像素寬度,并賦值給定義的變量 d_reg_roi1(2) = ZV_LENTOIMG(0, TABLE(233)) d_reg_roi1(3) = ZV_LENTOIMG(0, TABLE(234)) d_reg_roi1(4) = TABLE(235) SET_REDRAW '全局繪制 endif endif if d_select_regROI=2 then SET_REDRAW if mouse_scan(11) = 1 then '掃描鼠標(biāo)按下操作 '只有按下時(shí)可以改變擊中位置,獲取調(diào)整區(qū)域標(biāo)志 hit_pos = ZV_HMIADJRECT2(table(11), table(12), 331, -1) is_redraw = 1 '將繪圖標(biāo)志置1 endif if mouse_scan(11) = -1 then '掃描鼠標(biāo)松開操作 '調(diào)整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 331, hit_pos) is_redraw = 1 '將繪圖標(biāo)志置1 endif if (MOUSE_state(11)) then '調(diào)整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 331, hit_pos) is_redraw = 1 '將繪圖標(biāo)志置1 endif if (1 = is_redraw) then '繪制 is_redraw = 0 '將繪圖標(biāo)志置0 ZV_POSTOIMG(0, 1, 331, 241)'將ROI的控件坐標(biāo)數(shù)據(jù)轉(zhuǎn)到圖像坐標(biāo)數(shù)據(jù) d_reg_roi2(0) = TABLE(241)'將ROI的圖像坐標(biāo)數(shù)據(jù)賦值給定義的變量 d_reg_roi2(1) = TABLE(242) '將ROI在控件坐標(biāo)系下的寬度、高度轉(zhuǎn)到像素寬度,并賦值給定義的變量 d_reg_roi2(2) = ZV_LENTOIMG(0, TABLE(233)) d_reg_roi2(3) = ZV_LENTOIMG(0, TABLE(234)) d_reg_roi2(4) = TABLE(235) SET_REDRAW '全局繪制 endif endif if d_select_regROI=3 then SET_REDRAW if mouse_scan(11) = 1 then '掃描鼠標(biāo)按下操作 '只有按下時(shí)可以改變擊中位置,獲取調(diào)整區(qū)域標(biāo)志 hit_pos = ZV_HMIADJRECT2(table(11), table(12), 431, -1) is_redraw = 1 '將繪圖標(biāo)志置1 endif if mouse_scan(11) = -1 then '掃描鼠標(biāo)松開操作 '調(diào)整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 431, hit_pos) is_redraw = 1 '將繪圖標(biāo)志置1 endif if (MOUSE_state(11)) then '調(diào)整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 431, hit_pos) is_redraw = 1 '將繪圖標(biāo)志置1 endif if (1 = is_redraw) then '繪制 is_redraw = 0 '將繪圖標(biāo)志置0 ZV_POSTOIMG(0, 1, 431, 241)'將ROI的控件坐標(biāo)數(shù)據(jù)轉(zhuǎn)到圖像坐標(biāo)數(shù)據(jù) d_reg_roi3(0) = TABLE(241)'將ROI的圖像坐標(biāo)數(shù)據(jù)賦值給定義的變量 d_reg_roi3(1) = TABLE(242) '將ROI在控件坐標(biāo)系下的寬度、高度轉(zhuǎn)到像素寬度,并賦值給定義的變量 d_reg_roi3(2) = ZV_LENTOIMG(0, TABLE(233)) d_reg_roi3(3) = ZV_LENTOIMG(0, TABLE(234)) d_reg_roi3(4) = TABLE(235) SET_REDRAW '全局繪制 endif endif SET_REDRAW '全局繪制 END SUB

  'ROI區(qū)域更新后實(shí)時(shí)繪制ROI區(qū)域GLOBAL SUB draw_roi() SET_COLOR(C_GREEN) '設(shè)置繪制時(shí)畫筆的顏色為藍(lán)色 if d_select_regROI=1 then ZV_HMIRECT2(231, 70) '將旋轉(zhuǎn)矩形roi分解為HMI支持的繪圖圖元并添加控制參數(shù),便于HMI繪圖顯示 DRAWLINE(TABLE(70), TABLE(71), TABLE(72), TABLE(73)) '繪制外矩形 DRAWLINE(TABLE(72), TABLE(73), TABLE(74), TABLE(75)) DRAWLINE(TABLE(74), TABLE(75), TABLE(76), TABLE(77)) DRAWLINE(TABLE(76), TABLE(77), TABLE(70), TABLE(71)) '繪制矩形中心到右邊線中心的箭頭 DRAWLINE(TABLE(78), TABLE(79), TABLE(80), TABLE(81)) DRAWLINE(TABLE(82), TABLE(83), TABLE(80), TABLE(81)) DRAWLINE(TABLE(84), TABLE(85), TABLE(80), TABLE(81)) endif if d_select_regROI=2 then ZV_HMIRECT2(331, 70) '將旋轉(zhuǎn)矩形roi分解為HMI支持的繪圖圖元并添加控制參數(shù),便于HMI繪圖顯示 DRAWLINE(TABLE(70), TABLE(71), TABLE(72), TABLE(73)) '繪制外矩形 DRAWLINE(TABLE(72), TABLE(73), TABLE(74), TABLE(75)) DRAWLINE(TABLE(74), TABLE(75), TABLE(76), TABLE(77)) DRAWLINE(TABLE(76), TABLE(77), TABLE(70), TABLE(71)) '繪制矩形中心到右邊線中心的箭頭 DRAWLINE(TABLE(78), TABLE(79), TABLE(80), TABLE(81)) DRAWLINE(TABLE(82), TABLE(83), TABLE(80), TABLE(81)) DRAWLINE(TABLE(84), TABLE(85), TABLE(80), TABLE(81)) endif if d_select_regROI=3 then ZV_HMIRECT2(431, 70) '將旋轉(zhuǎn)矩形roi分解為HMI支持的繪圖圖元并添加控制參數(shù),便于HMI繪圖顯示 DRAWLINE(TABLE(70), TABLE(71), TABLE(72), TABLE(73)) '繪制外矩形 DRAWLINE(TABLE(72), TABLE(73), TABLE(74), TABLE(75)) DRAWLINE(TABLE(74), TABLE(75), TABLE(76), TABLE(77)) DRAWLINE(TABLE(76), TABLE(77), TABLE(70), TABLE(71)) '繪制矩形中心到右邊線中心的箭頭 DRAWLINE(TABLE(78), TABLE(79), TABLE(80), TABLE(81)) DRAWLINE(TABLE(82), TABLE(83), TABLE(80), TABLE(81)) DRAWLINE(TABLE(84), TABLE(85), TABLE(80), TABLE(81)) endif END SUB

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

  三操作演示梯形圖介紹

  (一)操作步驟

  查看運(yùn)行效果:將項(xiàng)目下載到仿真器中→使用本地圖片→單次采集→訓(xùn)練樣本,依次學(xué)習(xí)“red”“black”“yellow”的顏色模板→學(xué)習(xí)模板,作為識別顏色區(qū)域的補(bǔ)正源→依次拖拽3個(gè)顏色識別ROI區(qū)域→點(diǎn)擊測試查看效果圖→點(diǎn)擊連續(xù)運(yùn)行,查看運(yùn)行效果→結(jié)束。

  (二)效果演示

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

  本次,正運(yùn)動(dòng)技術(shù)機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)應(yīng)用例程(九)線束顏色排序識別,就分享到這里。

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


標(biāo)簽: 機(jī)器視覺運(yùn)動(dòng)控制

點(diǎn)贊

分享到:

上一篇:【易格斯】10個(gè)設(shè)計(jì)技巧,延...

下一篇:【正運(yùn)動(dòng)】ZBasic結(jié)合Qt實(shí)現(xiàn)...

中國傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來源:中國傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國傳動(dòng)網(wǎng)(www.wangxinlc.cn)獨(dú)家所有。如需轉(zhuǎn)載請與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來源“中國傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來源的稿件,均來自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請保留稿件來源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見反饋|sitemap

傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購咨詢媒體合作

Chuandong.com Copyright ?2005 - 2025 ,All Rights Reserved 深圳市奧美大唐廣告有限公司 版權(quán)所有
粵ICP備 14004826號 | 營業(yè)執(zhí)照證書 | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號