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