內容回顧
回顧上節課程我們對運動控制+機器視覺的例程Demo的系統參數的設置和配方文件的管理兩大模塊進行了大致的介紹,接下來我們將對相機標定和形狀匹配這兩個功能進行介紹。
相機標定的目的是將像素坐標和世界坐標建立關系,形狀匹配的目的是獲取目標圖形在圖像中的像素坐標,將相機標定和形狀匹配結合即可導出目標圖形在空間上的世界坐標。
01相機標定
一、標定板標定和九點標定的介紹
1.標定板方式標定
將標定板放入現場被測物體同一平面,通過相機對標定板進行取像,然后視覺獲取標定板圖像中n個特征點的像素坐標。接著記錄每個特征點的世界坐標。特征點世界坐標獲取方式可利用手動運動使機臺的探針去對特征點的中心獲取。那么使用這n對像素坐標和世界坐標則可對相機進行標定,標定出相機坐標系和世界坐標系轉換關系。
2.九點方式標定
利用視覺定位特征點的方式獲取圖像特征點像素坐標,定位特征點可采用的方法有形狀匹配、Blob定位、圓定位等。首先保證目標不動,機臺控制相機以九宮格形式移動九次并拍照采集九幅圖像從而獲得九個特征點的像素坐標。移動一次拍照視覺定位一次,每次移動拍照時要保證目標在相機視野之內,同時讀出機臺的世界坐標。那么使用這九對像素坐標和世界坐標進行相機標定,就可以標定出像素坐標系和世界坐標系的轉換關系。
二、九點標定人機界面交互流程分析
三、標定界面的設計
先在上一個界面(CCD偏置界面)打開連續采集,然后手動運動使Mark點位于相機視野中間。然后進入該界面點擊“1.0、顯示ROI”,通過ROI矩形框將Mark點進行框選,接著點擊“1.1、創建形狀模板”。
形狀模板創建完成后進行X間隔和Y間隔的設置,然后點擊“2、開始自動標定”,等待標定完成即可。
注意:需要設置合適的間隔,保證九個拍照位都可以拍到Mark點。
四、九點標定代碼
?
? ? ? ? ? ?'/************************************************************
? ? ? ? ? ?'函數功能:? 自動標定
? ? ? ? ? ?'Input:? ? 無
? ? ? ? ? ?'Output:? ?無?
? ? ? ? ? ?'返回值:? ?無
? ? ? ? ? ?'備注:? ? ?標定需要一段時間,防止卡界面需要開線程。
? ? ? ? ? ?'*************************************************************/
? ? ? ? ? ?GLOBAL SUB RunNineCalib()
? ? ? ? ? ? ? ? ? ? if gv_CurProgrState=3 then?
? ? ? ? ? ? ? ? ? ?'如果是停止狀態
? ? ? ? ? ? ? ? ? ? ? ? ?STOPTASK 2
? ? ? ? ? ? ? ? ? ? ? ? ?RUNTASK 2,NineCalib()
? ? ? ? ? ? ? ? ? endif
? ? ? ? ?ENDSUB
?
?
? ? ? ? ?GLOBAL SUB NineCalib()
? ? LOCAL lv_CalI,lv_CalJ
? ? LOCAL lv_DposX, lv_DposY, lv_Num
? ? ZVOBJECT MatchsCal
? ? '設置自動標定速度
? ? for i=0 to gc_AxisNum-1?
? ? ? ? SPEED(i) = 20
? ? next
? ? '更新自動標定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
? ? '當前狀態設置成自動標定狀態
? ? gv_CurProgrState=4
? ? FOR lv_CalI = 0 to 2?
? ? ? ? FOR lv_CalJ = 0 to 2?
? ? ? ? ? ? '每次循環進行移動一次
? ? ? ? ? ? MOVEABS( lv_DposX + lv_CalJ * VR(190), lv_DposY + lv_CalI * VR(191))?
? ? ? ? ? ? WAIT until IDLE(0)?
? ? ? ? ? ? DELAY(200)
? ? ? ? ? ? CamGrab()
? ? ? ? ? ? '匹配獲取像素坐標
? ? ? ? ? ? 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)
? ? ? ? ? ? '獲取結果
? ? ? ? ? ? TABLE(50)=0
? ? ? ? ? ? ZV_MATGETROW(MatchsCal,0,5,50)
? ? ? ? ? ? TRACE "像素坐標:"table(51),table(52)
? ? ? ? ? ? if TABLE(50) < 85 then?
? ? ? ? ? ? ? ? ga_OperaTips="標定NG,請重新標定"
? ? ? ? ? ? ? ? HMI_SHOWWINDOW(50,6)
? ? ? ? ? ? ? ? '當前狀態設置成停止狀態
? ? ? ? ? ? ? ? gv_CurProgrState=3
? ? ? ? ? ? ? ? return?
? ? ? ? ? ? endif
? ? ? ? ? ? '灰度圖轉RGB圖
? ? ? ? ? ? ZV_GRAYTORGB(gv_GrabImg, gv_ShapeRgbImg)? ??
? ? ? ? ? ? '計算剛性矩陣
? ? ? ? ? ? ZV_GETRIGIDVECTOR(gv_RigidMat, 0, 0, 0, TABLE(51), TABLE(52), TABLE(53))??
? ? ? ? ? ? '進行輪廓仿射變換
? ? ? ? ? ? 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)
? ? ? ? ? ? '將像素坐標存入 TABLE 中?
? ? ? ? ? ? TABLE(161 + lv_Num*2) = TABLE(51)
? ? ? ? ? ? TABLE(162 + lv_Num*2) = TABLE(52)
? ? ? ? ? ? TRACE "像素坐標",TABLE(51),TABLE(52)
? ? ? ? ? ? '將機臺世界坐標存入 TABLE 中?
? ? ? ? ? ? TABLE(181 + lv_Num*2) = -(lv_CalJ * VR(190))?
? ? ? ? ? ? TABLE(182 + lv_Num*2) = -(lv_CalI * VR(191))
? ? ? ? ? ? '記錄自動標定時物體與相機中心的像素偏移量
? ? ? ? ? ? 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 中的像素和世界坐標轉換成矩陣存儲?
? ? ZV_MATGENDATA(gv_Ppts, 9, 2, 161)?
? ? ZV_MATGENDATA(gv_Wpts, 9, 2, 181)?
? ? '九次循環后進行標定
? ? gv_CalModeFlag=2
? ? ZV_CALCAM(gv_Ppts, gv_Wpts, gv_CalParam, gv_PhotoW, gv_PhotoH, 2)??
? ? '計算標定誤差,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="標定OK"
? ? HMI_SHOWWINDOW(50,6)
? ? '當前狀態設置成停止狀態
? ? gv_CurProgrState=3
? ? '設置標志位表示標定成功
? ? MODBUS_BIT(152)=1
ENDSUB
?
五、標定系數的應用
下圖是相機第一個拍照位的視野情況和加工中心的情況。我們要知道如果系統上面的標定方法標定出來的像素坐標和世界坐標的關系是相機第一個拍照位相機視野上Mark點的位置的。
換句話說就是,如果我們通過視覺獲得目標位置的像素坐標,再通過標定系數轉換成世界坐標,然后機臺通過運動指令進行移動到相應位置,此時對準目標位置的不是相機中心而是向量A的起點位置。
而在我們實際加工中,是需要加工中心對準該目標位置,根據下圖信息可以知。因為向量A的起點和終點的像素坐標已知,向量B也可以通過簡單的對點方式計算出來,所以可以很方便地計算出向量C。
?
像素坐標轉世界坐標如下:
?
02視覺形狀匹配
一、形狀模板創建和形狀模板匹配指令
?
?
二、創建形狀模板界面設計
點擊“顯示ROI”,顯示出矩形ROI區域,通過移動鼠標將感興趣的區域框選起來,然后點擊“創建形狀模板”即可完成模板創建。
三、形狀模板創建流程圖
?
四、創建形狀模板
'/************************************************************
'任務編號:無
'函數功能:生成模板
'Input:無
'Output:無?
'返回值:無
'備注:無??
'*************************************************************/
GLOBAL SUB EstabShape(mode)
? ? IF mode <> 1 THEN
? ? ? ? 'Hmi ROI坐標轉 圖像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))
? ? ? ? '生成模板區域
? ? ? ? ZV_REGENRECT(gv_ShapeRe, 0, 0, dv_RoiPos(2), dv_RoiPos(3))?
? ? ENDIF??
? ? '開始創建模板
? ? '設置創建模板等級
? ? ZV_SETSYSINT("ShapeCreateLevel",gv_mod_param(9))
? ? '清空之前創建的模板
? ? ZV_CLEAR(gv_CurShapeMod)
? ? '進行創建模板
? ? 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是剛剛創建的模板
? ? dv_CreaModel = 1
? ? '獲取模板的輪廓
? ? ZV_SHAPECONTOURS(gv_CurShapeMod, gv_ShapeContlist, 0)??
? ? '灰度圖像轉RGB圖象(主要繪制輪廓的時候用的)
? ? ZV_GRAYTORGB(gv_ShapeImg, gv_ShapeRgbImg)? ??
? ? '獲取圖片信息
? ? '0是TABLE 索引,圖像信息,5 個數據,依次為寬、高、通道數、數據類型和基本像元大小??
? ? ZV_IMGINFO(gv_ShapeRgbImg, 0)??
? ? ZV_GETRIGIDVECTOR(gv_RigidMat, 0, 0, 0, TABLE(0)/2, TABLE(1)/2, 0)? '計算剛性變換矩陣(能對圖形進行旋轉、平移等變換)? ??
? ? ZV_CONTAFFINE(gv_ShapeContlist, gv_RigidMat, gv_ShapeContlistAff)? '輪廓或輪廓序列仿射變換
? ? '繪制輪廓??
? ? ZV_CONTLIST(gv_ShapeRgbImg, gv_ShapeContlistAff, V_RED, 0)
? ? '鎖存通道1顯示清空? ??
? ? ZV_LATCHCLEAR(1)
? ? '顯示創建模板的圖像? ??
? ? ZV_LATCH(gv_ShapeRgbImg, 1)
? ? '跳轉到模板編輯界面
? ? HMI_SHOWWINDOW(26,4)
? ? '進入模板可編輯狀態
? ? gv_CustomType=2
? ? '保存模板
? ? if TABLE(211)=0 then
? ? ? ? '自動標定模板?
? ? ? ? ZV_WRITESHAPEMOD(gv_CurShapeMod,"/zmc/flash/ShapeCal.zvb")
? ? endif
? ? '創建模板后直接進行一次測試
? ? ShapeMatch()
? ? '模板編輯顯示
? ? ShapeEditShow(0)
? ? if mode = 1 then?
? ? ? ? gv_EdgeEdit(1)=0??
? ? endif
ENDSUB
五、創建形狀模板
'/************************************************************
'任務編號:無
'函數功能:模板匹配
'Input:無
'Output:無?
'返回值:無
'備注:無??
'*************************************************************/
GLOBAL SUB ShapeMatch()?
? ? '更新標定系數
? ? Update_CAL(TABLE(202))
? ? gv_CustomType=0
? ? '分數清零
? ? TABLE(3)=0
? ? ZV_SETSYSDBL("ShapeFindTimeout",1000)
? ? '進行匹配操作
? ? 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)? ??
? ? '灰度圖轉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 "像素坐標",TABLE(4),TABLE(5)
? ? if TABLE(3) < 70 then
? ? ? ? ?"匹配分數",TABLE(3)
? ? ? ? ga_OperaTips="匹配失敗"
? ? ? ? HMI_SHOWWINDOW(50,6)
? ? ? ? EmergStopTask()
? ? endif?
? ? '進行輪廓仿射變換
? ? ZV_CONTAFFINE(gv_ShapeContlist, gv_RigidMat, gv_ShapeContlistAff)
? ? ZV_CONTLIST(gv_ShapeRgbImg, gv_ShapeContlistAff, V_GREEN, 0)
? ? '轉換到mark點的實際世界坐標
? ? CALTRANSW_OFFSET(TABLE(4), TABLE(5), 223)
? ? ?"世界坐標1",TABLE(223),TABLE(224)
? ? TABLE(223) = TABLE(223)+ TABLE(200)
? ? TABLE(224) = TABLE(224)+ TABLE(201)
? ? TABLE(225) = TABLE(6)
? ? TRACE "世界坐標",TABLE(223),TABLE(224),TABLE(225)
? ? '顯示匹配出來將輪廓變綠的圖像
? ? ZV_LATCHCLEAR(0)
? ? ZV_LATCH(gv_ShapeRgbImg, 0)
ENDSUB
03相機標定和視覺定位演示視頻
本次,正運動技術運動控制+機器視覺Demo軟件框架(二):移動標定和形狀匹配,就分享到這里。
審核編輯:湯梓紅
評論
查看更多