内容回顾

回顾上节课程我们对运动控制+机器视觉的例程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 2RUNTASK 2,NineCalib()endifENDSUBGLOBAL SUB NineCalib()LOCAL lv_CalI,lv_CalJLOCAL lv_DposX, lv_DposY, lv_NumZVOBJECT MatchsCal'设置自动标定速度for i=0 to gc_AxisNum-1 SPEED(i) = 20next'更新自动标定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=4FOR 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)=0ZV_MATGETROW(MatchsCal,0,5,50)TRACE "像素坐标:"table(51),table(52)if TABLE(50) < 85 then ga_OperaTips="标定NG,请重新标定"HMI_SHOWWINDOW(50,6)'当前状态设置成停止状态gv_CurProgrState=3return 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 thenVR(103) = TABLE(51)VR(104) = TABLE(52)endiflv_Num = lv_Num + 1NEXT NEXT '将 TABLE 中的像素和世界坐标转换成矩阵存储 ZV_MATGENDATA(gv_Ppts, 9, 2, 161) ZV_MATGENDATA(gv_Wpts, 9, 2, 181) '九次循环后进行标定gv_CalModeFlag=2ZV_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)=1ENDSUB

五、标定系数的应用

下图是相机第一个拍照位的视野情况和加工中心的情况。我们要知道如果系统上面的标定方法标定出来的像素坐标和世界坐标的关系是相机第一个拍照位相机视野上Mark点的位置的。

换句话说就是,如果我们通过视觉获得目标位置的像素坐标,再通过标定系数转换成世界坐标,然后机台通过运动指令进行移动到相应位置,此时对准目标位置的不是相机中心而是向量A的起点位置。

而在我们实际加工中,是需要加工中心对准该目标位置,根据下图信息可以知。因为向量A的起点和终点的像素坐标已知,向量B也可以通过简单的对点方式计算出来,所以可以很方便地计算出向量C。

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

02视觉形状匹配

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

二、创建形状模板界面设计

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

三、形状模板创建流程图

四、创建形状模板

'/************************************************************'任务编号:无'函数功能:生成模板'Input:无'Output:无 '返回值:无'备注:无  '*************************************************************/GLOBAL SUB EstabShape(mode)IF mode <> 1 THEN'Hmi ROI坐标转 图像ROIZV_POSTOIMG(0, 2, 74, 0)dv_RoiPos(0) = TABLE(0)dv_RoiPos(1) = TABLE(1)dv_RoiPos(2) = TABLE(2) - TABLE(0) + 1dv_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  endifENDSUB

五、创建形状模板

'/************************************************************'任务编号:无'函数功能:模板匹配'Input:无'Output:无 '返回值:无'备注:无  '*************************************************************/GLOBAL SUB ShapeMatch() '更新标定系数Update_CAL(TABLE(202))gv_CustomType=0'分数清零TABLE(3)=0ZV_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软件概述二 相机标定与形状匹配

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

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

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

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

  1. 2021-01-10 Halcon初学者知识 【10】形状匹配 【二】模板的形状匹配

    将上一篇博客中的图像用来测试代码:在images目录下,存放若干张指环图片,用下述代码,进行形状识别: dev_set_line_width(4) list_image_files('images', ...

  2. C#运动控制加视觉非标自动化软件框架,运动控制设计部分采用流程图式设计

    C#运动控制加视觉非标自动化软件框架,运动控制设计部分采用流程图式设计,可以根据框架自定义C#+halcon或者C#?VP全新 ,源码 YID:3985646038049009用户_20317043

  3. labview通用视觉软件框架,机器视觉通用框架,里面有安装教程

    labview通用视觉软件框架,机器视觉通用框架,里面有安装教程5872616775880854TB_53968806

  4. 基于ROS搭建简易软件框架实现ROV水下目标跟踪(二)--硬件框架简述

    虽然本系列文章是介绍一个简易的ROV水下目标跟踪demo的软件实现,但软件框架的运行也是需要硬件基础的.鉴于我在这方面不擅长,实际工作也非我完成,由我撰写此部分可能会出现谬误.和完成demo硬件部分的 ...

  5. ARM/DSP+FPGA运动控制机器视觉控制器方案定制

    ARM/DSP+FPGA运动控制机器视觉控制器方案定制,信迈拥有成熟的相关方案. 机器视觉是计算机视觉的一个分支,工业自动化领域中的视觉控制或视觉应用,主要指的是通过前端光学摄像头,从采集到的数字化图 ...

  6. 自动化设备的软件框架

    自动化设备的软件主要由2部分组成:1是运动控制部分的软件实现,2是上位机处理数据并显示结果的软件实现. 运动控制的实现 第1部分的实现主要有2种方式,一种是用板卡控制的方式,一种是用PLC控制的方式. ...

  7. 软件自动化测试图片,常见的机器视觉图像处理软件自动化检测软件介绍

    原标题:常见的机器视觉图像处理软件自动化检测软件介绍 免编程VisionBank SVS机器视觉软件 免编程的机器视觉软件VisionBank SVS,其工具库能够满足各种视觉需求,从几何物品的定位和 ...

  8. Java开源 J2EE框架(二)

    Java开源 J2EE框架(二) 2007-01-06 12:34 Jofti [Java开源 其它开源项目] Jofti可对在缓存层中(支持EHCache,JBossCache和OSCache)的对 ...

  9. 视觉运控平台软件框架(1)---总览

    近期有点空余时间,写了个视觉运控平台框架,该框架集成了运动与视觉部分.视觉和运控部分均可独立配置,并且运控部分的在配置完轴控和视觉部分的图像处理流程后,通过Lua脚本语言灵活控制机器的整个动作流程.这 ...

最新文章

  1. 【JQuery】可直接编辑的表格
  2. Python-可视化Evoked数据
  3. RabbitMQ管理台使用
  4. Spring Boot定时任务-Quartz基本使用
  5. 游戏窗口组合键消息失败_5失败的投资组合,以后我在这里
  6. openGauss凝聚创新力量,云和恩墨MogDB加速社区发展
  7. CentOS 7 Linux实时内核下的epoll性能分析
  8. 通过里程碑式管理,控制软件项目管理进度
  9. python2.7 matplotlib_Python 2.7中的Numpy、SciPy、MatPlotLib安装与配置
  10. 如何使用CSDN写博客?—CSDN基础知识汇总
  11. Jeesite进行打包(打成war包)
  12. django打开html页面跳转,django创建最简单HTML页面跳转方法
  13. 存储卡数据恢复|相机存储卡照片恢复教程
  14. mysql b树子节点个数_MySQL 和 B 树的那些事-爱可生
  15. 什么是网络推广以及如何做好网络推广
  16. 物体检测之SNIPER
  17. Unicode详解 真干货! 一文带你手撕Unicode
  18. 事业编招聘:南方科技大学附属实验学校2022年·面向应届毕业生招聘在编教师公告
  19. 政考网:一年最多可以参加几次公务员考试?
  20. 分支语句和循环语句<小罗爱学c语言>

热门文章

  1. python 自动填excel_Python读写Excel自动填表
  2. Ps 运行时常见问题修复
  3. 一点密码破解的心得(更新字典)
  4. C# 字节数组转结构体
  5. html制作《逆水寒》心得及部分代码
  6. 亲子世界的交流(节选自《社会动物》)
  7. 后端实现Excel 导入导出
  8. 小米小爱音箱Pro8安装app_小米小爱音箱HD:声色俱全的智能音箱
  9. 【luogu P3393 逃离僵尸岛】 题解
  10. echarts图例板块默认高亮与鼠标移入高亮实现