内容回顾

回顾上节课程我们对运动控制+机器视觉的例程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. Science评论|只需加一种菌,番茄不仅抗盐胁迫还提高65%产量!
  2. Equinox P2的学习
  3. FMS4.5( Adobe Flash Media Server4.5)流媒体服务器搭建
  4. 更改Linux用户的登录shell环境
  5. 【NLP】XLnet:GPT和BERT的合体,博采众长,所以更强
  6. 200905阶段一C++链表与继承特性
  7. linux开发操作系统,Linux 操作系统应用与开发
  8. day3-python学习笔记(三)字典、元组
  9. 后序线索树怎样画图_算法新解刘新宇(二)二叉搜索树:数据结构中的“hello world”...
  10. android stepview 京东,Android-Android-OpenAPI SDK-帮助文档-京东云
  11. 视觉平台搭建——光源选择
  12. Mybatis中的foreach
  13. access 套用表格_将ACCESS数据库导入到EXCEL表格
  14. Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS-Security(基于SOAP的Web安全调用机制)
  15. 三层交换机原理及实验操作
  16. 高德地图ajax距离,高德地图 API 计算两个城市之间的距离
  17. Docer容器客户端在启动的镜像的时候报错Error invoking remote method ‘docker-start-container‘: Error: (HTTP code 500
  18. org.apache.commons.codec.binary.Base64包需要下载的jar包依赖
  19. 几何校正(image to image)
  20. HDU - 5976 Detachment(逆元)

热门文章

  1. Python First Week(二)
  2. 机器学习决策树算法和分类原理
  3. CAD进度条设置3种方法
  4. 解决github unable to access ‘https://github.com/...: Failed to connect to github.com port 443
  5. 【MySQL】解除mysql5.7.X版本弱密码限制
  6. 土木专业学c语言,用一句话形容你的专业,得知真相的我眼泪流下来
  7. Java集合:Set、Map、List
  8. CentOS7查看IP并开启Ens33网卡IP
  9. 多啦咪图虫_浏览器插件图片批量下载工具扩展插件图片下载
  10. ms office word2013教程 - 使用SmartArt绘制组织结构图