BLOB有無檢測視頻教程
上期課程,我們講述了機器視覺方案中常用到的基於形狀匹配的視覺定位功能,通過上期課程我們掌握了使用ZDevelop軟體實現形狀匹配功能的方法。
本期課程我們和大家一起分享機器視覺另一個檢測功能---使用BLOB檢測產品有無。
BLOB又名斑點,是指在二值化圖像中暗背景上的一塊連通的亮區域或亮背景上一塊連通的暗區域。BLOB檢測是使用形態學方法(如二值化、膨脹、腐蝕等)將灰度圖像轉換成二值化圖像,轉換同時將檢測特徵處理成BLOB斑點並將幹擾因素處理成圖像背景,就可以準確地對檢測特徵進行處理。BLOB檢測特點是什麼
需要將檢測圖像轉換成二值化圖像,並使用形態學處理圖像突出檢測特徵。BLOB檢測要求檢測特徵和背景要有較好的對比度,否則無法將特徵和背景進行區分。轉化成二值化圖像後搜索BLOB斑點不需要消耗太多時間。什麼是形態學處理
形態學處理是指對圖像的局部像素進行處理,用於從圖像中提取檢測過程中關心的局部特徵細節。常用的形態學處理方法有二值化、膨脹、腐蝕、填充孔洞等。
二值化
將8位灰度圖像(灰度值0~255)轉換成非0即1的二值化圖像(純黑和純白組成的圖像)。
在二值化圖像中,將某些小面積的黑色或白色的斑點區域進行填充,可過濾噪點。
膨脹
將二值化圖像中的白色區域擴大,黑色區域縮小,去除黑色小斑點幹擾。
將二值化圖像中的黑色區域擴大,白色區域縮小,可去除白色小斑點幹擾。
// 實例演示 //
打開ZDevelop軟體:新建項目→新建HMI文件→新建main.bas文件,用於編寫界面響應函數→新建global_variable.bas文件用於存放全局變量並開啟HMI自動運行任務→新建detectParam.bas文件用於初始化測量參數→新建camera.bas文件用於實現相機採集功能→新建draw.bas文件用於更新繪製圖形刷新界面→文件添加到項目。
設計HMI界面。
在global_variable.bas文件中定義全局變量,定義完成後運行Hmi.hmi文件。
'''''全局變量大部分使用數組結構'''''''註:basic編程中很多函數會以TABLE(系統的數據結構)做為參數''在這裡table均是做為中間變量
''table 21-22,滑鼠按鍵,控制項坐標系''table 31-35,旋轉矩ROI參數,cx、cy、width、height、angle,控制項坐標系''table 41-45,旋轉矩形控制項坐標轉換後對應的圖像坐標,圖像坐標系
''table 51-56,圓環ROI參數,cx、cy、圓環中線半徑r、圓環半寬ann_R、起始角度stAngle、角度範圍entAngle,控制項坐標系''table 61-66,圓環控制項坐標轉換後對應的圖像坐標,圖像坐標系
'主任務狀態'0 - 未初始化'1 - 停止'2 - 運行中'3 - 正在停止GLOBAL DIM main_task_statemain_task_state = 1
'採集開關'0 - 停止採集'1 - 請求採集GLOBAL DIM grab_switchgrab_switch = 0
'相機個數GLOBAL cam_numcam_num = 0
'相機種類,"zmotion;mvision;basler;mindvision;huaray"GLOBAL DIM CAMERA_TYPE(16)CAMERA_TYPE = "zmotion"
' 定義主任務id - 10GLOBAL DIM main_task_idmain_task_id = 10
'定義連續採集任務id - 9GLOBAL DIM grab_task_idgrab_task_id = 9
'定義全局圖像變量GLOBAL ZVOBJECT grabImg '採集圖像GLOBAL ZVOBJECT binImg '二值化圖像GLOBAL ZVOBJECT disImg '顯示圖像
'錯誤消息GLOBAL DIM error_msg(256)
'定義常用顏色變量GLOBAL C_RED, C_GREEN, C_BLUE, C_YELLOWC_RED = RGB(255, 0, 0)C_GREEN = RGB( 0,255, 0)C_BLUE = RGB( 0, 0,255)C_YELLOW= RGB(255,255, 0)
GLOBAL DIM d_roi_arc_flag '定義ROI類型標誌:0-矩形,1-圓環GLOBAL DIM d_rlt_area '定義BLOB面積結果GLOBAL DIM d_rlt_state '定義狀態結果
'旋轉矩形ROI參數:cx、cy、width、height、angleGLOBAL DIM d_roi_rect2(5) 'd開頭表示數據結構
'圓弧ROI參數:cx、cy、圓環中線半徑r、圓環半寬ann_R、起始角度stAngle、角度範圍entAngleGLOBAL DIM d_roi_arc(6) 'd開頭表示數據結構
'檢測參數:閾值模式(自動閾值或手動閾值)、低閾值、高閾值、極性(黑或白)、最小面積、最大面積、反向(即結果取反,成功變成失敗、失敗變成成功)GLOBAL DIM d_detect_param(7) 'd開頭表示數據結構
'開/閉運算參數GLOBal DIM d_deal_value(2)
'檢測的結果,依次為狀態結果、像素麵積GLOBAL DIM d_detect_rst(2)
'顯示列印的字符GLOBAL ShowString(64)
'運行HMI文件RUN "Hmi.hmi",1在detectParam.bas文件中初始化測量參數。
end
GLOBAL SUB init_detect_param() '初始化測量參數 d_roi_arc_flag = 0 '默認為矩形 d_rlt_area = 0 d_rlt_state = 0 d_deal_value(0)=1 d_deal_value(1)=1 '初始化roi參數 d_roi_rect2(0) = 320.0 'roi中心x d_roi_rect2(1) = 240.0 'roi中心y d_roi_rect2(2) = 160.0 'roi寬 d_roi_rect2(3) = 120.0 'roi高 d_roi_rect2(4) = 0.0 'roi角度 TABLE(31) = d_roi_rect2(0) TABLE(32) = d_roi_rect2(1) TABLE(33) = d_roi_rect2(2) TABLE(34) = d_roi_rect2(3) TABLE(35) = d_roi_rect2(4) d_roi_arc(0) = 320.0 'roi中心x d_roi_arc(1) = 240.0 'roi中心y d_roi_arc(2) = 60.0 '圓環中心線半徑 d_roi_arc(3) = 20.0 '圓環半寬 d_roi_arc(4) = 0.0 '起始角度 d_roi_arc(5) = 360.0 '終止角度 TABLE(51) = d_roi_arc(0) TABLE(52) = d_roi_arc(1) TABLE(53) = d_roi_arc(2) TABLE(54) = d_roi_arc(3) TABLE(55) = d_roi_arc(4) TABLE(56) = d_roi_arc(5) '初始化檢測參數:閾值模式(自動閾值 = 1 或 手動閾值 = 0)、低閾值、高閾值、極性(黑或白)、最大、最小、反向(即結果取反,成功變成失敗、失敗變成成功) d_detect_param(0) = 0 '手動閾值 d_detect_param(1) = 128 '低閾值 d_detect_param(2) = 255 '高閾值 d_detect_param(3) = 1 '極性白,即檢測白色像素麵積 d_detect_param(4) = 60000 '最小面積,像素個數 d_detect_param(5) = 90000 '最大面積 d_detect_param(6) = 0 '結果不反向 END SUB關聯HMI界面值顯示控制項變量。
在main.bas文件中添加HMI界面初始化函數並在Hmi系統設置中關聯初始化函數。
'HMI界面初始化函數GLOBAL SUB hmi_init() grab_switch = 0 main_task_state = 1 ZV_RESETCLIPSIZE(1280, 1024) '初始化時依據圖像解析度設置區域的裁剪尺寸,此處圖像解析度為1280x1024 ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 7), HMI_CONTROLSIZEY(10, 7)) '設置鎖存的大小
init_detect_param() '初始化測量參數 ZV_SETSYSDBL("CamGetTimeout", 1000) '設置採集超時 ZV_LATCHCLEAR(0) ZV_LATCH(grabImg, 0) END SUB在camera.bas文件中添加HMI界面中採集相關按鈕響應的函數並關聯動作函數。
具體實現函數前期課程:
已經有操作演示,此處不做贅述。
在draw.bas文件中添加檢測ROI更新繪製函數,並在自定義元件屬性窗口中關聯刷新函數和繪製函數。
end
'和繪製(即選擇ROI)有關的界面的刷新繪製函數放在這個bas文件裡
DIM is_redraw is_redraw = 0 DIM hit_pos
'根據滑鼠操作更新ROI位置區域函數GLOBAL SUB update_roi() if d_roi_arc_flag = 0 then if mouse_scan(21) = 1 then '掃描按下操作 hit_pos = ZV_HMIADJRECT2(table(21), table(22), 31, -1) '只有按下時可以改變擊中位置 is_redraw = 1 endif
if mouse_scan(21) = -1 then '掃描鬆開操作 ZV_HMIADJRECT2(table(21), table(22), 31, hit_pos) is_redraw = 1 endif if (MOUSE_state(21)) then ZV_HMIADJRECT2(table(21), table(22), 31, hit_pos) is_redraw = 1 endif if (1 = is_redraw) then is_redraw = 0 ZV_POSTOIMG(0, 1, 31, 41) d_roi_rect2(0) = TABLE(41) d_roi_rect2(1) = TABLE(42) d_roi_rect2(2) = ZV_LENTOIMG(0, TABLE(33)) d_roi_rect2(3) = ZV_LENTOIMG(0, TABLE(34)) d_roi_rect2(4) = TABLE(35) SET_REDRAW endif else is_redraw = 0 if mouse_scan(21) = 1 then '掃描按下操作 hit_pos = ZV_HMIADJARC(table(21), table(22), 51, -1) '只有按下時可以改變擊中位置 is_redraw = 1 endif
if mouse_scan(21) = -1 then '掃描鬆開操作 ZV_HMIADJARC(table(21), table(22), 51, hit_pos) is_redraw = 1 endif if (MOUSE_state(21)) then ZV_HMIADJARC(table(21), table(22), 51, hit_pos) is_redraw = 1 endif if (1 = is_redraw) then is_redraw = 0 '控制項坐標轉圖像坐標 ZV_POSTOIMG(0, 1, 51, 61) TABLE(63) = ZV_LENTOIMG(0, TABLE(53)) TABLE(64) = ZV_LENTOIMG(0, TABLE(54)) TABLE(65, TABLE(55), TABLE(56)) d_roi_arc(0) = TABLE(61) d_roi_arc(1) = TABLE(62) d_roi_arc(2) = TABLE(63) d_roi_arc(3) = TABLE(64) d_roi_arc(4) = TABLE(65) d_roi_arc(5) = TABLE(66) SET_REDRAW endif end if END SUB
'ROI區域更新後實時繪製ROI區域GLOBAL SUB draw_roi() if d_roi_arc_flag = 0 then SET_COLOR(C_BLUE) ZV_HMIRECT2(31, 300) '將旋轉矩形roi分解為HMI支持的繪圖圖元並添加控制參數,便於HMI繪圖顯示 DRAWLINE(TABLE(300), TABLE(301), TABLE(302), TABLE(303)) '外矩形 DRAWLINE(TABLE(302), TABLE(303), TABLE(304), TABLE(305)) DRAWLINE(TABLE(304), TABLE(305), TABLE(306), TABLE(307)) DRAWLINE(TABLE(306), TABLE(307), TABLE(300), TABLE(301)) else SET_COLOR(C_BLUE) TABLE(57) = 1 '子區域的個數 TABLE(58) = 5 '子區域寬度 ZV_HMIARC(51, 400) '繪製圓環
'繪製圓弧 DRAWARC(TABLE(400), TABLE(401), TABLE(402), TABLE(404), TABLE(405)) '內半徑 DRAWARC(TABLE(400), TABLE(401), TABLE(403), TABLE(404), TABLE(405)) '外半徑 '繪製邊界線 DIM idx for idx = 0 to TABLE(406)-1 DRAWLINE(TABLE(407+idx*4), TABLE(408+idx*4), TABLE(409+idx*4), TABLE(410+idx*4)) next endif END SUB在main.bas文件中添加HMI界面按下【測試】按鈕時響應的函數並關聯動作函數名。'HMI界面按下測試按鈕時響應的函數GLOBAL SUB btn_test() ZVOBJECT regionWhite, regionMask, regionBlack,re_connecte '生成ROI區域 if d_roi_arc_flag = 0 then ZV_REGENRECT2(regionMask, d_roi_rect2(0), d_roi_rect2(1), d_roi_rect2(2), d_roi_rect2(3), d_roi_rect2(4)) else ZV_REGENANNULAR(regionMask, d_roi_arc(0), d_roi_arc(1), d_roi_arc(2) - d_roi_arc(3), d_roi_arc(2) + d_roi_arc(3)) endif
'二值化處理 if d_detect_param(0) = 0 then '手動閾值處理 ZV_RETHRESH(grabImg, regionMask, regionWhite, d_detect_param(1), d_detect_param(2)) ZV_REOPENING(regionWhite,regionWhite,d_deal_value(0),d_deal_value(0)) ZV_RECLOSING(regionWhite,regionWhite,d_deal_value(1),d_deal_value(1)) else Dim autoThresh '自動閾值處理 ZV_REAUTOTHRESH(grabImg, regionMask, regionWhite, 500) ZV_REOPENING(regionWhite,regionWhite,d_deal_value(0),d_deal_value(0)) ZV_RECLOSING(regionWhite,regionWhite,d_deal_value(1),d_deal_value(1)) autoThresh = TABLE(500) '? "autoThresh = " autoThresh endif '計算BLOB面積 if d_detect_param(3) = 1 then '極性為白 ZV_REAREA(regionWhite, 500) '計算regionWhite亮區域的面積 d_rlt_area = TABLE(500) '將獲取的像素麵積賦值給d_rlt_area變量 ZV_RECONNECT(regionWhite,re_connecte) '計算區域的連通區域 zv_refilter(re_connecte,0,60000,90000,0) '對區域列表中的區域進行過濾,保留面積在 60000 到 90000 的區域,面積不在此範圍的區域將被過濾掉 ZV_LISTCOUNT(re_connecte,100) '獲取列表中的連通區域的數量 ?"產品個數"TABLE(100)
else '極性為黑 ZV_REDIFF (regionMask, regionWhite, regionBlack) ZV_REAREA(regionBlack, 500) d_rlt_area = TABLE(500) ZV_RECONNECT(regionBlack,re_connecte) '計算區域的連通區域 zv_refilter(re_connecte,0,60000,90000,0) '對區域列表中的區域進行過濾,保留面積在 60000 到 90000 的區域,面積不在此範圍的區域將被過濾掉 ZV_LISTCOUNT(re_connecte,100) '獲取列表中的連通區域的數量 ?"產品個數"TABLE(100) endif
'對結果進行判斷 if d_rlt_area > d_detect_param(4) and d_rlt_area < d_detect_param(5) then '面積結果在設定的面積上下限範圍內時 d_rlt_state = 1 else d_rlt_state = 0 endif '是否反向的判斷 if d_detect_param(6) then d_rlt_state = 1 - d_rlt_state endif '繪製效果圖 Dim width, height ZV_IMGINFO (grabImg, 500) width = TABLE(500) height = TABLE(501) ZV_GRAYTORGB(grabImg,disImg) ShowString=TOSTR(TABLE(100),1,0) '將BLOB的數量轉換成字符串變量 ZV_TEXT(disImg,"零件統計個數:"ShowString,10,80,80,ZV_COLOR(0,0,0)) '顯示結果文本
ZV_REGION(disImg, regionMask, 0, ZV_COLOR(0,0,0)) '在disImg中繪製黑色的regionMask區域 ZV_REGION(disImg, regionWhite, 0, ZV_COLOR(255,255,255)) '在disImg中繪製白色的regionWhite區域 ZV_LATCH(disImg, 0) end sub在main.bas文件中添加【運行】按鈕響應的函數並關聯動作函數。
'HMI界面按下運行按鈕時響應的函數GLOBAL SUB btn_run() if(2 = main_task_state) then ?"已經開啟連續運行任務,請勿重複操作!" return endif if (1 = main_task_state) then if (0 = PROC_STATUS(main_task_id)) then main_task_state = 2 RUNTASK main_task_id, main_task endif endifend sub
main_task: while(1) if (3 = main_task_state) then main_task_state = 1 exit while endif '執行採集和檢測函數 CAM_SETPARAM("TriggerSoftware", 0) CAM_GET(grabImg, 0) btn_test() wendEND在main.bas文件中添加【停止】按鈕響應的函數並關聯動作函數。
'HMI界面按下停止按鈕時響應的函數GLOBAL SUB btn_stop() if (2 = main_task_state) then main_task_state = 3 endif end sub存在 零件統計個數:1
不存在 零件統計個數:0
本次,正運動技術VPLC系列機器視覺運動控制一體機快速入門(四)——BLOB有無檢測就分享到這裡,更多精彩內容請關注「正運動小助手」公眾號。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能製造水平。文章版權歸正運動技術所有,如有轉載請註明文章來源。
正運動技術是一家專注於運動控制技術研發與應用的國家級高新技術企業,主要從事運動控制器、運動控制卡、視覺運動控制一體機以及IO擴展模塊等產品的研發、生產、銷售和服務。
公司匯集了來自華為、中興等公司的優秀人才,在堅持自主創新的同時,積極聯合各大高校致力於運動控制技術研究與應用,是國內工控領域發展最快的企業之一,也是國內完整掌握運動控制核心技術和實時工控軟體平臺技術的企業。