當(dāng)前位置: 首頁 > 工業(yè)電氣產(chǎn)品 > 端子與連接器 > 線路板連接器 > FFC連接器
發(fā)布日期:2022-04-25 點(diǎn)擊率:47
關(guān)鍵詞:正運(yùn)動(dòng)技術(shù),機(jī)器視覺,運(yùn)動(dòng)控制一體機(jī)
摘要:我們?cè)凇禫PLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)》的推文中,講述了基于形狀匹配的視覺定位功能,而BLOB斑點(diǎn)分析也可以實(shí)現(xiàn)定位功能。
我們?cè)凇禫PLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(三)》的推文中,講述了基于形狀匹配的視覺定位功能,而BLOB斑點(diǎn)分析也可以實(shí)現(xiàn)定位功能。
本期課程我們將在BLOB斑點(diǎn)分析定位的基礎(chǔ)上進(jìn)行檢測(cè)圓形,輸出圓心的坐標(biāo)數(shù)據(jù)。
一檢測(cè)原理
(一)BLOB斑點(diǎn)定位
BLOB斑點(diǎn)分析功能可以輸出BLOB區(qū)域的重心位置XY,BLOB斑點(diǎn)區(qū)域還可以擬合成特定形狀如外接矩形,輸出矩形的角度,從而實(shí)現(xiàn)定位的功能。
(二)BLOB分析的圓形檢測(cè)+示意圖
圓形測(cè)量器不具有定位功能,因此當(dāng)檢測(cè)目標(biāo)在視野的位置是隨機(jī)時(shí),我們需要配合定位功能將測(cè)量器跟隨目標(biāo)移動(dòng)。本節(jié)程序示例將檢測(cè)到的BLOB重心XY數(shù)據(jù)作為圓形測(cè)量器的中心XY值,即可實(shí)現(xiàn)位置跟隨功能。
二軟件演示
(一)檢測(cè)要求
使用ZDevelop軟件的ZBASIC編程語言編寫程序,用于檢測(cè)以下路徑中圖片的圓環(huán)零件的圓心位置XY以及半徑。
使用到的視覺功能:BLOB斑點(diǎn)分析+檢測(cè)圓形+九點(diǎn)標(biāo)定。
(二)實(shí)例演示
1.打開ZDevelop軟件:新建項(xiàng)目→新建HMI文件→新建main.bas文件,用于編寫界面響應(yīng)函數(shù)→新建global_variable.bas文件用于定義全局變量并開啟HMI自動(dòng)運(yùn)行任務(wù)→新建detectParam.bas文件,用于初始化測(cè)量參數(shù)→新建camera.bas文件用于實(shí)現(xiàn)相機(jī)采集功能→文件添加到項(xiàng)目。
2.設(shè)計(jì)HMI界面。
3.在global_variable.bas文件中添加全局變量。
'''''全局變量大部分使用數(shù)組結(jié)構(gòu)'''''
''注:basic編程中很多函數(shù)會(huì)以TABLE(系統(tǒng)的數(shù)據(jù)結(jié)構(gòu))做為參數(shù)
''table 說明 table 說明
''0 ' 自動(dòng)二值化閾值 11~12 鼠標(biāo)操作時(shí)獲取的坐標(biāo)
''2 亮區(qū)域的面積 20~24 圖像信息
''4 暗區(qū)域的面積 6 連通區(qū)域的數(shù)量
''40~42 小圓斑點(diǎn)的面積和位置X,Y數(shù)據(jù) 81~98 標(biāo)定圖像坐標(biāo)xy
''46~48 小圓圓心X,Y和半徑 131~148 標(biāo)定世界坐標(biāo)xy
''39 提取mark點(diǎn)成功標(biāo)志 56~57 圓點(diǎn)矩陣行列數(shù)
''49~50 圓上的點(diǎn)坐標(biāo)
'主任務(wù)狀態(tài)
'0 - 未初始化
'1 - 停止
'2 - 運(yùn)行中
'3 - 正在停止
GLOBAL DIM main_task_state
main_task_state = 1
'采集開關(guān)
'0 - 停止采集
'1 - 請(qǐng)求采集
GLOBAL DIM grab_switch
grab_switch = 0
'相機(jī)個(gè)數(shù)
GLOBAL cam_num
cam_num = 0
'相機(jī)種類,"zmotion;mvision;basler;mindvision;huaray"
GLOBAL DIM CAMERA_TYPE(16)
CAMERA_TYPE = "mvision"
' 定義主任務(wù)id - 10
GLOBAL DIM main_task_id
main_task_id = 10
'定義連續(xù)采集任務(wù)id - 9
GLOBAL DIM grab_task_id
grab_task_id = 9
'定義全局圖像變量
GLOBAL ZVOBJECT grabImg '采集圖像
GLOBAL ZVOBJECT binImg '二值化圖像
GLOBAL ZVOBJECT disImg '顯示圖像
'定義常用顏色變量
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)
'檢測(cè)參數(shù):閾值模式(自動(dòng)閾值或手動(dòng)閾值)、低閾值、高閾值、最小面積、最大面積
GLOBAL DIM d_detect_param(5) 'd開頭表示數(shù)據(jù)結(jié)構(gòu)
'開/閉運(yùn)算參數(shù)
GLOBal DIM d_deal_value(2)
'檢測(cè)消耗時(shí)間
GLOBal DIM d_detect_time
'小圓的位置x/y結(jié)果
GLOBal DIM d_circle_rst(18)
'顯示打印的字符
GLOBAL ShowString(64)
'***********定義坐標(biāo)標(biāo)定相關(guān)變量*********************
'是否標(biāo)定
GLOBAL DIM is_ca_success
'定義標(biāo)定成功標(biāo)志,0-標(biāo)定未成功,1-標(biāo)定成功
GLOBAL DIM d_calib_success
d_calib_success = 0
'定義標(biāo)定系數(shù)即矩陣轉(zhuǎn)換系數(shù)
GLOBAL ZVOBJECT ca_param
'定義標(biāo)定參數(shù)數(shù)組,依次為:標(biāo)定類型、對(duì)比度、極性、最小面積、最大面積、世界坐標(biāo)點(diǎn)間距
GLOBAL DIM d_ca_param(6) 'd開頭表示數(shù)據(jù)結(jié)構(gòu)
'定義是否使用標(biāo)定功能
GLOBAL DIM d_use_calib
d_use_calib=0
'定義標(biāo)定誤差,依次為最小誤差、最大誤差、平均誤差
GLOBAL DIM ca_min_err,ca_max_err,ca_avg_err
ca_min_err = 0
ca_max_err = 0
ca_avg_err = 0
'***********定義讀取本地文件功能相關(guān)變量**************
''注意,該功能只在使用仿真器時(shí)有效
'定義是否使用本地圖片標(biāo)志
GLOBAL DIM d_use_imgfile
'定義本地圖片索引
GLOBAL DIM d_index
'定義讀取圖片的路徑
GLOBAL DIM File_Name(100)
'***********結(jié)束定義讀取本地文件功能相關(guān)變量**********
'運(yùn)行HMI文件
RUN "Hmi.hmi",1
4.關(guān)聯(lián)HMI界面控件變量。
5.在detectParam.bas文件中初始化測(cè)量參數(shù)。
end
GLOBAL SUB init_detect_param() '初始化測(cè)量參數(shù)
d_deal_value(0)=1 '初始化開/閉運(yùn)算參數(shù)
d_deal_value(1)=1
'初始化檢測(cè)參數(shù):閾值模式(自動(dòng)閾值 = 1 或 手動(dòng)閾值 = 0)、低閾值、高閾值、極性(黑或白)、最大、最小、反向(即結(jié)果取反,成功變成失敗、失敗變成成功)
d_detect_param(0) = 0 '手動(dòng)閾值
d_detect_param(1) = 140 '低閾值
d_detect_param(2) = 255 '高閾值
d_detect_param(3) = 11000 '最小面積即像素個(gè)數(shù)
d_detect_param(4) = 12000 '最大面積
d_use_imgfile = 1 '默認(rèn)使用本地圖片
d_index = 0
TABLE(6)=0 '將小圓數(shù)量初始化為0
for i=0 to 17
d_circle_rst(i)=0
next
'初始化坐標(biāo)標(biāo)定相關(guān)的變量
d_ca_param(0) = 0 '標(biāo)定類型
d_ca_param(1) = 120 '對(duì)比度
d_ca_param(2) = 0 '極性
d_ca_param(3) = 80 '最小面積
d_ca_param(4) = 20000 '最大面積
d_ca_param(5) = 9 '世界坐標(biāo)點(diǎn)間距
ca_min_err = 0 '最小誤差
ca_max_err = 0 '最大誤差
ca_avg_err = 0 '平均誤差
for i=0 to 17 '初始化圓點(diǎn)矩陣像素坐標(biāo)
TABLE(81+i)=0
next
for i=0 to 17 '初始化圓點(diǎn)矩陣世界坐標(biāo)
TABLE(131+i)=0
next
TABLE(39)=0 '提取mark點(diǎn)狀態(tài)默認(rèn)為失敗
END SUB
6.在main.bas文件中添加界面初始化函數(shù),并在hmi系統(tǒng)設(shè)置中關(guān)聯(lián)初始化函數(shù)名。
end
'注:
'凡是要使用Region有關(guān)的算子在系統(tǒng)初始化時(shí)都要調(diào)用ZV_RESETCLIPSIZE(width, height)這個(gè)算子設(shè)置下圖像尺寸,以滿足相機(jī)分辨率,因?yàn)槟J(rèn)的是640*480尺寸
'HMI界面初始化函數(shù)
GLOBAL SUB hmi_init()
grab_switch = 0 '停止采集
main_task_state = 1 '主任務(wù)停止運(yùn)行
ZV_RESETCLIPSIZE(1280, 960) '依據(jù)圖像分辨率設(shè)置區(qū)域的裁剪尺寸,此處圖像分辨率為1280x960
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 7), HMI_ConTROLSIZEY(10, 7)) '設(shè)置鎖存的大小
init_detect_param() '初始化測(cè)量參數(shù)
ZV_SETSYSDBL("CamGetTimeout", 1000) '設(shè)置采集超時(shí)
ZV_SETSYSINT("LineWidth",6)
ZV_LATCHCLEAR(0) '清空鎖存通道0
END SUB
7.在camera.bas文件中添加HMI運(yùn)行界面中采集相關(guān)按鈕響應(yīng)的函數(shù)并關(guān)聯(lián)動(dòng)作函數(shù)。
圖片
相機(jī)操作相關(guān)按鈕
end
'主界面按下掃描相機(jī)按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB cam_scan_all()
if(d_use_imgfile=1)then
?"請(qǐng)先按下使用本地圖片按鈕關(guān)閉該功能"
return
endif
ZV_SETSYSINT("LogLevel", 7) '設(shè)置控制器信息
ZV_SETSYSSTR("DataDir","")
CAM_SCAN(CAMERA_TYPE) '掃描相機(jī),CAMERA_TYPE="mvision"
cam_num = CAM_COUNT() '獲取掃描到的相機(jī)數(shù)量
if (0 = cam_num) then '如果相機(jī)數(shù)量=0,打印提示信息
? "未找到相機(jī)"
return '退出子函數(shù),不往下執(zhí)行
endif
?"cam_num = " cam_num '如果掃描到相機(jī),打印相機(jī)數(shù)量
CAM_SEL(0) '選擇掃描到的第一個(gè)相機(jī)進(jìn)行操作
CAM_SETEXPOSURE(5000) '設(shè)置相機(jī)曝光時(shí)間為5000us
CAM_SETMODE(0) '設(shè)置軟件觸發(fā)模式
CAM_START(0) '開啟相機(jī)
END SUB
'主界面按下單次采集按鈕執(zhí)行的函數(shù)
GLOBAL SUB btn_grab()
''如果d_use_imgfile=1時(shí)使用讀取本地圖片功能,該功能只在使用仿真器時(shí)有效,使用控制器時(shí)請(qǐng)將此部分代碼注釋掉
if (d_use_imgfile=1) then
if(d_index=3) then
d_index=0
endif
File_Name="圓定位"+TOSTR(d_index,1,0)+".bmp" '.../flash/圓定位/目錄下的圖片所在的路徑名稱
ZV_IMGREAD(grabImg,File_Name,0)
ZV_LATCH(grabImg, 0)
d_index=d_index+1
return
endif
''讀取本地圖片功能結(jié)束
if cam_num = 0 then
?"請(qǐng)先掃描相機(jī)!"
return
endif
CAM_SETPARAM("TriggerSoftware", 0) '發(fā)送觸發(fā)指令
CAM_GET(grabImg, 0) '獲取一幀圖像存放到grabImg變量中
ZV_LATCH(grabImg, 0) '將圖像顯示到鎖存通道0中
END SUB
'主界面按下連續(xù)采集按鈕響應(yīng)的函數(shù)
GLOBAL SUB btn_cgrab()
if grab_switch =1 then '如果已經(jīng)處于連續(xù)執(zhí)行狀態(tài),打印提示信息并退出函數(shù)
?"正在連續(xù)運(yùn)行中,請(qǐng)勿重復(fù)操作!"
return
endif
if( d_use_imgfile =0) then
if cam_num = 0 then '如果相機(jī)數(shù)量=0,打印提示信息并退出函數(shù)
?"請(qǐng)先掃描相機(jī)!"
return
endif
endif
grab_switch = 1 '采集任務(wù)開關(guān)置1
if (1 = grab_switch) then
if (0 = PROC_STATUS(grab_task_id)) then
RUNTASK grab_task_id, grab_task '開啟連續(xù)采集任務(wù)
endif
endif
END SUB
'采集任務(wù)實(shí)現(xiàn)函數(shù)
grab_task:
while(1)
if (0 = grab_switch) then '如果采集任務(wù)開關(guān)=0即停止采集按鈕按下時(shí)
exit while '退出循環(huán)
endif
'重復(fù)執(zhí)行以下操作
btn_grab()
wend
END
'主界面按下停止采集按鈕響應(yīng)的函數(shù)
GLOBAL SUB btn_stopCgrab()
if grab_switch =0 then '如果已經(jīng)處于停止采集狀態(tài),打印提示信息并退出函數(shù)
?"未開啟連續(xù)采集!"
return
endif
grab_switch = 0 '將采集任務(wù)開關(guān)置0
END SUB
8.點(diǎn)擊“元件”→“新建窗口”,新建標(biāo)定界面窗口,并將《VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(六)》中的標(biāo)定程序的界面拷貝到新建的窗口界面。
9.在main.bas文件中添加運(yùn)行界面按下【標(biāo)定】按鈕時(shí)的響應(yīng)函數(shù),以及標(biāo)定窗口界面按下【提取mark點(diǎn)】按鈕、【標(biāo)定】按鈕以及【返回】按鈕時(shí)響應(yīng)的函數(shù),可參考《VPLC系列機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)快速入門(六)》中的標(biāo)定程序。
'點(diǎn)擊運(yùn)行界面按下標(biāo)定按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_calib()
'設(shè)置坐標(biāo)標(biāo)定窗口鎖存通道0的鎖存大小
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(11, 91), HMI_ConTROLSIZEY(11, 91))
if (d_use_imgfile=1) then '如果使用本地圖片功能
ZV_IMGREAD(grabImg,"圓定位calib.bmp",0) '加載標(biāo)定圖片
endif
ZV_LATCHCLEAR(0) '將鎖存通道0清空
ZV_LATCH(grabImg, 0) '顯示采集圖像顯示到鎖存通道0中
HMI_SHOWWINDOW(11) '彈出窗口號(hào)為11的坐標(biāo)標(biāo)定窗口界面
END SUB
'坐標(biāo)標(biāo)定界面按下提取mark點(diǎn)按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_ca_extract()
for i=0 to 17 '初始化圓點(diǎn)矩陣像素坐標(biāo)
TABLE(81+i)=0
next
for i=0 to 17 '初始化圓點(diǎn)矩陣世界坐標(biāo)
TABLE(131+i)=0
next
TABLE(39)=0 '提取mark點(diǎn)狀態(tài)默認(rèn)為失敗
ZVOBJECT inppts, ppts, wpts
'根據(jù)提取像素參數(shù)提取像素坐標(biāo),存放到inppts矩陣中
ZV_CALGETSCAPTS(grabImg, inppts, d_ca_param(1), d_ca_param(2), d_ca_param(3), d_ca_param(4))
'獲取矩陣inppts中的數(shù)據(jù)信息,存放到table(56)中
ZV_MATINFO (inppts, 56)
DIM row,col
row = TABLE(56) '矩陣行數(shù)賦值給row變量
col = TABLE(57) '矩陣列數(shù)賦值給col變量
if(row * col = 18) then '如果獲取到9個(gè)圓點(diǎn)的圓心位置坐標(biāo)x,y
TABLE(39) = 1 '窗口界面提示提取mark點(diǎn)成功
else
TABLE(39) = 0 '窗口界面提示提取mark點(diǎn)失敗
return '返回子函數(shù),不往下執(zhí)行
endif
'根據(jù)mrak點(diǎn)間距和像素坐標(biāo)計(jì)算世界坐標(biāo),存放到wpts矩陣
ZV_CALGETPTSMAP(inppts,ppts,wpts,d_ca_param(5))
'獲取矩陣ppts中的數(shù)據(jù)信息,存放到table(56)中
ZV_MATINFO (ppts, 56)
row = TABLE(56) '矩陣行數(shù)賦值給row變量
col = TABLE(57) '矩陣列數(shù)賦值給col變量
if(row * col = 18) then'如果獲取到9個(gè)圓點(diǎn)的圓心位置坐標(biāo)x,y
TABLE(39) = 1 '窗口界面提示提取mark點(diǎn)成功
else
TABLE(39) = 0 '窗口界面提示提取mark點(diǎn)失敗
return '返回子函數(shù),不往下執(zhí)行
endif
'像素坐標(biāo)和世界坐標(biāo)放入table中
DIM i
FOR i=0 TO row-1
ZV_MATGETROW (ppts, i, col, 81 + i*col)'將像素坐標(biāo)存放到table81~table98中
ZV_MATGETROW (wpts, i, col, 131 + i*col)'將世界坐標(biāo)存放到table131~table148中
NEXT
'將灰度圖轉(zhuǎn)成RGB圖像,作為結(jié)果圖像
ZVOBJECT color
ZV_GRAYTORGB(grabImg, color)
'繪制mark點(diǎn)的十字架
DIM j, pixNum
pixNum = 0
FOR i=0 TO 2
FOR j=0 TO 2
'繪制mark標(biāo)記點(diǎn)
ZV_MARKER(color, TABLE(81 + 2 * pixNum), TABLE(81 + 2 * pixNum + 1), 0, 40, C_GREEN)
pixNum = pixNum + 1
NEXT
NEXT
'用文本繪制mark點(diǎn)的序號(hào),顯示在圖像界面中
FOR i=0 TO 8
ZV_TEXT (color, TOSTR(i,1,0), TABLE(81+2*i)-20, TABLE(81+2*i +1)-40, 80, C_RED)
NEXT
ZV_LATCH(color, 0)'顯示結(jié)果圖像
END SUB
'坐標(biāo)標(biāo)定界面按下標(biāo)定按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_ca_calib()
ZV_IMGINFO(grabImg,0) '獲取采集圖像信息
'根據(jù)像素坐標(biāo)數(shù)據(jù)組和世界坐標(biāo)數(shù)據(jù)組執(zhí)行標(biāo)定,獲得標(biāo)定系數(shù)ca_param
ZV_CALCAM(ppts,wpts,ca_param,TABLE(0),TABLE(1),d_ca_param(0))
is_ca_success=1 '標(biāo)定成功標(biāo)志置1
ZV_CALERROR(ca_param, ppts, wpts, 0)'計(jì)算標(biāo)定誤差,并將結(jié)果存放在起始地址為0的數(shù)組中
ca_min_err = TABLE(1) '將誤差結(jié)果賦值給變量,用于在界面中實(shí)時(shí)顯示誤差結(jié)果
ca_max_err = TABLE(2)
ca_avg_err = TABLE(0)
END SUB
'坐標(biāo)標(biāo)定界面按下返回按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_ca_param_rtn()
ZV_LATCHCLEAR(0) '將鎖存通道0清空
ZV_LATCHSETSIZE(0, HMI_ConTROLSIZEX(10, 7), HMI_ConTROLSIZEY(10, 7)) '設(shè)置鎖存的大小
btn_grab()
HMI_CLOSEWINDOW(11) '關(guān)閉窗口號(hào)為13的坐標(biāo)標(biāo)定窗口界面
END SUB
10.在main.bas文件中添加HMI運(yùn)行界面按下測(cè)試按鈕響應(yīng)的函數(shù),并關(guān)聯(lián)動(dòng)作函數(shù)名。
'HMI界面按下測(cè)試按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_test()
TABLE(6)=0 '檢測(cè)前先將結(jié)果數(shù)據(jù)清0
d_detect_time=0
for i=0 to 17
d_circle_rst(i)=0
next
TICKS=0
'定義變量,依次為白色像素連通區(qū)域,掩模區(qū)域,黑色像素連通區(qū)域,連通區(qū)域結(jié)果列表,小圓斑點(diǎn)區(qū)域,圓測(cè)量器,中間結(jié)果變量
ZVOBJECT regionWhite, regionMask, regionBlack,re_connecte,circle_connect,mr,tmp
'生成全圖像區(qū)域
ZV_REGENFULLIMG(grabImg,regionMask)
'二值化處理
if d_detect_param(0) = 0 then '如果選擇手動(dòng)閾值模式
'根據(jù)低閾值和高閾值參數(shù)生成白色像素圖像regionWhite
ZV_RETHRESH(grabImg, regionMask, regionWhite, d_detect_param(1), d_detect_param(2))
'對(duì)白色像素區(qū)域進(jìn)行一次1*1的開運(yùn)算
ZV_REOPENING(regionWhite,regionWhite,d_deal_value(0),d_deal_value(0))
'對(duì)白色像素區(qū)域進(jìn)行一次1*1的閉運(yùn)算
ZV_RECLOSING(regionWhite,regionWhite,d_deal_value(1),d_deal_value(1))
else '如果選擇自動(dòng)閾值模式
Dim autoThresh '定義自動(dòng)閾值模式下的二值化閾值
'在grabImg圖像中的指定區(qū)域內(nèi)對(duì)圖像進(jìn)行自動(dòng)二值化處理,輸出二值化區(qū)域regionWhite
ZV_REAUTOTHRESH(grabImg, regionMask, regionWhite, 0)
'對(duì)白色像素區(qū)域進(jìn)行一次1*1的開運(yùn)算
ZV_REOPENING(regionWhite,regionWhite,d_deal_value(0),d_deal_value(0))
'對(duì)白色像素區(qū)域進(jìn)行一次1*1的閉運(yùn)算
ZV_RECLOSING(regionWhite,regionWhite,d_deal_value(1),d_deal_value(1))
autoThresh = TABLE(0)
? "autoThresh = " autoThresh '打印提示信息,當(dāng)前二值化閾值
endif
'計(jì)算BLOB面積
ZV_REAREA(regionWhite, 2) '計(jì)算regionWhite亮區(qū)域的面積,存放到table(2)中
if(TABLE(2)>0) then '如果獲取到的白色像素?cái)?shù)量大于0
ZV_REConNECT(regionWhite,re_connecte) '計(jì)算區(qū)域的連通區(qū)域,存放到re_connecte列表中
zv_refilter(re_connecte,0,d_detect_param(3),d_detect_param(4),0)'對(duì)區(qū)域列表中的區(qū)域進(jìn)行過濾,保留面積在 d_detect_param(3) 到 d_detect_param(4) 的區(qū)域,面積不在此范圍的區(qū)域?qū)⒈贿^濾掉
zv_refilter(re_connecte,20,0.8,1.3,0)'對(duì)區(qū)域列表中的區(qū)域進(jìn)行過濾,保留最小外接矩形高寬比在0.9 到 1.1 的區(qū)域,面積不在此范圍的區(qū)域?qū)⒈贿^濾掉
ZV_RESORT(re_connecte,1,1) '對(duì)區(qū)域列表中的區(qū)域按照重心X的數(shù)據(jù)進(jìn)行升序排序
ZV_LISTCOUNT(re_connecte,6) '獲取列表中的連通區(qū)域的數(shù)量,存放到table(6)中
endif
'繪制效果圖
Dim width, height
ZV_IMGINFO (grabImg, 20)'獲取grabImg的圖像信息
width = TABLE(20)
height = TABLE(21)
ZV_GRAYTORGB(grabImg,disImg)'將灰度圖轉(zhuǎn)換到RGB圖像,用于繪制檢測(cè)結(jié)果圖像
ZV_REGION(disImg, regionMask, 0, ZV_COLOR(0,0,0)) '在disImg中繪制黑色的regionMask區(qū)域
ZV_REGION(disImg, regionWhite, 0, ZV_COLOR(255,255,255))'在disImg中繪制白色的regionWhite區(qū)域
for i=0 to TABLE(6)-1 '循環(huán)獲取小圓斑點(diǎn)的位置XY信息生成圓測(cè)量器,檢測(cè)圓心位置
ZV_LISTGET(re_connecte,circle_connect,i) '獲取列表中序號(hào)為i的元素,即依次獲取列表中小圓斑點(diǎn)的連通區(qū)域
ZV_REAREACENTER(circle_connect,40) '計(jì)算斑點(diǎn)區(qū)域的面積與中心位置,將位置放入TABLE(40)中
ZV_MRGENCIRCLE(mr,TABLE(41),TABLE(42),70,50,0,360,1,10,8) '生成圓測(cè)量區(qū)域
'設(shè)置測(cè)量參數(shù),包括濾波尺寸、邊緣閾值、邊緣極性和邊緣位置
ZV_MRSETADV(mr,5, 50, 1,0)
TABLE( 46, 0, 0, 0)'初始化結(jié)果數(shù)組
'測(cè)量圓,并將結(jié)果賦值給起始地址為46的數(shù)組
ZV_MRCIRCLE(mr, grabImg, tmp, 46)
ZV_CIRCLE(disImg,TABLE(46),TABLE(47),TABLE(48),zv_color(0,255,0))'繪制小圓結(jié)果
ShowString=TOSTR(i,1,0) '將BLOB的數(shù)量轉(zhuǎn)換成字符串變量
ZV_TEXT(disImg,ShowString,TABLE(46),TABLE(47),55,ZV_COLOR(0,0,255)) '顯示結(jié)果文本
ZV_MARKER(disImg,TABLE(46),TABLE(47),0,50,zv_color(0,255,0)) '在圖像img中繪制十字
if is_ca_success=1 AND d_use_calib=1 then
ZV_CALTRANSW(ca_param, TABLE(46)+TABLE(48),TABLE(47),49) '圓心加半徑的坐標(biāo)
ZV_CALTRANSW(ca_param, TABLE(46),TABLE(47),46) '使用標(biāo)定系數(shù)將圖像坐標(biāo)轉(zhuǎn)換成世界坐標(biāo)
d_circle_rst(i*3+0)=TABLE(46)'將測(cè)量圓的結(jié)果賦值給圓心變量,顯示到界面中
d_circle_rst(i*3+1)=TABLE(47)
d_circle_rst(i*3+2)=ZV_DISTPP(TABLE(46),TABLE(47),TABLE(49),TABLE(50))
else
d_circle_rst(i*3+0)=TABLE(46)'將測(cè)量圓的結(jié)果賦值給圓心變量,顯示到界面中
d_circle_rst(i*3+1)=TABLE(47)
d_circle_rst(i*3+2)=TABLE(48)
endif
next
ZV_LATCH(disImg, 0) '在鎖存通道0中顯示結(jié)果圖像
d_detect_time=ABS(TICKS)'計(jì)算檢測(cè)消耗時(shí)間
END SUB
11.在main.bas文件中添加HMI運(yùn)行界面按下運(yùn)行按鈕響應(yīng)的函數(shù),并關(guān)聯(lián)動(dòng)作函數(shù)名。
'HMI界面按下運(yùn)行按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_run()
if(2 = main_task_state) then '如果主任務(wù)處于運(yùn)行狀態(tài),打印提示信息并退出函數(shù)
?"已經(jīng)開啟連續(xù)運(yùn)行任務(wù),請(qǐng)勿重復(fù)操作!"
return
endif
if (1 = main_task_state) then '如果主任務(wù)處于停止?fàn)顟B(tài)
if (0 = PROC_STATUS(main_task_id)) then '如果任務(wù)未開啟
main_task_state = 2 '主任務(wù)狀態(tài)設(shè)置為2,表示正在執(zhí)行連續(xù)任務(wù)
RUNTASK main_task_id, main_task '開啟主任務(wù)
endif
endif
END SUB
'主任務(wù)實(shí)現(xiàn)函數(shù)
main_task:
while(1)
if (3 = main_task_state) then '如果主任務(wù)狀態(tài)處于3即按下停止按鈕時(shí)
main_task_state = 1 '將主任務(wù)狀態(tài)置為1
exit while '退出循環(huán)
endif
'重復(fù)執(zhí)行采集和檢測(cè)函數(shù)
btn_grab()
btn_test()
wend
END
12.在main.bas文件中添加HMI運(yùn)行界面按下停止按鈕響應(yīng)的函數(shù),并關(guān)聯(lián)動(dòng)作函數(shù)名。
'HMI界面按下停止按鈕時(shí)響應(yīng)的函數(shù)
GLOBAL SUB btn_stop()
if (2 = main_task_state) then '如果主任務(wù)狀態(tài)處于3即正在連續(xù)執(zhí)行任務(wù)時(shí)
main_task_state = 3 '將主任務(wù)狀態(tài)置為3,退出循環(huán)
endif
END SUB
仿真演示效果4
本次,正運(yùn)動(dòng)技術(shù)機(jī)器視覺運(yùn)動(dòng)控制一體機(jī)應(yīng)用例程(三) BLOB分析的多圓定位,就分享到這里。
更多精彩內(nèi)容請(qǐng)關(guān)注“正運(yùn)動(dòng)小助手”公眾號(hào),需要相關(guān)開發(fā)環(huán)境與例程代碼,請(qǐng)咨詢正運(yùn)動(dòng)技術(shù)銷售工程師:400-089-8936。
本文由正運(yùn)動(dòng)技術(shù)原創(chuàng),歡迎大家轉(zhuǎn)載,共同學(xué)習(xí),一起提高中國(guó)智能制造水平。文章版權(quán)歸正運(yùn)動(dòng)技術(shù)所有,如有轉(zhuǎn)載請(qǐng)注明文章來源。
下一篇: PLC、DCS、FCS三大控