正运动技术
正运动技术
精准24码全年无错版
EN
精准24码全年无错版
精准24码全年无错版

协助伙伴成功,是我们的价值所在

The value of Zmotion is to bring customers more success!

首页 / 支持与服务 / 技术分享

Technical support

技术分享

运动控制+机器视觉Demo软件框架(二):移动标定和形状匹配

内容回顾


回顾上节课程我们对 运动控制+机器视觉的例程 Demo的系统参数的设置和配方文件的管理两大模块进行了大致的介绍,接下来我们将对相机标定和形状匹配这两个功能进行介绍。

相机标定的目的是将像素坐标和世界坐标建立关系,形状匹配的目的是获取目标图形在图像中的像素坐标,将相机标定和形状匹配结合即可导出目标图形在空间上的世界坐标。




01

相机标定


一、标定板标定和点标定的介绍

1. 标定板方式标定

将标定板放入现场被测物体同一平面,通过相机对标定板进行取像,然后视觉获取标定板图像中n个特征点的像素坐标。接着记录每个特征点的世界坐标。
特征点世界坐标获取方式可利用手动运动使机台的探针去对特征点的中心获取。那么使用这n对像素坐标和世界坐标则可对相机进行标定,标定出相机坐标系和世界坐标系转换关系。

2.九点方式标定

利用视觉定位特征点的方式获取图像特征点像素坐标,定位特征点可采用的方法有形状匹配、Blob定位、圆定位等。首先保证目标不动,机台控制相机以九宫格形式移动九次并拍照采集九幅图像从而获得九个特征点的像素坐标。
移动一次拍照视觉定位一次,每次移动拍照时要保证目标在相机视野之内,同时读出机台的世界坐标。那么使用这九对像素坐标和世界坐标进行相机标定,就可以标定出像素坐标系和世界坐标系的转换关系。

二、九点标定人机界面交互流程分析

1.png

三、标定界面的设计

2.png

先在上一个界面(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。

3.png

像素坐标转世界坐标如下:

4.png




02

视觉形状匹配


一、形状模板创建和形状模板匹配指

5.png

6.png

二、创建形状模板界面设计
7.png
点击“显示ROI”,显示出矩形ROI区域,通过移动鼠标将感兴趣的区域框选起来,然后点击“创建形状模板”即可完成模板创建。

三、形状模板创建流程图

8.png

四、创建形状模板


'/************************************************************

'任务编号:无

'函数功能:生成模板

'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软件概述二 相机标定与形状匹配查看

              



   正运动技术专注于运动控制技术研究和通用运动控制软硬件产品的研发,是国家级高新技术企业。正运动技术汇集了来自华为、中兴等公司的优秀人才,在坚持自主创新的同时,积极联合各大高校协同运动控制基础技术的研究,是国内工控领域发展最快的企业之一,也是国内少有、完整掌握运动控制核心技术和实时工控软件平台技术的企业。主要业务有:运动控制卡_运动控制器_EtherCAT运动控制卡_EtherCAT控制器_运动控制系统 _视觉控制器_运动控制PLC_运动控制_机器人控制器_视觉定位等等。

本次,正运动技术运动控制+机器视觉Demo软件框架(二):移动标定和形状匹配,分享到这里。

更多精彩内容请关注“正运动小助手”公众号,需要相关开发环境与例程代码,请咨询正运动技术销售工程师:400-089-8936

本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。




邮箱留言

Copyright © 2013 精准24码全年无错版 Design by Zmotion 版权所有   粤ICP备13037187号    Powered by 运动控制器-运动控制卡

在线咨询