内容回顾
回顾上节课程我们对运动控制+机器视觉的例程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))
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软件框架(二):移动标定和形状匹配,就分享到这里。
审核编辑:汤梓红
评论
查看更多