時間:2021-07-16 14:06:39來源:深圳市正運動技術有限公司
線材在生產制造過程中需要按規范的顏色來進行排序,以往用傳統人工去檢測易出現漏檢、錯檢的情況,通過正運動技術機器視覺運動控制一體機線束顏色排序識別系統,可自動識別線束顏色及排列順序是否有誤或插錯空位等情況。
它能夠24小時不停止運行,工作效率高,提高產能。以及它的檢測結果和人工檢測相比一致性較高、可靠性強。
上期課程,我們講述了機器視覺方案中零件分揀的應用例程,本期課程我們將和大家一起分享如何實現線束顏色排序識別的功能。
教學視頻
一檢測原理梯形圖介紹
(一)檢測需求
識別出線束的線材顏色排序是否規范,并顯示當前的線材識別的顏色和檢測結果。
(二)軟件算法
先用彩色相機拍攝圖片后依次截取線束上不同顏色區域進行顏色樣本學習,將顏色樣本結果存放到列表中。
其次將RGB圖像轉為灰度圖后用形狀匹配工具學習模板,將模板位置結果作為基準位置。
當前匹配到的目標結果和基準位置結果進行計算輸出位置變換矩陣,3個顏色識別的ROI區域和創建模板時設置的ROI區域位置使用同一個變換矩陣進行仿射變換,即使用形狀匹配作為識別顏色區域的補正源。
最后將識別的線束顏色的顏色排序為“red”“black”“yellow”才會輸出“OK”的狀態結果,否則輸出“NG”的狀態結果。
二軟件實現梯形圖介紹
(一)軟件實現
1.打開ZDevelop軟件:新建項目→新建“HMI”文件→新建“main.bas”文件,用于編寫界面響應函數→新建“global_variable.bas”文件用于存放全局變量并開啟HMI自動運行任務→新建“InitLocator.bas”文件用于初始化測量參數→新建“camera.bas”文件用于實現相機采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項目。
2.設計HMI界面。
3.在“global_variable.bas”文件中定義全局變量,定義完成后運行“Hmi.hmi”文件。
'''''全局變量大部分使用數組結構'''''''注:basic編程中很多函數會以TABLE(系統的數據結構)做為參數''table 說明 table 說明''0~1 獲取到的圖像寬高 15~18 定位器roi圖像坐標數據''0~1 匹配結果矩陣的行列數 25~28 定位器roi控件和圖像數據''3~7 匹配結果 30~31 橡皮擦roi坐標''11~12 鼠標操作時獲取的坐標 50~81 線1識別顏色結果''82~113 線2識別顏色結果 114~145 線3識別顏色結果''160 識別分數 150 線1識別ID''151 線2識別ID 152 線3識別ID''170~172 線1ROI區域數據 173~175 線2ROI區域數據''176~178 線3ROI區域數據 ''225~228 訓練樣本ROI控件坐標數據 231~235 線1ROI控件坐標數據''331~335 線2ROI控件坐標數據 431~435 線3ROI控件坐標數據''VR(0) 模板保存標志,1-已保存 VR(1) 參數保存標志,1-已保存''VR(10)~(18)模板參數斷電保存地址 VR(20)~(26)匹配參數斷電保存地址''VR(30)~(34)線1ROI坐標數據 VR(40)~(44)線2ROI坐標數據''VR(50)~(54)線3ROI坐標數據 VR(60)~(63)訓練學習ROI坐標數據''VR(70)~(74)匹配基準數據 VR(76) 識別分數'***********定義程序任務相關變量**********************
'主任務狀態'0 - 未初始化'1 - 停止'2 - 運行中'3 - 正在停止GLOBAL DIM main_task_statemain_task_state = 1
'運行任務開關GLOBAL DIM run_switchrun_switch = 0
'采集任務開關'0 - 停止采集'1 - 請求采集GLOBAL DIM grab_switchgrab_switch = 0
'定位檢測主任務id - 10GLOBAL DIM main_task_idmain_task_id = 10
'相機連續采集線程id - 7GLOBAL DIM grab_task_idgrab_task_id = 7
'***********結束定義程序任務相關變量******************
'***********定義相機采集相關變量**********************
'相機種類,此處使用海康相機-"mvision"GLOBAL DIM CAMERA_TYPE(100)'CAMERA_TYPE = "mindvision;basler;mvision;huaray;zmotion"CAMERA_TYPE = "mvision"
'相機個數GLOBAL cam_numcam_num = 0
'相機模式,-1 連續采集,0-軟件觸發采集GLOBAL cam_modecam_mode = 0
'***********結束定義相機采集相關變量******************
'定義返回主界面標志,1-已返回,0-未返回GLOBAL DIM d_is_rtn_loc d_is_rtn_loc = 1
'***********定義模板相關變量*************************'定義鼠標按下標志位,1-已按下,0-未按下GLOBAL DIM is_set_roi_m_downis_set_roi_m_down = 0
'定義創建模板標志位,1-已創建模板,0-未創建模板GLOBAL DIM d_is_creModeld_is_creModel = 0
'學習模板參數,starAngle、endAngle、minScale、maxScale、thresh、numlevel、reduce、angleStep、scaleStepGLOBAL DIM d_mod_param(9)
'***********結束定義模板相關變量**********************
'***********定義編輯模板相關變量*********************
'定義編輯模板標志,0-表示不編輯模板,1-表示編輯模板GLOBAL DIM d_edit_md_edit_m = 0
'定義使用橡皮擦功能標志,0-表示恢復擦除的區域,1-表示擦除區域GLOBAL DIM d_isMask_md_isMask_m = 1
'定義橡皮擦的roi參數,依次是矩形左上角和右下角圖像坐標x、y、x、yGLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
'定義正方形橡皮擦尺寸寬度GLOBAL DIM d_eraser_sized_eraser_size = 5
'定義界面控件上橡皮擦的矩形區域 GLOBAL DIM c_rect(4) '定義鼠標狀態標志,0-表示鼠標處于松開狀態,1-表示鼠標處于按下狀態GLOBAL DIM d_mouse_sd_mouse_s = 0
'***********結束定義編輯模板相關變量******************
'***********定義匹配檢測相關變量*********************
'匹配檢測參數,minScore、matchNum、minDist、thresh、accuracy、speed、polorGLOBAL DIM d_match_param(7)
'定義學習模板的roi參數和橡皮擦的roi參數,依次是矩形左上角和右下角圖像坐標x、y、x、yGLOBAL DIM d_locator_roi(4),d_eraser_roi(4)
'匹配結果,score、x、y、angle、scale, 目前對于多目標匹配也只存第一個目標GLOBAL DIM d_match_rst(5)
GLOBAL DIM d_match_time '定義匹配定位消耗的時間變量d_match_time = 0
'***********結束定義匹配檢測相關變量******************
'定義程序執行過程中緩存中間圖片和結果圖片的變量GLOBAL ZVOBJECT grabImg,colorImgGLOBAL ZVOBJECT subImg,copy_subImg,colorSubImg, s_modGLOBAL ZVOBJECT modRe
'定義程序執行過程中顏色樣本模板變量和顏色模板列表變量GLOBAL ZVOBJECT grabImg,ColorMod,Clrmod_list
'設置創建模板的基準坐標GLOBAL DIM d_match_base_rst(5)
'定義檢測識別顏色的ROI區域GLOBAL DIM d_reg_roi1(5),d_reg_roi2(5),d_reg_roi3(5)
'定義訓練學習顏色樣本的ROI區域GLOBAL DIM d_learn_roi(4)
'定義選擇顏色識別ROI的類型GLOBAL DIM d_select_regROId_select_regROI=0
'定義排線顏色順序檢測結果狀態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)
'定義輸入需要進行學習的顏色樣本名稱GLOBAL DIM d_sample_name(128)d_sample_name=""
'定義檢測到的顏色結果GLOBAL DIM d_color_rst1(32),d_color_rst2(32),d_color_rst3(32)
GLOBAL DIM d_detect_time '定義消耗的時間變量d_detect_time = 0
'***********定義讀取本地文件功能相關變量**************''注意,該功能只在使用仿真器時有效'定義是否使用本地圖片標志GLOBAL DIM d_use_imgfile
'定義本地圖片索引GLOBAL DIM d_index
'定義讀取圖片的路徑GLOBAL DIM File_Name(100)
'***********結束定義讀取本地文件功能相關變量**********
'初始化全局變量完成后開啟HMI文件RUN"Hmi1.hmi",1
4.在“InitLocator.bas”文件中初始化測量參數。
·
end
GLOBAL SUB init_meas_param() '初始化測量參數 '初始化定位器roi參數 d_locator_roi(0) = 240 '左上角x d_locator_roi(1) = 180 '左上角y d_locator_roi(2) = 400 '右下角x d_locator_roi(3) = 300 '右下角y '初始化模板參數 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 '默認金字塔層數 d_mod_param(6) = 0 '默認約簡特征點 d_mod_param(7) = 0 '默認角度步長 d_mod_param(8) = 0 '默認縮放步長 '初始化匹配測量參數 d_match_param(0) = 50 '最小分數 d_match_param(1) = 1 '匹配個數 d_match_param(2) = 10 '默認最小間距 d_match_param(3) = 40 '最小閾值 d_match_param(4) = 0 '精度 d_match_param(5) = 9 '速度 d_match_param(6) = 0 '極性 '初始化匹配定位結果 d_match_rst(0) = 0 '分數 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 '初始化匹配定位消耗時間 d_match_time = 0 d_use_imgfile = 1 '默認使用本地圖片 d_index = 0
END SUB
5.關聯HMI界面控件變量。
6.在“main.bas”文件中添加HMI界面初始化函數并在Hmi系統設置中關聯初始化函數。
end
'HMI界面初始化函數,上電執行一次GLOBAL SUB hmi_init() ZV_ENVINIT() DMSET table(50,96,0) ZV_SETSYSSTR("DataDir","") '設置默認數據目錄 ZV_SETSYSINT("LineWidth",6) '設置線寬為 10 ZV_RESETCLIPSIZE(1280, 1024) '根據圖像分辨率設置圖像區域的裁剪尺寸,此處圖像分辨率為1280x1024 ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) '設置鎖存的大小 init_meas_param() '初始化測量參數 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 '如果已經保存過模板 ZV_READSHAPEMOD(s_mod,"顏色排序/shape.zvb") '讀取當前路徑下的形狀模板 ?"讀取模板成功!" 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 '如果已經保存過模板匹配參數 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的中心坐標x,y,寬,高,角度等圖像坐標數據轉換到控件坐標數據 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的中心坐標x,y,寬,高,角度等圖像坐標數據轉換到控件坐標數據 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的中心坐標x,y,寬,高,角度等圖像坐標數據轉換到控件坐標數據 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
7.在“camera.bas”文件中添加HMI界面中采集相關按鈕響應的函數并關聯動作函數。(說明:具體實現函數前面兩篇課程內容已經有操作演示,此處不做贅述。)
8.點擊[元件]→[新建窗口],新建學習顏色樣本窗口,設計窗口布局,并關聯變量和設置軟鍵盤窗口號。
9.在“main.bas”文件中添加主界面【訓練樣本】按鈕響應的函數并關聯動作函數。
'HMI界面按下訓練樣本按鈕時響應的函數GLOBAL SUB btn_OpenLearning()
ZV_LATCHCLEAR(0) ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(13, 1), HMI_CONTROLSIZEY(13, 1)) '設置創建模板窗口鎖存通道0的鎖存大小 ZV_LATCH(colorImg,0) '將訓練學習ROI的中心坐標x,y,寬,高,角度等圖像坐標數據轉換到控件坐標數據 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
10.在“main.bas”文件中添加學習顏色樣本界面【學習樣本】按鈕響應的函數并關聯動作函數。
'定義訓練顏色樣本界面按下學習樣本按鈕時響應的函數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) '生成矩形區域 if (STRCOMP(d_sample_name, "")=0) then ?"請先輸入需要學習的顏色樣本名稱!" return else ZV_CLRGENMODELRE(colorImg,region,ColorMod,d_sample_name,0)'在 RGB 顏色空間生成顏色模型 ZV_LISTINSERT(ColorMod,Clrmod_list,-1) '將顏色模型插入到列表 ?"學習"d_sample_name"樣本成功!" endif
END SUB
11.在“main.bas”文件中添加學習顏色樣本界面【清空樣本】按鈕響應的函數并關聯動作函數。
'定義訓練顏色樣本界面按下清空樣本按鈕時響應的函數GLOBAL SUB btn_Clear() if(ZV_ISEMPTY(Clrmod_list)=0) then '如果訓練樣本庫不為空 ZV_CLEAR(Clrmod_list) ?"已清空樣本列表!" endif
END SUB
12.在“main.bas”文件中添加學習顏色樣本界面【確定】按鈕響應的函數并關聯動作函數。
'定義訓練顏色樣本界面按下確定按鈕時響應的函數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
13.在“draw.bas”文件中添加學習樣本區域更新繪制函數,并在學習顏色樣本界面的自定義控件上關聯刷新函數名和繪圖函數名。
'根據鼠標操作更新訓練顏色樣本的有效區域GLOBAL SUB update_learnroi()
if mouse_scan(11) = 1 then '掃描鼠標按下操作 is_set_roi_m_down = 1 '鼠標按下標志置1 sr_mpos_x = table(11) '將當前鼠標按下位置的坐標賦值給變量 sr_mpos_y = table(12) '只有按下時可以改變擊中位置,獲取鼠標點擊位置對應的擊中區域編號 hit_pos = ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 225, -1) is_redraw = 1 '繪圖標志置1 endif if mouse_scan(11) = -1 then '掃描鼠標松開操作 is_set_roi_m_down = 0 '鼠標按下標志置0 sr_mpos_x = table(11) '將當前鼠標松開位置的坐標賦值給變量 sr_mpos_y = table(12) '根據區域編號調整定位器區域位置 ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 225, hit_pos) is_redraw = 1 '繪圖標志置1 endif '如果鼠標按下時 if (is_set_roi_m_down and MOUSE_state(11)) then sr_mpos_x = table(11) '將當前鼠標按下位置的坐標賦值給變量 sr_mpos_y = table(12) '根據區域編號調整定位器區域位置 ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 225, hit_pos) is_redraw = 1 '繪圖標志置1 endif if (1 = is_redraw) then '如果繪制標志=1 is_redraw = 0 '將繪制標志置0 '控件roi坐標轉圖像roi坐標,控件坐標存放在起始地址為25的數組,圖像坐標存放在起始地址為15的數組 ZV_POSTOIMG(0, 2, 225, 15) '將圖像坐標的數據賦值給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 '重新繪制全部區域 endif END SUB
'根據更新的鼠標位置坐標繪制訓練顏色樣本區域GLOBAL SUB draw_learnroi() '根據控件坐標數據繪制矩形 DRAWRECT(TABLE(225), TABLE(226), TABLE(227), TABLE(228)) local cx,cy '定義局部變量 cx = (TABLE(225) + TABLE(227)) / 2 '計算矩形的中心坐標x、y cy = (TABLE(226) + TABLE(228)) / 2 DRAWLINE(cx-5, cy, cx+5, cy) '繪制中心十字線 DRAWLINE(cx, cy-5, cx, cy+5) END SUB
14.點擊[元件]→[新建窗口],新建學習模板窗口,設計窗口布局,關聯變量。
15.在“draw.bas”文件中添加主界面按下【學習模板】按鈕響應的函數并關聯動作函數。
'主界面按下學習模板按鈕時響應的函數GLOBAL SUB btn_sel_loc()
ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(11, 60), HMI_CONTROLSIZEY(11, 60)) '設置創建模板窗口鎖存通道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 '將繪圖標志置0 d_is_rtn_loc = 0 '將返回界面標志置0 '將模板區域的圖像坐標存放到起始地址為25的table數組中 TABLE(25, d_locator_roi(0), d_locator_roi(1),d_locator_roi(2),d_locator_roi(3)) ZV_POSFROMIMG(0, 2, 25, 25) '將圖像坐標轉換到HMI控件坐標 HMI_SHOWWINDOW(11) '彈出窗口號為11的創建模板窗口 END SUB
16.在“draw.bas”文件中添加模板區域更新繪制函數,并在學習模板界面的自定義控件上關聯刷新函數名和繪圖函數名。
'根據鼠標操作更新定位器的區域即學習模板的有效區域GLOBAL SUB update_locator()
if mouse_scan(11) = 1 then '掃描鼠標按下操作 is_set_roi_m_down = 1 '鼠標按下標志置1 sr_mpos_x = table(11) '將當前鼠標按下位置的坐標賦值給變量 sr_mpos_y = table(12) '只有按下時可以改變擊中位置,獲取鼠標點擊位置對應的擊中區域編號 hit_pos = ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 25, -1) is_redraw = 1 '繪圖標志置1 endif if mouse_scan(11) = -1 then '掃描鼠標松開操作 is_set_roi_m_down = 0 '鼠標按下標志置0 sr_mpos_x = table(11) '將當前鼠標松開位置的坐標賦值給變量 sr_mpos_y = table(12) '根據區域編號調整定位器區域位置 ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 25, hit_pos) is_redraw = 1 '繪圖標志置1 endif '如果鼠標按下時 if (is_set_roi_m_down and MOUSE_state(11)) then sr_mpos_x = table(11) '將當前鼠標按下位置的坐標賦值給變量 sr_mpos_y = table(12) '根據區域編號調整定位器區域位置 ZV_HMIADJRECT(sr_mpos_x, sr_mpos_y, 25, hit_pos) is_redraw = 1 '繪圖標志置1 endif if (1 = is_redraw) then '如果繪制標志=1 is_redraw = 0 '將繪制標志置0 '控件roi坐標轉圖像roi坐標,控件坐標存放在起始地址為25的數組,圖像坐標存放在起始地址為15的數組 ZV_POSTOIMG(0, 2, 25, 15) '將圖像坐標的數據賦值給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 '重新繪制全部區域 endif END SUB
'根據更新的鼠標位置坐標繪制定位器roiGLOBAL SUB draw_locator()
'根據控件坐標數據繪制矩形 DRAWRECT(TABLE(25), TABLE(26), TABLE(27), TABLE(28)) local cx,cy '定義局部變量 cx = (TABLE(25) + TABLE(27)) / 2 '計算矩形的中心坐標x、y cy = (TABLE(26) + TABLE(28)) / 2 DRAWLINE(cx-5, cy, cx+5, cy) '繪制中心十字線 DRAWLINE(cx, cy-5, cx, cy+5) END SUB
17.在“main.bas”文件中添加【截取模板】按鈕響應的函數并關聯動作函數。
'創建模板界面按下截取模板按鈕后響應的函數GLOBAL SUB btn_getSubImg()
LOCAL mod_w,mod_h '根據ROI數據生成模板子圖像 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數組中 ZV_IMGINFO(subImg,0) mod_w = TABLE(0) mod_h = TABLE(1) '根據圖像信息生成模板區域 ZV_REGENRECT(modRe,0,0,mod_w, mod_h) '清空鎖存通道1 ZV_LATCHCLEAR(1) '將模板子圖像顯示到鎖存通道1中 ZV_LATCH(subImg, 1) END SUB
18.點擊[元件]→[新建窗口],新建編輯模板窗口,設計窗口布局,并關聯變量。
19.在“draw.bas”文件中添加創建模板界面【橡皮擦】按鈕響應的函數并關聯動作函數。
'創建模板界面按下橡皮擦按鈕時響應的函數GLOBAL SUB btn_sel_erase()
ZV_LATCHSETSIZE(1, HMI_CONTROLSIZEX(12, 1), HMI_CONTROLSIZEY(12, 1)) '設置鎖存通道1的大小 SET_COLOR(RGB(0,255,0)) '設置繪制時畫筆使用的顏色 ZV_LATCHCLEAR(1) '清空鎖存通道1 ZV_IMGCOPY(subImg, copy_subImg) '復制模板子圖像到copy_subImg圖像變量中 ZV_REGION(copy_subImg, modRe, 1, 0) '在模板圖像上繪制modRe圖像的非有效區域,繪制顏色為黑色,用于掩模 ZV_LATCH(copy_subImg, 1) '顯示復制的模板圖 HMI_SHOWWINDOW(12) '打開編輯模板窗口 END SUB
20.在“draw.bas”文件中添加橡皮擦更新繪制函數,并在編輯模板界面的自定義控件上關聯刷新函數名和繪圖函數名。
'根據鼠標操作更新橡皮擦擦除/恢復區域的位置GLOBAL SUB update_eraser() DIM c_size_eraser '橡皮擦在控件上對應的尺寸 DIM eraser_pos_x,eraser_pos_y d_mouse_s = MOUSE_STATE(11) '鼠標處于按下狀態時 eraser_pos_x = TABLE(11) '將當前鼠標按下位置的坐標賦值給橡皮擦控件坐標變量 eraser_pos_y = TABLE(12) c_size_eraser = ZV_LENFROMIMG(0, d_eraser_size) '將橡皮擦的圖像尺寸轉換成控件尺寸 '生成以(eraser_pos_x,eraser_pos_y)為中心,2*c_size_eraser為邊長的正方形橡皮擦區域 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 '限制橡皮擦坐標在圖片元件區域內 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區域 SET_REDRAW(0,0, HMI_CONTROLSIZEX(12, 1), HMI_CONTROLSIZEY(12, 1)) endif if d_mouse_s = 1 and d_edit_m = 1 then '如果鼠標處于按下狀態且編輯模板標志=1時 btn_pro_eraser() '執行處理橡皮擦函數 endif END SUB
'處理橡皮擦函數GLOBAL SUB btn_pro_eraser() ZVOBJECT tmp_re '將橡皮擦區域的左上角坐標x,y存放到起始地址為30的數組中 TABLE(30, c_rect(0), c_rect(1)) '將控件坐標轉換到圖像坐標中 ZV_POSTOIMG(1, 1, 30, 30) '根據圖像坐標系下的數據生成正方形橡皮擦區域,并存放到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) '計算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圖像的非有效區域,繪制顏色為黑色,用于掩模 ZV_LATCH(copy_subImg, 1) '顯示復制的模板圖 END SUB
'更新繪制橡皮擦區域GLOBAL SUB draw_eraser()
if d_edit_m = 0 then '如果編輯模板標志為0 return '返回子函數,不繼續往下執行 endif '繪制正方形橡皮擦區域 DRAWRECT(c_rect(0), c_rect(1), c_rect(2), c_rect(3)) END SUB
21.在“main.bas”文件中添加編輯模板界面【創建模板】按鈕響應的函數并關聯動作函數。
'編輯模板界面按下創建模板按鈕時響應的函數GLOBAL SUB btn_loc_creModel()
d_is_creModel = 1 '創建模板標志置1 '根據模板參數和模板子圖像創建模板,并將模板結果存放到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) '灰度圖轉換成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) '清空鎖存通道2 ZV_LATCH(colorSubImg, 2) '顯示圖像結果到鎖存通道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
22.在“main.bas”文件中添加編輯模板界面【保存模板】按鈕響應的函數并關聯動作函數。
'編輯模板界面按下保存模板按鈕時響應的函數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 ?"請先創建模板!" return endifEND SUB
23.在“main.bas”文件中添加編輯模板界面【讀取模板】按鈕響應的函數并關聯動作函數。
'編輯模板界面按下讀取模板按鈕時響應的函數GLOBAL SUB btn_loc_redModel() if VR(0)=1 then ZV_READSHAPEMOD(s_mod,"顏色排序/shape.zvb") ?"讀取模板成功!" else ?"請先保存模板!" return endifEND SUB
24.在“draw.bas” 文件中添加編輯模板界面【確定】按鈕響應的函數并關聯動作函數。
'創建模板界面按下確定按鈕時響應的函數GLOBAL SUB btn_loc_cfm()
grab_switch = 0 '關閉補正源的連續采集 d_is_rtn_loc = 1 '返回主界面標志置為1 '設置鎖存通道0的大小 ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) ZV_LATCHCLEAR(0) '清空鎖存通道0 ZV_LATCH(colorImg, 0) '顯示圖像在鎖存通道0上 HMI_CLOSEWINDOW(11) '關閉創建模板窗口 END SUB
25.在“main.bas”文件中添加創建模板界面【測試】按鈕響應的函數并關聯動作函數。
'創建模板界面按下測試按鈕時響應的函數GLOBAL SUB btn_loc_test() if (d_is_creModel = 0) then '如果創建模板標志=0 ?"未創建模板!" '提示未創建模板毛病返回子函數不往下執行 return endif '開始匹配 TICKS = 0 '開始計時 ZVOBJECT match_rst, sImg, showImg '對圖像進行3*3高斯平滑處理,處理后的圖像輸出到sImg變量中 ZV_GAUSSBLUR(grabImg, sImg, 3) '根據模板子圖像和搜索參數進行目標匹配,并將匹配結果存放到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) '獲取矩陣結果信息。并存放到起始地址為0的table數組中 ' ZV_GRAYTORGB(sImg, showImg) '灰度圖轉換到RGB圖,作為匹配結果圖像 if TABLE(0) > 0 then '如果匹配到目標 local rowr for rowr = 0 to TABLE(0)-1 '獲取match_rst矩陣中第rowr行的數據存放到起始地址為3的table數組中,table最大長度5 ZV_MATGETROW(match_rst, rowr, 5, 3) 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)) '對輪廓或輪廓序列進行仿射變換 ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1) '在colorSubImg圖像上繪制綠色的輪廓序列 ZV_CONTLIST(colorImg, tsContlist1, ZV_COLOR(0, 255, 0), 0) endif next else '未匹配到目標時,將結果賦值為-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) '計算匹配消耗時間 ZV_LATCH(colorImg, 0) '顯示匹配結果圖像 END SUB
26.在“draw.bas”文件中添加創建模板界面【確定】按鈕響應的函數并關聯動作函數。
'創建模板界面按下確定按鈕時響應的函數GLOBAL SUB btn_loc_cfm()
grab_switch = 0 '關閉補正源的連續采集 d_is_rtn_loc = 1 '返回主界面標志置為1 '設置鎖存通道0的大小 ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 2), HMI_CONTROLSIZEY(10, 2)) ZV_LATCHCLEAR(0) '清空鎖存通道0 ZV_LATCH(colorImg, 0) '顯示圖像在鎖存通道0上 HMI_CLOSEWINDOW(11) '關閉創建模板窗口 END SUB
27.在main.bas文件中添加主界面【測試】按鈕響應的函數并關聯動作函數。
'主界面按下測試按鈕時響應的函數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 '先進行匹配定位,補正ROI位置 if (d_is_creModel = 0) then '如果創建模板標志=0 ?"未創建模板!" '提示未創建模板毛病返回子函數不往下執行 return endif ZVOBJECT match_rst, sImg, showImg '對圖像進行3*3高斯平滑處理,處理后的圖像輸出到sImg變量中 ZV_GAUSSBLUR(grabImg, sImg, 3) '根據模板子圖像和搜索參數進行目標匹配,并將匹配結果存放到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) '獲取矩陣結果信息。并存放到起始地址為0的table數組中 ZV_IMGCOPY(colorImg,showImg) if TABLE(0) > 0 then '如果匹配到目標 local rowr for rowr = 0 to TABLE(0)-1 '獲取match_rst矩陣中第rowr行的數據存放到起始地址為3的table數組中,table最大長度5 ZV_MATGETROW(match_rst, rowr, 5, 3)
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)) '對輪廓或輪廓序列進行仿射變換 ZV_CONTAFFINE(contlist1, mat_rigid1, tsContlist1) '在colorSubImg圖像上繪制綠色的輪廓序列 ZV_CONTLIST(showImg, tsContlist1, ZV_COLOR(0, 255, 0), 0) endif next else '未匹配到目標時,將結果賦值為-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 '計算變換矩陣 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)) '初始化顏色識別區域 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)) '變換識別區域 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 '如果訓練樣本庫為空 ?"顏色模型庫為空!" 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'將識別的顏色結果復制到數組變量中 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)'計算識別區域的面積和重心位置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
28.在“main.bas”文件中添加主界面【連續運行】按鈕響應的函數并關聯動作函數。
'主界面點擊連續運行按鈕時響應的函數GLOBAL SUB btn_run()
if(run_switch = 1) then '如果已經開啟連續運行 ?"已開啟連續運行,請勿重復操作!" '提示信息并退出子函數,不往下執行 return endif run_switch = 1 '主任務開關置1 if (1 = run_switch) then '如果主任務開關=1 if (0 = PROC_STATUS(main_task_id)) then '如果main_task_id任務未開啟 RUNTASK main_task_id, main_task '開啟main_task任務 endif endifEND SUB
'主任務執行的內容main_task: while(1) if (0 = run_switch) then '如果主任務開關=0即停止運行按鈕按下時 exit while '退出循環 endif '否則重復執行以下操作 if (d_use_imgfile=1) then '如果d_use_imgfile=1時使用讀取本地圖片功能 if(d_index=3) then d_index=0 endif File_Name="顏色排序/"+TOSTR(d_index,1,0)+".bmp" '讀取本地圖片時圖片所在的路徑名稱 ZV_IMGREAD(grabImg,File_Name,1) ZV_IMGREAD(colorImg,File_Name,0) d_index=d_index+1 else '如果相機數量為0,提示先掃描相機,并退出子函數不往下執行 if cam_num = 0 then ?"請先掃描相機!" return endif CAM_SETPARAM("TriggerSoftware", 0) '發送觸發指令 CAM_GET(grabImg, 0) endif
'執行測試按鈕響應函數進行匹配定位檢測 btn_test() wend END
29.在“main.bas”文件中添加主界面【停止運行】按鈕響應的函數并關聯動作函數。
'主界面點擊停止執行按鈕時響應的函數GLOBAL SUB btn_stop()
if(run_switch = 0) then '如果主任務開關=0 ?"未開啟連續運行!" '提示未開啟循環任務,并退出子函數不往下執行 return endif run_switch = 0 '主任務開關置0,退出循環 END SUB
30.在“main.bas”文件添加主界面按下【保存參數】按鈕時響應的函數,并關聯動作函數。
'主界面按下保存匹配參數按鈕時響應的函數GLOBAL SUB btn_loc_saveParam()
VR(1)=1 '匹配參數保存標志置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) ?"已保存檢測參數!" END SUB
31.在“draw.bas”文件中ROI區域更新繪制函數,并在主界面的自定義控件上關聯刷新函數名和繪圖函數名。
'根據鼠標操作更新ROI位置區域函數GLOBAL SUB update_roi()
if d_select_regROI=1 then SET_REDRAW if mouse_scan(11) = 1 then '掃描鼠標按下操作 '只有按下時可以改變擊中位置,獲取調整區域標志 hit_pos = ZV_HMIADJRECT2(table(11), table(12), 231, -1) is_redraw = 1 '將繪圖標志置1 endif if mouse_scan(11) = -1 then '掃描鼠標松開操作 '調整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 231, hit_pos) is_redraw = 1 '將繪圖標志置1 endif if (MOUSE_state(11)) then '調整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 231, hit_pos) is_redraw = 1 '將繪圖標志置1 endif if (1 = is_redraw) then '繪制 is_redraw = 0 '將繪圖標志置0 ZV_POSTOIMG(0, 1, 231, 241)'將ROI的控件坐標數據轉到圖像坐標數據 d_reg_roi1(0) = TABLE(241)'將ROI的圖像坐標數據賦值給定義的變量 d_reg_roi1(1) = TABLE(242) '將ROI在控件坐標系下的寬度、高度轉到像素寬度,并賦值給定義的變量 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 '掃描鼠標按下操作 '只有按下時可以改變擊中位置,獲取調整區域標志 hit_pos = ZV_HMIADJRECT2(table(11), table(12), 331, -1) is_redraw = 1 '將繪圖標志置1 endif if mouse_scan(11) = -1 then '掃描鼠標松開操作 '調整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 331, hit_pos) is_redraw = 1 '將繪圖標志置1 endif if (MOUSE_state(11)) then '調整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 331, hit_pos) is_redraw = 1 '將繪圖標志置1 endif if (1 = is_redraw) then '繪制 is_redraw = 0 '將繪圖標志置0 ZV_POSTOIMG(0, 1, 331, 241)'將ROI的控件坐標數據轉到圖像坐標數據 d_reg_roi2(0) = TABLE(241)'將ROI的圖像坐標數據賦值給定義的變量 d_reg_roi2(1) = TABLE(242) '將ROI在控件坐標系下的寬度、高度轉到像素寬度,并賦值給定義的變量 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 '掃描鼠標按下操作 '只有按下時可以改變擊中位置,獲取調整區域標志 hit_pos = ZV_HMIADJRECT2(table(11), table(12), 431, -1) is_redraw = 1 '將繪圖標志置1 endif if mouse_scan(11) = -1 then '掃描鼠標松開操作 '調整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 431, hit_pos) is_redraw = 1 '將繪圖標志置1 endif if (MOUSE_state(11)) then '調整ROI的位置 ZV_HMIADJRECT2(table(11), table(12), 431, hit_pos) is_redraw = 1 '將繪圖標志置1 endif if (1 = is_redraw) then '繪制 is_redraw = 0 '將繪圖標志置0 ZV_POSTOIMG(0, 1, 431, 241)'將ROI的控件坐標數據轉到圖像坐標數據 d_reg_roi3(0) = TABLE(241)'將ROI的圖像坐標數據賦值給定義的變量 d_reg_roi3(1) = TABLE(242) '將ROI在控件坐標系下的寬度、高度轉到像素寬度,并賦值給定義的變量 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區域更新后實時繪制ROI區域GLOBAL SUB draw_roi() SET_COLOR(C_GREEN) '設置繪制時畫筆的顏色為藍色 if d_select_regROI=1 then ZV_HMIRECT2(231, 70) '將旋轉矩形roi分解為HMI支持的繪圖圖元并添加控制參數,便于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) '將旋轉矩形roi分解為HMI支持的繪圖圖元并添加控制參數,便于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) '將旋轉矩形roi分解為HMI支持的繪圖圖元并添加控制參數,便于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
三操作演示梯形圖介紹
(一)操作步驟
查看運行效果:將項目下載到仿真器中→使用本地圖片→單次采集→訓練樣本,依次學習“red”“black”“yellow”的顏色模板→學習模板,作為識別顏色區域的補正源→依次拖拽3個顏色識別ROI區域→點擊測試查看效果圖→點擊連續運行,查看運行效果→結束。
(二)效果演示
本次,正運動技術機器視覺運動控制一體機應用例程(九)線束顏色排序識別,就分享到這里。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
中國傳動網版權與免責聲明:凡本網注明[來源:中國傳動網]的所有文字、圖片、音視和視頻文件,版權均為中國傳動網(www.hysjfh.com)獨家所有。如需轉載請與0755-82949061聯系。任何媒體、網站或個人轉載使用時須注明來源“中國傳動網”,違反者本網將追究其法律責任。
本網轉載并注明其他來源的稿件,均來自互聯網或業內投稿人士,版權屬于原版權人。轉載請保留稿件來源及作者,禁止擅自篡改,違者自負版權法律責任。
產品新聞
更多>2025-04-30
2025-04-11
2025-04-08
2025-03-31
2025-03-26
2025-03-20