內(nèi)容回顧
回顧上節(jié)課程我們對(duì)運(yùn)動(dòng)控制+機(jī)器視覺(jué)的例程Demo的系統(tǒng)參數(shù)的設(shè)置和配方文件的管理兩大模塊進(jìn)行了大致的介紹,接下來(lái)我們將對(duì)相機(jī)標(biāo)定和形狀匹配這兩個(gè)功能進(jìn)行介紹。
相機(jī)標(biāo)定的目的是將像素坐標(biāo)和世界坐標(biāo)建立關(guān)系,形狀匹配的目的是獲取目標(biāo)圖形在圖像中的像素坐標(biāo),將相機(jī)標(biāo)定和形狀匹配結(jié)合即可導(dǎo)出目標(biāo)圖形在空間上的世界坐標(biāo)。
01相機(jī)標(biāo)定
一、標(biāo)定板標(biāo)定和九點(diǎn)標(biāo)定的介紹
1.標(biāo)定板方式標(biāo)定
將標(biāo)定板放入現(xiàn)場(chǎng)被測(cè)物體同一平面,通過(guò)相機(jī)對(duì)標(biāo)定板進(jìn)行取像,然后視覺(jué)獲取標(biāo)定板圖像中n個(gè)特征點(diǎn)的像素坐標(biāo)。接著記錄每個(gè)特征點(diǎn)的世界坐標(biāo)。特征點(diǎn)世界坐標(biāo)獲取方式可利用手動(dòng)運(yùn)動(dòng)使機(jī)臺(tái)的探針去對(duì)特征點(diǎn)的中心獲取。那么使用這n對(duì)像素坐標(biāo)和世界坐標(biāo)則可對(duì)相機(jī)進(jìn)行標(biāo)定,標(biāo)定出相機(jī)坐標(biāo)系和世界坐標(biāo)系轉(zhuǎn)換關(guān)系。
2.九點(diǎn)方式標(biāo)定
利用視覺(jué)定位特征點(diǎn)的方式獲取圖像特征點(diǎn)像素坐標(biāo),定位特征點(diǎn)可采用的方法有形狀匹配、Blob定位、圓定位等。首先保證目標(biāo)不動(dòng),機(jī)臺(tái)控制相機(jī)以九宮格形式移動(dòng)九次并拍照采集九幅圖像從而獲得九個(gè)特征點(diǎn)的像素坐標(biāo)。移動(dòng)一次拍照視覺(jué)定位一次,每次移動(dòng)拍照時(shí)要保證目標(biāo)在相機(jī)視野之內(nèi),同時(shí)讀出機(jī)臺(tái)的世界坐標(biāo)。那么使用這九對(duì)像素坐標(biāo)和世界坐標(biāo)進(jìn)行相機(jī)標(biāo)定,就可以標(biāo)定出像素坐標(biāo)系和世界坐標(biāo)系的轉(zhuǎn)換關(guān)系。
二、九點(diǎn)標(biāo)定人機(jī)界面交互流程分析

三、標(biāo)定界面的設(shè)計(jì)

先在上一個(gè)界面(CCD偏置界面)打開連續(xù)采集,然后手動(dòng)運(yùn)動(dòng)使Mark點(diǎn)位于相機(jī)視野中間。然后進(jìn)入該界面點(diǎn)擊“1.0、顯示ROI”,通過(guò)ROI矩形框?qū)ark點(diǎn)進(jìn)行框選,接著點(diǎn)擊“1.1、創(chuàng)建形狀模板”。
形狀模板創(chuàng)建完成后進(jìn)行X間隔和Y間隔的設(shè)置,然后點(diǎn)擊“2、開始自動(dòng)標(biāo)定”,等待標(biāo)定完成即可。
注意:需要設(shè)置合適的間隔,保證九個(gè)拍照位都可以拍到Mark點(diǎn)。
四、九點(diǎn)標(biāo)定代碼
?
? ? ? ? ? ?'/************************************************************
? ? ? ? ? ?'函數(shù)功能:? 自動(dòng)標(biāo)定
? ? ? ? ? ?'Input:? ? 無(wú)
? ? ? ? ? ?'Output:? ?無(wú)?
? ? ? ? ? ?'返回值:? ?無(wú)
? ? ? ? ? ?'備注:? ? ?標(biāo)定需要一段時(shí)間,防止卡界面需要開線程。
? ? ? ? ? ?'*************************************************************/
? ? ? ? ? ?GLOBAL SUB RunNineCalib()
? ? ? ? ? ? ? ? ? ? if gv_CurProgrState=3 then?
? ? ? ? ? ? ? ? ? ?'如果是停止?fàn)顟B(tài)
? ? ? ? ? ? ? ? ? ? ? ? ?STOPTASK 2
? ? ? ? ? ? ? ? ? ? ? ? ?RUNTASK 2,NineCalib()
? ? ? ? ? ? ? ? ? endif
? ? ? ? ?ENDSUB
?
?
? ? ? ? ?GLOBAL SUB NineCalib()
? ? LOCAL lv_CalI,lv_CalJ
? ? LOCAL lv_DposX, lv_DposY, lv_Num
? ? ZVOBJECT MatchsCal
? ? '設(shè)置自動(dòng)標(biāo)定速度
? ? for i=0 to gc_AxisNum-1?
? ? ? ? SPEED(i) = 20
? ? next
? ? '更新自動(dòng)標(biāo)定Z軸高度
? ? TABLE(212) = TABLE(202)
? ? '讀取模板
? ? ZV_READSHAPEMOD(gv_CurShapeMod,"/zmc/flash/ShapeCal.zvb")
? ? '更新X,Y間隔
? ? VR(190)=TABLE(250)
? ? VR(191)=TABLE(251)
? ? '更新第一個(gè)拍照位的位置
? ? lv_DposX = DPOS(gc_Axis_X)-VR(190)
? ? lv_DposY = DPOS(gc_Axis_Y)-VR(191)
? ? lv_Num=0
? ? '當(dāng)前狀態(tài)設(shè)置成自動(dòng)標(biāo)定狀態(tài)
? ? gv_CurProgrState=4
? ? FOR lv_CalI = 0 to 2?
? ? ? ? FOR lv_CalJ = 0 to 2?
? ? ? ? ? ? '每次循環(huán)進(jìn)行移動(dòng)一次
? ? ? ? ? ? MOVEABS( lv_DposX + lv_CalJ * VR(190), lv_DposY + lv_CalI * VR(191))?
? ? ? ? ? ? WAIT until IDLE(0)?
? ? ? ? ? ? DELAY(200)
? ? ? ? ? ? CamGrab()
? ? ? ? ? ? '匹配獲取像素坐標(biāo)
? ? ? ? ? ? ZV_GAUSSBLUR(gv_GrabImg, gv_GrabImg, 3)
? ? ? ? ? ? ZV_SHAPEFIND(gv_CurShapeMod, gv_GrabImg, MatchsCal, gv_match_param(0), gv_match_param(1), gv_match_param(2), gv_match_param(3),? ? ? ? ? ? ? ? ? ? ? ?gv_match_param(4), gv_match_param(5), gv_match_param(6))
? ? ? ? ? ? DELAY(50)
? ? ? ? ? ? '獲取結(jié)果
? ? ? ? ? ? TABLE(50)=0
? ? ? ? ? ? ZV_MATGETROW(MatchsCal,0,5,50)
? ? ? ? ? ? TRACE "像素坐標(biāo):"table(51),table(52)
? ? ? ? ? ? if TABLE(50) < 85 then?
? ? ? ? ? ? ? ? ga_OperaTips="標(biāo)定NG,請(qǐng)重新標(biāo)定"
? ? ? ? ? ? ? ? HMI_SHOWWINDOW(50,6)
? ? ? ? ? ? ? ? '當(dāng)前狀態(tài)設(shè)置成停止?fàn)顟B(tài)
? ? ? ? ? ? ? ? gv_CurProgrState=3
? ? ? ? ? ? ? ? return?
? ? ? ? ? ? endif
? ? ? ? ? ? '灰度圖轉(zhuǎn)RGB圖
? ? ? ? ? ? ZV_GRAYTORGB(gv_GrabImg, gv_ShapeRgbImg)? ??
? ? ? ? ? ? '計(jì)算剛性矩陣
? ? ? ? ? ? ZV_GETRIGIDVECTOR(gv_RigidMat, 0, 0, 0, TABLE(51), TABLE(52), TABLE(53))??
? ? ? ? ? ? '進(jìn)行輪廓仿射變換
? ? ? ? ? ? ZV_CONTAFFINE(gv_ShapeContlist, gv_RigidMat, gv_ShapeContlistAff)
? ? ? ? ? ? ZV_CONTLIST(gv_ShapeRgbImg, gv_ShapeContlistAff, V_GREEN, 0)
? ? ? ? ? ? ZV_LATCHCLEAR(0)
? ? ? ? ? ? ZV_LATCH(gv_ShapeRgbImg, 0)
? ? ? ? ? ? '將像素坐標(biāo)存入 TABLE 中?
? ? ? ? ? ? TABLE(161 + lv_Num*2) = TABLE(51)
? ? ? ? ? ? TABLE(162 + lv_Num*2) = TABLE(52)
? ? ? ? ? ? TRACE "像素坐標(biāo)",TABLE(51),TABLE(52)
? ? ? ? ? ? '將機(jī)臺(tái)世界坐標(biāo)存入 TABLE 中?
? ? ? ? ? ? TABLE(181 + lv_Num*2) = -(lv_CalJ * VR(190))?
? ? ? ? ? ? TABLE(182 + lv_Num*2) = -(lv_CalI * VR(191))
? ? ? ? ? ? '記錄自動(dòng)標(biāo)定時(shí)物體與相機(jī)中心的像素偏移量
? ? ? ? ? ? if lv_CalI=0 and lv_CalJ=0 then
? ? ? ? ? ? ? ? VR(103) = TABLE(51)
? ? ? ? ? ? ? ? VR(104) = TABLE(52)
? ? ? ? ? ? endif
? ? ? ? ? ? lv_Num = lv_Num + 1
? ? ? ? NEXT?
? ? NEXT?
? ? '將 TABLE 中的像素和世界坐標(biāo)轉(zhuǎn)換成矩陣存儲(chǔ)?
? ? ZV_MATGENDATA(gv_Ppts, 9, 2, 161)?
? ? ZV_MATGENDATA(gv_Wpts, 9, 2, 181)?
? ? '九次循環(huán)后進(jìn)行標(biāo)定
? ? gv_CalModeFlag=2
? ? ZV_CALCAM(gv_Ppts, gv_Wpts, gv_CalParam, gv_PhotoW, gv_PhotoH, 2)??
? ? '計(jì)算標(biāo)定誤差,TABLE(0),TABLE(1),TABLE(2)分別為平均誤差、最小誤差、最大誤差?
? ? ZV_CALERROR(gv_CalParam, gv_Ppts, gv_Wpts, 0)??
? ? TABLE(179) = TABLE(1)? '最小誤差
? ? TABLE(180) = TABLE(2)? '最大誤差
? ? TABLE(199) = TABLE(0)? '平均誤差
? ? ga_OperaTips="標(biāo)定OK"
? ? HMI_SHOWWINDOW(50,6)
? ? '當(dāng)前狀態(tài)設(shè)置成停止?fàn)顟B(tài)
? ? gv_CurProgrState=3
? ? '設(shè)置標(biāo)志位表示標(biāo)定成功
? ? MODBUS_BIT(152)=1
ENDSUB
?
五、標(biāo)定系數(shù)的應(yīng)用
下圖是相機(jī)第一個(gè)拍照位的視野情況和加工中心的情況。我們要知道如果系統(tǒng)上面的標(biāo)定方法標(biāo)定出來(lái)的像素坐標(biāo)和世界坐標(biāo)的關(guān)系是相機(jī)第一個(gè)拍照位相機(jī)視野上Mark點(diǎn)的位置的。
換句話說(shuō)就是,如果我們通過(guò)視覺(jué)獲得目標(biāo)位置的像素坐標(biāo),再通過(guò)標(biāo)定系數(shù)轉(zhuǎn)換成世界坐標(biāo),然后機(jī)臺(tái)通過(guò)運(yùn)動(dòng)指令進(jìn)行移動(dòng)到相應(yīng)位置,此時(shí)對(duì)準(zhǔn)目標(biāo)位置的不是相機(jī)中心而是向量A的起點(diǎn)位置。
而在我們實(shí)際加工中,是需要加工中心對(duì)準(zhǔn)該目標(biāo)位置,根據(jù)下圖信息可以知。因?yàn)橄蛄緼的起點(diǎn)和終點(diǎn)的像素坐標(biāo)已知,向量B也可以通過(guò)簡(jiǎn)單的對(duì)點(diǎn)方式計(jì)算出來(lái),所以可以很方便地計(jì)算出向量C。

?
像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)如下:
?

02視覺(jué)形狀匹配
一、形狀模板創(chuàng)建和形狀模板匹配指令

?

?
二、創(chuàng)建形狀模板界面設(shè)計(jì)

點(diǎn)擊“顯示ROI”,顯示出矩形ROI區(qū)域,通過(guò)移動(dòng)鼠標(biāo)將感興趣的區(qū)域框選起來(lái),然后點(diǎn)擊“創(chuàng)建形狀模板”即可完成模板創(chuàng)建。
三、形狀模板創(chuàng)建流程圖
?

四、創(chuàng)建形狀模板
'/************************************************************
'任務(wù)編號(hào):無(wú)
'函數(shù)功能:生成模板
'Input:無(wú)
'Output:無(wú)?
'返回值:無(wú)
'備注:無(wú)??
'*************************************************************/
GLOBAL SUB EstabShape(mode)
? ? IF mode <> 1 THEN
? ? ? ? 'Hmi ROI坐標(biāo)轉(zhuǎn) 圖像ROI
? ? ? ? ZV_POSTOIMG(0, 2, 74, 0)
? ? ? ? dv_RoiPos(0) = TABLE(0)
? ? ? ? dv_RoiPos(1) = TABLE(1)
? ? ? ? dv_RoiPos(2) = TABLE(2) - TABLE(0) + 1
? ? ? ? dv_RoiPos(3) = TABLE(3) - TABLE(1) + 1
? ? ? ? '生成模板圖像
? ? ? ? ZV_IMGGETSUB(gv_GrabImg, gv_ShapeImg, dv_RoiPos(0), dv_RoiPos(1), dv_RoiPos(2), dv_RoiPos(3))
? ? ? ? '生成模板區(qū)域
? ? ? ? ZV_REGENRECT(gv_ShapeRe, 0, 0, dv_RoiPos(2), dv_RoiPos(3))?
? ? ENDIF??
? ? '開始創(chuàng)建模板
? ? '設(shè)置創(chuàng)建模板等級(jí)
? ? ZV_SETSYSINT("ShapeCreateLevel",gv_mod_param(9))
? ? '清空之前創(chuàng)建的模板
? ? ZV_CLEAR(gv_CurShapeMod)
? ? '進(jìn)行創(chuàng)建模板
? ? ZV_SHAPECREATERE(gv_ShapeImg, gv_ShapeRe, gv_CurShapeMod, gv_mod_param(0), gv_mod_param(1), gv_mod_param(2), gv_mod_param(3), gv_mod_param(4), gv_mod_param(5), gv_mod_param(6), gv_mod_param(7), gv_mod_param(8))
? ? 'gv_CurShapeMod是剛剛創(chuàng)建的模板
? ? dv_CreaModel = 1
? ? '獲取模板的輪廓
? ? ZV_SHAPECONTOURS(gv_CurShapeMod, gv_ShapeContlist, 0)??
? ? '灰度圖像轉(zhuǎn)RGB圖象(主要繪制輪廓的時(shí)候用的)
? ? ZV_GRAYTORGB(gv_ShapeImg, gv_ShapeRgbImg)? ??
? ? '獲取圖片信息
? ? '0是TABLE 索引,圖像信息,5 個(gè)數(shù)據(jù),依次為寬、高、通道數(shù)、數(shù)據(jù)類型和基本像元大小??
? ? ZV_IMGINFO(gv_ShapeRgbImg, 0)??
? ? ZV_GETRIGIDVECTOR(gv_RigidMat, 0, 0, 0, TABLE(0)/2, TABLE(1)/2, 0)? '計(jì)算剛性變換矩陣(能對(duì)圖形進(jìn)行旋轉(zhuǎn)、平移等變換)? ??
? ? ZV_CONTAFFINE(gv_ShapeContlist, gv_RigidMat, gv_ShapeContlistAff)? '輪廓或輪廓序列仿射變換
? ? '繪制輪廓??
? ? ZV_CONTLIST(gv_ShapeRgbImg, gv_ShapeContlistAff, V_RED, 0)
? ? '鎖存通道1顯示清空? ??
? ? ZV_LATCHCLEAR(1)
? ? '顯示創(chuàng)建模板的圖像? ??
? ? ZV_LATCH(gv_ShapeRgbImg, 1)
? ? '跳轉(zhuǎn)到模板編輯界面
? ? HMI_SHOWWINDOW(26,4)
? ? '進(jìn)入模板可編輯狀態(tài)
? ? gv_CustomType=2
? ? '保存模板
? ? if TABLE(211)=0 then
? ? ? ? '自動(dòng)標(biāo)定模板?
? ? ? ? ZV_WRITESHAPEMOD(gv_CurShapeMod,"/zmc/flash/ShapeCal.zvb")
? ? endif
? ? '創(chuàng)建模板后直接進(jìn)行一次測(cè)試
? ? ShapeMatch()
? ? '模板編輯顯示
? ? ShapeEditShow(0)
? ? if mode = 1 then?
? ? ? ? gv_EdgeEdit(1)=0??
? ? endif
ENDSUB
五、創(chuàng)建形狀模板
'/************************************************************
'任務(wù)編號(hào):無(wú)
'函數(shù)功能:模板匹配
'Input:無(wú)
'Output:無(wú)?
'返回值:無(wú)
'備注:無(wú)??
'*************************************************************/
GLOBAL SUB ShapeMatch()?
? ? '更新標(biāo)定系數(shù)
? ? Update_CAL(TABLE(202))
? ? gv_CustomType=0
? ? '分?jǐn)?shù)清零
? ? TABLE(3)=0
? ? ZV_SETSYSDBL("ShapeFindTimeout",1000)
? ? '進(jìn)行匹配操作
? ? ZV_SHAPEFIND(gv_CurShapeMod, gv_GrabImg, gv_ShapeMatchRst, gv_match_param(0), gv_match_param(1), gv_match_param(2), gv_match_param(3), gv_match_param(4), gv_match_param(5), gv_match_param(6))??
? ? '獲取模板輪廓
? ? ZV_SHAPECONTOURS(gv_CurShapeMod, gv_ShapeContlist, 0)? ??
? ? '灰度圖轉(zhuǎn)RGB圖
? ? ZV_GRAYTORGB(gv_GrabImg, gv_ShapeRgbImg)? ??
? ? '獲取矩陣行信息
? ? ZV_MATGETROW(gv_ShapeMatchRst, 0, 5, 3)
? ? '計(jì)算剛性矩陣
? ? ZV_GETRIGIDVECTOR(gv_RigidMat, 0, 0, 0, TABLE(4), TABLE(5), TABLE(6))?
? ? TRACE "像素坐標(biāo)",TABLE(4),TABLE(5)
? ? if TABLE(3) < 70 then
? ? ? ? ?"匹配分?jǐn)?shù)",TABLE(3)
? ? ? ? ga_OperaTips="匹配失敗"
? ? ? ? HMI_SHOWWINDOW(50,6)
? ? ? ? EmergStopTask()
? ? endif?
? ? '進(jìn)行輪廓仿射變換
? ? ZV_CONTAFFINE(gv_ShapeContlist, gv_RigidMat, gv_ShapeContlistAff)
? ? ZV_CONTLIST(gv_ShapeRgbImg, gv_ShapeContlistAff, V_GREEN, 0)
? ? '轉(zhuǎn)換到mark點(diǎn)的實(shí)際世界坐標(biāo)
? ? CALTRANSW_OFFSET(TABLE(4), TABLE(5), 223)
? ? ?"世界坐標(biāo)1",TABLE(223),TABLE(224)
? ? TABLE(223) = TABLE(223)+ TABLE(200)
? ? TABLE(224) = TABLE(224)+ TABLE(201)
? ? TABLE(225) = TABLE(6)
? ? TRACE "世界坐標(biāo)",TABLE(223),TABLE(224),TABLE(225)
? ? '顯示匹配出來(lái)將輪廓變綠的圖像
? ? ZV_LATCHCLEAR(0)
? ? ZV_LATCH(gv_ShapeRgbImg, 0)
ENDSUB
03相機(jī)標(biāo)定和視覺(jué)定位演示視頻
本次,正運(yùn)動(dòng)技術(shù)運(yùn)動(dòng)控制+機(jī)器視覺(jué)Demo軟件框架(二):移動(dòng)標(biāo)定和形狀匹配,就分享到這里。
審核編輯:湯梓紅
評(píng)論