發布日期:2022-04-25 點擊率:35
關鍵詞:正運動技術,機器視覺,運動控制一體機
摘要:前面課程講述的所有的機器視覺功能如形狀匹配、BLOB檢測、數據碼識別以及OCR等功能,我們都是對單通道的灰度圖像進行處理。
前面課程講述的所有的機器視覺功能如形狀匹配、BLOB檢測、數據碼識別以及OCR等功能,我們都是對單通道的灰度圖像進行處理。
本次課程我們將和大家一起分享使用ZDevelop軟件對采集到的彩色圖像進行顏色識別的實現方法。
一檢測原理
顏色是我們人眼能接收到的最直接的信息。在工業機器視覺的應用中,我們也可以根據提取到的顏色信息對待測特征進行判斷處理。
工業應用中使用到的顏色信息一般是3通道的顏色信息,每一個通道都由8bit的數據信息進行描述,因此機器視覺中通常處理的彩色圖像是24bit的圖像。
根據不同的顏色特征,采用不同的顏色空間模型對顏色通道進行描述,包括RGB模型、HSV模型、HSI模型。
(一)RGB模型
RGB模型是常用的顏色空間描述方式,它是通過對三色原紅(Red)、綠(Green)、藍(Blue)3中顏色的變化以及三種顏色不同的疊加情況呈現出不同的顏色效果。
如下圖所示,紅、綠、藍每個顏色通道都由8bit圖像數據來描述,數值范圍(0~255)。每一種顏色都由三個顏色通道的數值來顯示。如(255,0,0)表示紅色,(0,255,0)表示綠色,(0,0,255)表示藍色,(255,255,255)表示白色,紅色和綠色的疊加表示黃色(255,255,0)。
RGB空間模型示意圖
(二)HSV模型
HSV模型包括了色調(Hue)、飽和度(Saturation)、純度(Value)。它對顏色的描述比RGB更接近人眼對色彩的感知。
HSV模型常用倒立的圓錐體來表示,如下圖所示。色調決定顏色的本質,它反映出人眼所看到的顏色如紅色或是藍色;飽和度表示顏色的深淺程度,它也是指含白色的數量程度,白色越多飽和度越低,顏色越淺;純度反映的是光對顏色的影響程度,從上往下看是一個由白到黑的一個變化過程。
(三)HSI模型
HSI模型使用了顏色三要素色調(Hue)、飽和度(Saturation)、亮度(Intensity)來描述顏色。
HSI模型常用上下對稱的圓錐體來表示,如下圖所示。色調決定顏色的本質,它反映出人眼所看到的顏色如紅色或是藍色;飽和度表示顏色的深淺程度;亮度反映的是顏色的亮暗程度,從上往下看,它是一個由亮變暗的一個變化過程。
(四)顏色識別
ZVision視覺指令中顏色識別的原理是先通過預先設置的RGB顏色通道的高低閾值范圍或者通過學習圖像上某一區域內的顏色特征生成顏色模型庫,然后在輸入圖像的指定區域選取某個檢測特征,將檢測特征和顏色模型庫中的顏色進行對比,輸出分數最高的顏色模型名稱。
二應用場景
1.分類計數
可以訓練學習所有不同顏色的產品,通過顏色識別對不同顏色的產品進行分類并進行計數。
2.提取待測目標特征
如果待測目標特征具有特定的顏色如紅色,可以通過提取紅色通道的顏色信息將彩色圖像進行二值化,突出待測目標特征。
3.輸出顏色信息
可以輸出待測產品目標的具體顏色信息。
三軟件演示
(一)實例演示
1.打開ZDevelop軟件:新建項目→新建HMI文件→新建main.bas文件,用于編寫界面響應函數→新建global_variable.bas文件用于定義和初始化全局變量并開啟HMI自動運行任務→新建camera.bas文件用于實現相機采集功能→新建draw.bas文件用于更新繪制圖形刷新界面→文件添加到項目。
2.設計HMI啟動界面。
3.在global_variable.bas文件中定義全局變量,定義完成后運行Hmi.hmi文件。
'''''全局變量大部分使用數組結構'''''
''注:basic編程中很多函數會以TABLE(系統的數據結構)做為參數
''table 說明 table 說明
''11~12 鼠標操作時獲取的坐標 15~18 訓練學習ROI圖像坐標數據
''31~35 識別顏色ROI控件坐標數據 50 識別的顏色名稱
''41~42 識別顏色ROI中心圖像坐標數據 104 識別的顏色id
''70~85 識別顏色ROI繪制數據 98 輸入的識別分數
''25~28 訓練學習ROI控件坐標數據
'***********定義程序任務相關變量**********************
'主任務狀態
'0 - 未初始化
'1 - 停止
'2 - 運行中
'3 - 正在停止
GLOBAL DIM main_task_state
main_task_state = 1
'運行任務開關
GLOBAL DIM run_switch
run_switch = 0
'采集任務開關
'0 - 停止采集
'1 - 請求采集
GLOBAL DIM grab_switch
grab_switch = 0
'定位檢測主任務id - 10
GLOBAL DIM main_task_id
main_task_id = 10
'相機連續采集線程id - 7
GLOBAL DIM grab_task_id
grab_task_id = 7
'***********結束定義程序任務相關變量******************
'***********定義相機采集相關變量**********************
'相機種類,此處使用海康相機-"mvision"
GLOBAL DIM CAMERA_TYPE(100)
'CAMERA_TYPE = "mindvision;basler;mvision;huaray;zmotion"
CAMERA_TYPE = "mvision"
'相機個數
GLOBAL cam_num
cam_num = 0
'相機模式,-1 連續采集,0-軟件觸發采集
GLOBAL cam_mode
cam_mode = 0
'***********結束定義相機采集相關變量******************
'定義使用ROI標志,1-使用ROI,0-使用全圖像區域
GLOBAL DIM d_roi_arc_flag
d_roi_arc_flag = 0
'定義鼠標按下標志位,1-已按下,0-未按下
GLOBAL DIM is_set_roi_m_down
is_set_roi_m_down = 0
GLOBAL DIM d_detect_time '定義消耗的時間變量
d_detect_time = 0
'定義程序執行過程中采集的圖像變量、顏色樣本模板變量和模板列表變量
GLOBAL ZVOBJECT grabImg,ColorMod,mod_list
'定義檢測識別顏色的ROI區域
GLOBAL DIM d_reg_roi(5)
d_reg_roi(0)=260
d_reg_roi(1)=210
d_reg_roi(2)=300
d_reg_roi(3)=225
d_reg_roi(4)=0
TABLE(31) = d_reg_roi(0) '將矩形ROI數據存放到起始地址為31的table數組中
TABLE(32) = d_reg_roi(1)
TABLE(33) = d_reg_roi(2)
TABLE(34) = d_reg_roi(3)
TABLE(35) = d_reg_roi(4)
'定義訓練學習顏色樣本的ROI區域
GLOBAL DIM d_learn_roi(4)
d_learn_roi(0)=260
d_learn_roi(1)=190
d_learn_roi(2)=300
d_learn_roi(3)=230
TABLE(25) = d_learn_roi(0) '將矩形ROI數據存放到起始地址為25的table數組中
TABLE(26) = d_learn_roi(1)
TABLE(27) = d_learn_roi(2)
TABLE(28) = d_learn_roi(3)
'定義輸入需要進行學習的顏色樣本名稱
GLOBAL DIM d_sample_name(128)
d_sample_name=""
'常用顏色變量
GLOBAL C_RED, C_GREEN, C_BLUE, C_YELLOW
C_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_use_imgfile
d_use_imgfile=1
'定義本地圖片索引
GLOBAL DIM d_index
'定義讀取圖片的路徑
GLOBAL DIM File_Name(100)
'***********結束定義讀取本地文件功能相關變量**********
'初始化全局變量完成后開啟HMI文件
RUN"Hmi1.hmi",1
4.關聯HMI啟動界面值控件變量。
5.在main.bas文件中添加HMI界面初始化函數并在Hmi系統設置中關聯初始化函數。
end
'注:
'凡是要使用Region有關的算子在系統初始化時都要調用ZV_RESETCLIPSIZE(width, height)這個算子設置下圖像尺寸,以滿足相機分辨率,因為默認的是640*480尺寸
'HMI界面初始化函數
GLOBAL SUB hmi_init()
grab_switch = 0 '停止采集
main_task_state = 1 '主任務停止運行
ZV_RESETCLIPSIZE(640, 480) '初始化時依據圖像分辨率設置區域的裁剪尺寸,此處圖像分辨率為640x480
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 1), HMI_ConTROLSIZEY(10, 1)) '設置鎖存的大小
TABLE(98)=60 '設置識別分數為60
TABLE(50)=0
ZV_SETSYSDBL("CamGetTimeout", 1000) '設置采集超時
ZV_LATCHCLEAR(0) '清空鎖存通道0
END SUB
6.在camera.bas文件中添加HMI啟動界面中采集相關按鈕響應的函數并關聯動作函數。
說明:具體實現函數前面課程內容已經有操作演示,此處不做贅述。
7.在draw.bas文件中添加檢測識別ROI更新繪制函數,并在自定義元件屬性窗口中關聯刷新函數和繪制函數。
end
'和繪制(即選擇ROI)有關的界面的刷新繪制函數放在這個bas文件里
DIM is_redraw
is_redraw = 0
DIM hit_pos,sr_mpos_x ,sr_mpos_y
'根據鼠標操作更新ROI位置區域函數
GLOBAL SUB update_roi()
if d_roi_arc_flag = 1 then '如果選擇ROI類型為矩形
SET_REDRAW
if mouse_scan(11) = 1 then '掃描鼠標按下操作
'只有按下時可以改變擊中位置,獲取調整區域標志
hit_pos = ZV_HMIADJRECT2(table(11), table(12), 31, -1)
is_redraw = 1 '將繪圖標志置1
endif
if mouse_scan(11) = -1 then '掃描鼠標松開操作
'調整ROI的位置
ZV_HMIADJRECT2(table(11), table(12), 31, hit_pos)
is_redraw = 1 '將繪圖標志置1
endif
if (MOUSE_state(11)) then
'調整ROI的位置
ZV_HMIADJRECT2(table(11), table(12), 31, hit_pos)
is_redraw = 1 '將繪圖標志置1
endif
if (1 = is_redraw) then '繪制
is_redraw = 0 '將繪圖標志置0
ZV_POSTOIMG(0, 1, 31, 41)'將ROI的控件坐標數據轉到圖像坐標數據
d_reg_roi(0) = TABLE(41)'將ROI的圖像坐標數據賦值給定義的變量
d_reg_roi(1) = TABLE(42)
'將ROI在控件坐標系下的寬度、高度轉到像素寬度,并賦值給定義的變量
d_reg_roi(2) = ZV_LENTOIMG(0, TABLE(33))
d_reg_roi(3) = ZV_LENTOIMG(0, TABLE(34))
d_reg_roi(4) = TABLE(35)
SET_REDRAW '全局繪制
endif
else
SET_REDRAW
endif
END SUB
'ROI區域更新后實時繪制ROI區域
GLOBAL SUB draw_roi()
if d_roi_arc_flag = 1 then '如果ROI類型為矩形
SET_COLOR(C_BLUE) '設置繪制時畫筆的顏色為藍色
ZV_HMIRECT2(31, 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
8.點擊“元件”→“新建窗口”,新建訓練學習顏色模型窗口界面,并設計界面布局。
9.在main.bas文件中添加訓練學習顏色模型界面按下【訓練樣本】按鈕時響應的函數并關聯動作函數名。
'HMI界面按下訓練樣本按鈕時響應的函數
GLOBAL SUB btn_OpenLearning()
ZV_LATCH(grabImg,0)
HMI_SHOWWINDOW(11)
END SUB
10.在draw.bas文件中添加訓練學習顏色ROI更新繪制函數,并在自定義元件屬性窗口中關聯刷新函數和繪制函數。
'根據鼠標操作更新訓練顏色樣本的有效區域
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, 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_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(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
11.在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_(grabImg,region,ColorMod,d_sample_name,0)'在 RGB 顏色空間生成顏色模型
ZV_LISTINSERT(ColorMod,mod_list,-1) '將顏色模型插入到列表
?"學習"d_sample_name"樣本成功!"
endif
END SUB
12.在main.bas文件中添加訓練學習顏色模型界面按下【清空樣本】按鈕時響應的函數并關聯動作函數名。
'定義訓練顏色樣本界面按下清空樣本按鈕時響應的函數
GLOBAL SUB btn_Clear()
if(ZV_ISEMPTY(mod_list)=0) then '如果訓練樣本庫不為空
ZV_CLEAR(mod_list)
?"已清空樣本列表!"
endif
END SUB
13.在main.bas文件中添加訓練學習顏色模型界面按下【確定】按鈕時響應的函數并關聯動作函數名。
'定義訓練顏色樣本界面按下確定按鈕時響應的函數
GLOBAL SUB btn_Confirm()
HMI_CLOSEWINDOW(11)
END SUB
14.在main.bas文件中添加HMI啟動界面按下【測試】按鈕響應的函數并關聯動作函數。
'定義HMI界面按下測試按鈕時響應的函數
GLOBAL SUB btn_test()
TICKS=0
ZVOBJECT regionMask
TABLE(50)=0
'
if d_roi_arc_flag = 1 then '如果選擇的ROI類型是矩形
'根據ROI數據生成旋轉矩形區域
ZV_REGENRECT2(regionMask, d_reg_roi(0), d_reg_roi(1), d_reg_roi(2), d_reg_roi(3), d_reg_roi(4))
else
'生成全圖像區域
ZV_REGENFULLIMG(grabImg,regionMask)
endif
if(ZV_ISEMPTY(mod_list)=1) then '如果訓練樣本庫為空
?"顏色模型庫為空!"
return
else
ZV_CLRMODELCLASSIFY_(mod_list,grabImg,regionMask,128,50,104,98)'顏色識別
endif
d_detect_time=abs(TICKS)
END SUB
15.在main.bas文件中添加HMI啟動界面按下【運行】按鈕響應的函數并關聯動作函數。
'主界面點擊運行按鈕時響應的函數
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
endif
END SUB
'主任務執行的內容
main_task:
while(1)
if (0 = run_switch) then '如果主任務開關=0即停止運行按鈕按下時
exit while '退出循環
endif
'否則重復執行以下操作
'執行單次采集響應函數獲取一幀圖像
btn_grab()
'執行檢測識別顏色子程序
btn_test()
wend
END
16.在main.bas文件中添加HMI啟動界面按下【停止】按鈕響應的函數并關聯動作函數。
'主界面點擊停止按鈕時響應的函數
GLOBAL SUB btn_stop()
if(run_switch = 0) then '如果主任務開關=0
?"未開啟連續運行!" '提示未開啟循環任務,并退出子函數不往下執行
return
endif
run_switch = 0 '主任務開關置0,退出循環
END SUB
(二)仿真演示
本次,正運動技術機器視覺運動控制一體機應用例程(二)——顏色識別,就分享到這里。
更多精彩內容請關注“正運動小助手”公眾號,需要相關開發環境與例程代碼,請咨詢正運動技術銷售工程師:400-089-8936。
本文由正運動技術原創,歡迎大家轉載,共同學習,一起提高中國智能制造水平。文章版權歸正運動技術所有,如有轉載請注明文章來源。
下一篇: PLC、DCS、FCS三大控
上一篇: 機器視覺運動控制一體