內(nèi)容回顧
回顧上節(jié)課程我們對運(yùn)動控制+機(jī)器視覺的例程Demo的系統(tǒng)參數(shù)的設(shè)置和配方文件的管理兩大模塊進(jìn)行了大致的介紹,接下來我們將對相機(jī)標(biāo)定和形狀匹配這兩個功能進(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)定和九點標(biāo)定的介紹
1.標(biāo)定板方式標(biāo)定
將標(biāo)定板放入現(xiàn)場被測物體同一平面,通過相機(jī)對標(biāo)定板進(jìn)行取像,然后視覺獲取標(biāo)定板圖像中n個特征點的像素坐標(biāo)。接著記錄每個特征點的世界坐標(biāo)。特征點世界坐標(biāo)獲取方式可利用手動運(yùn)動使機(jī)臺的探針去對特征點的中心獲取。那么使用這n對像素坐標(biāo)和世界坐標(biāo)則可對相機(jī)進(jìn)行標(biāo)定,標(biāo)定出相機(jī)坐標(biāo)系和世界坐標(biāo)系轉(zhuǎn)換關(guān)系。
2.九點方式標(biāo)定
利用視覺定位特征點的方式獲取圖像特征點像素坐標(biāo),定位特征點可采用的方法有形狀匹配、Blob定位、圓定位等。首先保證目標(biāo)不動,機(jī)臺控制相機(jī)以九宮格形式移動九次并拍照采集九幅圖像從而獲得九個特征點的像素坐標(biāo)。移動一次拍照視覺定位一次,每次移動拍照時要保證目標(biāo)在相機(jī)視野之內(nèi),同時讀出機(jī)臺的世界坐標(biāo)。那么使用這九對像素坐標(biāo)和世界坐標(biāo)進(jìn)行相機(jī)標(biāo)定,就可以標(biāo)定出像素坐標(biāo)系和世界坐標(biāo)系的轉(zhuǎn)換關(guān)系。
二、九點標(biāo)定人機(jī)界面交互流程分析
三、標(biāo)定界面的設(shè)計
先在上一個界面(CCD偏置界面)打開連續(xù)采集,然后手動運(yùn)動使Mark點位于相機(jī)視野中間。然后進(jìn)入該界面點擊“1.0、顯示ROI”,通過ROI矩形框?qū)ark點進(jìn)行框選,接著點擊“1.1、創(chuàng)建形狀模板”。
形狀模板創(chuàng)建完成后進(jìn)行X間隔和Y間隔的設(shè)置,然后點擊“2、開始自動標(biāo)定”,等待標(biāo)定完成即可。
注意:需要設(shè)置合適的間隔,保證九個拍照位都可以拍到Mark點。
四、九點標(biāo)定代碼
?
? ? ? ? ? ?'/************************************************************
? ? ? ? ? ?'函數(shù)功能:? 自動標(biāo)定
? ? ? ? ? ?'Input:? ? 無
? ? ? ? ? ?'Output:? ?無?
? ? ? ? ? ?'返回值:? ?無
? ? ? ? ? ?'備注:? ? ?標(biāo)定需要一段時間,防止卡界面需要開線程。
? ? ? ? ? ?'*************************************************************/
? ? ? ? ? ?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è)置自動標(biāo)定速度
? ? for i=0 to gc_AxisNum-1?
? ? ? ? SPEED(i) = 20
? ? next
? ? '更新自動標(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)
? ? '更新第一個拍照位的位置
? ? lv_DposX = DPOS(gc_Axis_X)-VR(190)
? ? lv_DposY = DPOS(gc_Axis_Y)-VR(191)
? ? lv_Num=0
? ? '當(dāng)前狀態(tài)設(shè)置成自動標(biāo)定狀態(tài)
? ? gv_CurProgrState=4
? ? FOR lv_CalI = 0 to 2?
? ? ? ? FOR lv_CalJ = 0 to 2?
? ? ? ? ? ? '每次循環(huán)進(jìn)行移動一次
? ? ? ? ? ? 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,請重新標(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)? ??
? ? ? ? ? ? '計算剛性矩陣
? ? ? ? ? ? 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ī)臺世界坐標(biāo)存入 TABLE 中?
? ? ? ? ? ? TABLE(181 + lv_Num*2) = -(lv_CalJ * VR(190))?
? ? ? ? ? ? TABLE(182 + lv_Num*2) = -(lv_CalI * VR(191))
? ? ? ? ? ? '記錄自動標(biāo)定時物體與相機(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)換成矩陣存儲?
? ? 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)??
? ? '計算標(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ī)第一個拍照位的視野情況和加工中心的情況。我們要知道如果系統(tǒng)上面的標(biāo)定方法標(biāo)定出來的像素坐標(biāo)和世界坐標(biāo)的關(guān)系是相機(jī)第一個拍照位相機(jī)視野上Mark點的位置的。
換句話說就是,如果我們通過視覺獲得目標(biāo)位置的像素坐標(biāo),再通過標(biāo)定系數(shù)轉(zhuǎn)換成世界坐標(biāo),然后機(jī)臺通過運(yùn)動指令進(jìn)行移動到相應(yīng)位置,此時對準(zhǔn)目標(biāo)位置的不是相機(jī)中心而是向量A的起點位置。
而在我們實際加工中,是需要加工中心對準(zhǔn)該目標(biāo)位置,根據(jù)下圖信息可以知。因為向量A的起點和終點的像素坐標(biāo)已知,向量B也可以通過簡單的對點方式計算出來,所以可以很方便地計算出向量C。
?
像素坐標(biāo)轉(zhuǎn)世界坐標(biāo)如下:
?
02視覺形狀匹配
一、形狀模板創(chuàng)建和形狀模板匹配指令
?
?
二、創(chuàng)建形狀模板界面設(shè)計
點擊“顯示ROI”,顯示出矩形ROI區(qū)域,通過移動鼠標(biāo)將感興趣的區(qū)域框選起來,然后點擊“創(chuàng)建形狀模板”即可完成模板創(chuàng)建。
三、形狀模板創(chuàng)建流程圖
?
四、創(chuàng)建形狀模板
'/************************************************************
'任務(wù)編號:無
'函數(shù)功能:生成模板
'Input:無
'Output:無?
'返回值:無
'備注:無??
'*************************************************************/
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)建模板等級
? ? 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圖象(主要繪制輪廓的時候用的)
? ? ZV_GRAYTORGB(gv_ShapeImg, gv_ShapeRgbImg)? ??
? ? '獲取圖片信息
? ? '0是TABLE 索引,圖像信息,5 個數(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ì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
? ? ? ? '自動標(biāo)定模板?
? ? ? ? ZV_WRITESHAPEMOD(gv_CurShapeMod,"/zmc/flash/ShapeCal.zvb")
? ? endif
? ? '創(chuàng)建模板后直接進(jìn)行一次測試
? ? ShapeMatch()
? ? '模板編輯顯示
? ? ShapeEditShow(0)
? ? if mode = 1 then?
? ? ? ? gv_EdgeEdit(1)=0??
? ? endif
ENDSUB
五、創(chuàng)建形狀模板
'/************************************************************
'任務(wù)編號:無
'函數(shù)功能:模板匹配
'Input:無
'Output:無?
'返回值:無
'備注:無??
'*************************************************************/
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)
? ? '計算剛性矩陣
? ? 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點的實際世界坐標(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)
? ? '顯示匹配出來將輪廓變綠的圖像
? ? ZV_LATCHCLEAR(0)
? ? ZV_LATCH(gv_ShapeRgbImg, 0)
ENDSUB
03相機(jī)標(biāo)定和視覺定位演示視頻
本次,正運(yùn)動技術(shù)運(yùn)動控制+機(jī)器視覺Demo軟件框架(二):移動標(biāo)定和形狀匹配,就分享到這里。
審核編輯:湯梓紅
評論
查看更多