VPLC系列机器视觉运动控制一体机快速入门(六)

此前,我们依次讲解了软硬件介绍及计数实例、相机的基本使用、基于形状匹配的视觉定位、blob有无检测以及测量尺寸。
本期课程,正运动技术和大家一起分享和标定有关的详细知识内容。
机器视觉检测结果
将机器视觉处理的像素结果(单位:像素)转换成现实中使用到的实际结果(单位:毫米),或者是将机器视觉中使用的图像坐标转换成世界坐标的过程。
测量标定是使用已知尺寸的标准模块,如已知半径的小圆块、已知宽度的小方块、刻度尺等物品,在使用机器视觉检测出对应尺寸的像素值后,求出实际尺寸值和像素值的比例即像素比例,之后再将检测的像素结果乘以像素比例即可得出实际值结果。
坐标标定是指使用机器视觉获取几组图像坐标数据(至少9组),然后输入对应的几组世界坐标数据,根据公式计算出矩阵坐标转换系数,然后将检测的图像坐标结果按照这个标定系数转换成世界坐标结果。
1.测量标定
测量标定的实施方法比较简单,只需要将已知尺寸的标准块放到检测平台中,然后使用视觉输出的像素结果和已知尺寸计算得到像素比例即可。
2.坐标标定--使用标定板
标定板的特点是特征点的距离是固定且已知的。我们就可以在标定板上选择几组矩阵坐标数据,把某个点设置成坐标原点,再根据实际圆点(或棋盘格)的距离定义对应点的实际坐标,最后再使用视觉检测出对应特征点的图像坐标即可。得到图像坐标数据和世界坐标数据后就可以求出标定系数。
3.坐标标定--不使用标定板
在没有准备标定板的条件下做坐标标定需要运动机构如机械手配合。
机械手抓取产品按照指定的位置坐标(机械手坐标)走9个点位(这9个点位需要保证在相机拍照的视野范围内),每走到一个点位就使用相机获取产品特征在当前位置的图像坐标并记录图像坐标数据,依次走完9个点位即可。然后再根据获取的图像坐标数据和记录的机械手坐标进行坐标系转换,得出标定系数。
注意:在相机结构和检测平台的相对位置发生变化时需要重新标定!
坐标标定流程图
演示实例说明:本课程实例在《vplc系列机器视觉运动控制一体机快速入门(三)--形状匹配》实例的基础上增加使用标定板进行坐标标定的功能,并输出标定后的产品位置。
1.打开zdevelop软件:点击[文件]→[打开项目]→选择“基于形状匹配的视觉定位”项目。
2.修改设计主界面。
3.在global_variable.bas文件中增加定义坐标标定使用到的全局变量。
'***********定义坐标标定相关变量*********************
'定义是否使用标定功能标志,0-不使用标定功能,1-使用标定功能
global dim d_use_calib
d_use_calib = 0
'定义标定成功标志,0-标定未成功,1-标定成功
global dim d_calib_success
d_calib_success = 0
'标定参数
global zvobject ca_param
'标定参数数组,依次为:标定类型、对比度、极性、最小面积、最大面积、世界坐标点间距
global dim d_ca_param(6) 'd开头表示数据结构
'标定误差,最小误差、最大误差、平均误差
global dim ca_min_err,ca_max_err,ca_avg_err
ca_min_err = 0
ca_max_err = 0
ca_avg_err = 0
'常用颜色变量
global c_red, c_green, c_blue, c_yellow
c_red = rgb(255, 0, 0)
c_green = rgb( 0,255, 0)
c_blue = rgb( 0, 0,255)
c_yellow= rgb(255,255, 0)
'标定矩阵
global zvobject ca_mat
'***********结束定义坐标标定相关变量******************
4.在initlocator.bas文件中初始化坐标标定相关的测量参数。
'初始化坐标标定相关的变量
d_ca_param(0) = 0 '标定类型
d_ca_param(1) = 120 '对比度
d_ca_param(2) = 0 '极性
d_ca_param(3) = 80 '最小面积
d_ca_param(4) = 20000 '最大面积
d_ca_param(5) = 9 '世界坐标点间距
ca_min_err = 0 '最小误差
ca_max_err = 0 '最大误差
ca_avg_err = 0 '平均误差
5.新建主界面按下【坐标标定】按钮时弹出的窗口界面calib,并设计界面布局。
6.在calib窗口界面中关联元件变量。
7.添加在主界面按下【坐标标定】按钮时响应的函数,并关联动作函数名。
'点击主界面坐标标定按钮时响应的函数
global sub btn_calib()
zv_latchsetsize(0, hmi_controlsizex(13, 91), hmi_controlsizey(13, 91)) '设置坐标标定窗口锁存通道0的锁存大小
zv_latchclear(0) '将锁存通道0清空
zv_latch(grabimg, 0) '显示采集图像显示到锁存通道0中
hmi_showwindow(13)
end sub
8.添加在calib界面按下【提取mark点】按钮时响应的函数,并关联动作函数名。
'坐标标定界面按下提取mark点按钮时响应的函数
global sub btn_ca_extract()
      zvobject inppts, ppts, wpts
'提取像素坐标
    zv_calgetscapts(grabimg, inppts, d_ca_param(1), d_ca_param(2), d_ca_param(3), d_ca_param(4))
    zv_matinfo (inppts, 400)
dim row,col
    row = table(400)
    col = table(401)
    if(row * col = 18) then
        table(150) = 1 '提取mark点成功
    else
        table(150) = 0 '提取mark点失败
        return
    endif
'根据mrak点间距和像素坐标计算世界坐标
    zv_calgetptsmap(inppts,ppts,wpts,d_ca_param(5))
    zv_matinfo (ppts, 400)
row = table(400)
    col = table(401)
    if(row * col = 18) then
        table(150) = 1 '提取mark点成功
    else
        table(150) = 0 '提取mark点失败
        return
    endif
'像素坐标和世界坐标放入table中
    dim i
    for i=0 to row-1
        zv_matgetrow (ppts, i, col, 81 + i*col)
        zv_matgetrow (wpts, i, col, 131 + i*col)
    next
'设置用于绘制mark点的图像
    zvobject color
    zv_graytorgb(grabimg, color)
'和绘制mark点的十字架
    dim j, pixnum '像素个数
    pixnum = 0
    for i=0 to 2
        for j=0 to 2
            zv_marker(color, table(81 + 2 * pixnum), table(81 + 2 * pixnum + 1), 0, 40, c_green)
            pixnum = pixnum + 1
        next
    next
'用文本绘制mark点的序号
    for i=0 to 8
        zv_text (color, tostr(i,1,0), table(81+2*i)-20, table(81+2*i +1)-40, 20, c_blue)
    next
zv_latch(color, 0)
end sub
在calib界面按下【提取mark点】按钮时仿真效果图。
9.添加在calib界面按下【标定】按钮时响应的函数,并关联动作函数名。
'坐标标定界面按下标定按钮时响应的函数
global sub btn_ca_calib()
zv_imginfo(grabimg,0)
    zv_calcam(ppts,wpts,ca_param,table(0),table(1),d_ca_param(0))
    is_ca_success=1
    '计算标定误差
    zv_calerror(ca_param, ppts, wpts, 0)
    ca_min_err = table(1)
    ca_max_err = table(2)
    ca_avg_err = table(0)
end sub
在calib界面按下【标定】按钮时仿真效果图
10.添加在calib界面按下【返回】按钮时响应的函数,并关联动作函数名。
'坐标标定界面按下返回按钮时响应的函数
global sub btn_ca_param_rtn()
    hmi_closewindow(13)
end sub
11.修改匹配测试子函数中匹配结果输出部分的指令代码。
if(is_ca_success = 1 and table(300)) then
                    zv_getrigidvector(mat_rigid1, 0, 0, 0, table(4), table(5), table(6))'计算刚性变换矩阵
                    zv_contaffine(contlist1, mat_rigid1, tscontlist1)'对轮廓或轮廓序列进行仿射变换
                    zv_contlist(colorimg, tscontlist1, zv_color(0, 255, 0), 0)'在colorsubimg图像上绘制绿色的轮廓序列
                    zv_caltransw(ca_param, table(4),table(5),4)
                    d_match_rst(0) = table(3)
                    d_match_rst(1) = table(4)
                    d_match_rst(2) = table(5)
                    d_match_rst(3) = table(6)
                    d_match_rst(4) = table(7)
                else
                    d_match_rst(0) = table(3)
                    d_match_rst(1) = table(4)
                    d_match_rst(2) = table(5)
                    d_match_rst(3) = table(6)
                    d_match_rst(4) = table(7)
                    zv_getrigidvector(mat_rigid1, 0, 0, 0, table(4), table(5), table(6))'计算刚性变换矩阵
                    zv_contaffine(contlist1, mat_rigid1, tscontlist1)'对轮廓或轮廓序列进行仿射变换
                    zv_contlist(colorimg, tscontlist1, zv_color(0, 255, 0), 0)'在colorsubimg图像上绘制绿色的轮廓序列
                endif
【单次执行】按钮按下时的仿真效果图
使用标定功能的检测效果图
不使用标定功能的检测效果图
本次,正运动技术vplc系列机器视觉运动控制一体机快速入门(六)——标定功能就分享到这里,更多精彩内容请关注“正运动小助手”公众号。
本文由正运动技术原创,欢迎大家转载,共同学习,一起提高中国智能制造水平。文章版权归正运动技术所有,如有转载请注明文章来源。

好的电脑配件怎么可以少得了创基USB-C扩展坞
高通基于Arm处理器到数据中心的部署或将加快
SMT生产流程中需要注意什么
虚拟币OTC交易系统源码开发,量化自动对冲交易软件开发
传统的电线接法到底是怎样的?
VPLC系列机器视觉运动控制一体机快速入门(六)
CNN根本无需理解图像全局结构,一样也能SOTA?
DC/DC变换器中输出滤波器的比较
突破2Tbps带宽!赛灵思首批Virtex-7 X690T FPGA开始发货
石墨烯电池与锂电池哪个比较好
基于AT89S52的家庭智能浇花器设计
动力电池如何进行热管理
Maxim推出3通道 RGB激光驱动器MAX3600
5G时代的到来并不会让WiFi退出历史舞台
一文简述3D打印技术
适合女性的运动电子设备汇总及价格参考
超级方便的轻量级Python流水线工具
新媒体编辑APP开发功能
新唐科技N567HP330(OTP)芯片介绍
基于python的用于构建仿真及测试用例的lib库cocotb