The value of Zmotion is to bring customers more success!
回顾上节课程我们对 运动控制+机器视觉的例程 Demo的系统参数的设置和配方文件的管理两大模块进行了大致的介绍,接下来我们将对相机标定和形状匹配这两个功能进行介绍。
相机标定的目的是将像素坐标和世界坐标建立关系,形状匹配的目的是获取目标图形在图像中的像素坐标,将相机标定和形状匹配结合即可导出目标图形在空间上的世界坐标。
一、标定板标定和九点标定的介绍
1. 标定板方式标定
2.九点方式标定
二、九点标定人机界面交互流程分析
先在上一个界面(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。
一、形状模板创建和形状模板匹配指 令
三、形状模板创建流程图
四、创建形状模板
'/************************************************************
'任务编号:无
'函数功能:生成模板
'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
正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统
_视觉控制器_运动控制PLC_运动控制_机器人控制器_视觉定位等等。
本次,正运动技术运动控制+机器视觉Demo软件框架(二):移动标定和形状匹配,就分享到这里。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。