电子说
背景
轮廓提取是基于边缘轮廓的算法,可用于需要提取工件轮廓信息后进行加工处理的检测加工项目,可广泛应用于点胶、激光切割、工件打磨等需要提取工件轮廓的领域。
轮廓是一种能存储一系列点集的数据结构,可分为像素轮廓或亚像素轮廓。 轮廓指令只能提取特定属性的轮廓。
提取图像的边缘信息时会不可避免地提取到一些非检测目标的干扰轮廓信息,如未闭合的边缘线条、毛刺等轮廓信息。
此时我们需要使用图像预处理或者设置一些过滤条件来过滤一些干扰噪点。因此我们还需要根据目标的轮廓特点过滤掉杂散的冗余边缘或进行边缘的修补等操作去获取我们实际所需的目标轮廓信息。
轮廓提取效果如下图所示:
将目标轮廓提取完成之后,我们就可以提取轮廓点集位置信息进行工件相 关的轮廓随动加工处理。
注意:提取图像目标轮廓前需确保图像内目标轮廓的对比度明显,才能保证轮廓提取的精度。
在上期课程中,我们讲述了如何使用 VPLC系列机器视觉运动控制一体机进行 图像拼接 的课程。本期课程正运动小助手给大家分享一下 VPLC系列机器视觉运动控制一体机进行轮廓提取的课程。
一.VPLC控制器
(一)VPLC516E构架图
(二)课前准备
1.电脑一台,安装ZDevelop3.10以上版本软件
2.VPLC516E一台
3.24V直流电源一个
4.网线一根
5.WinSCP软件
6.电线若干
二.课程主要使用的指令
1.ZV_AUTOTHRESH -- 自动二值化
ZV_AUTOTHRESH(src,dst,tab_thresh)
描述:
使用OTSU算法计算最佳阈值并对图像进行自动二值化处理。
参数:
src:ZVOBJECT类型,源图像,单通道图像
dst:ZVOBJECT类型,二值图像
tab_thresh:TABLE索引,输出参数,使用的分割阈值
2.ZV_CONTGEN -- 生成轮廓
ZV_CONTGEN(img,contlist,mode,appro)
描述:
提取二值图像的边缘轮廓。
参数:
img:ZVOBJECT类型,源二值图像
contlist:ZVOBJECT类型,提取到的轮廓序列,列表类型,轮廓序列中包含多个轮廓,每个轮廓由一系列的点集构成
mode:轮廓提取方式:0-外轮廓即被某轮廓封闭包围的所有轮廓将不被提取,1-所有轮廓
appro:轮廓表示方式:0-点集方式即轮廓用一系列的点集表示,1-精简方式即轮廓用一系列的点集表示但水平、垂直、对角线将被精简成两个端点,建议使用1
3.ZV_CONTFILTER -- 过滤
ZV_CONTFILTER(contlist,feature,min,max,is_invert)
描述:
将轮廓序列中的轮廓以某种特征进行过滤,保留满足特征要求的轮廓。
参数:
contlist:ZVOBJECT类型,待过滤的轮廓序列,列表类型
feature:轮廓特征类型,参考排序,可取值-1,则按照顺序取序号在范围内的轮廓
min:特征值的下限
max:特征值的上限
is_invert:是否反向选择,为1则保留不在范围内的轮廓,默认值为0
4.ZV_CONTSORT -- 排序
ZV_CONTSORT(contlist,feature,is_inc)
描述:
对轮廓序列按照特征feature进行排序。
参数:
contlist:ZVOBJECT类型,待排序的轮廓序列,列表类型
feature:排序的特征类型,如下表所示
is_inc:指定是否升序,为0则降序排列,否则升序
轮廓特征如下:
5.ZV_CONTCOUNT -- 轮廓点数量
ZV_CONTCOUNT(contour,tab_count)
描述:
获取轮廓中点的数量,支持在线命令,使用无需传入TABLE索引参数。
参数:
contour:ZVOBJECT类型,轮廓
tab_count:TABLE索引,输出参数,点的数量
6.ZV_CONTGETPT -- 轮廓点遍历
ZV_CONTGETPT(contour,id,tab_pt)
描述:
获取轮廓中的指定点坐标。
参数:
contour:ZVOBJECT类型,轮廓
id:指定点的id,第一个点的id为0
tab_pt:TABLE索引,输出参数,获取的点坐标x,y
7.ZV_CONTLIST -- 轮廓绘制
ZV_CONTLIST(img,contlist,color,auto_color)
描述:
绘制轮廓序列。
参数:
img:ZVOBJECT类型,绘制的目标图像
contlist:ZVOBJECT类型,轮廓序列
color:绘制序列的颜色,img为彩色图像时可用ZV_COLOR(r,g,b)生成颜色,img为黑白图像时颜色取值为[0,255],如黑色0,灰色128,白色255
auto_color:是否自动设置颜色,为1则自动设置不同的颜色,color将不再使用
三、软件实现
1. 打开ZDevelop软件:新建名称为“轮廓提取.zpj”项目→新建“HMI”文件→新建“Basic.bas”文件 (用于编写界面响应函数、并开启HMI自动运行任务) →新建“相机采集.bas”文件 (用于实现相机采集功能 )→新建“初始化.bas”文件 (用于初始化测量参数) →文件添加到项目。
2.设计HMI主界面,并关联它的控件变量。
3.编写实现对图像进行轮廓提取的执行函数。
'轮廓提取执行程序
GLOBAL sub main()
LOCAL dot_count,i
DMSET TABLE(10000,10000,0)
ZV_IMGCOPY(GrabImg,testImg) '复制图像
ZV_AUTOTHRESH(testImg,testImg,0) '自动二值化
ZV_CONTGEN(testImg,contlist,outline_mode,outline_appro) '生成轮廓
ZV_CONTFILTER(contlist,filt_param(0),filt_param(1),filt_param(2),0)'对轮廓列表中的轮廓进行过滤
ZV_GRAYTORGB(GrabImg,ResImg) '灰度图转彩色图
ZV_CONTSORT(contlist,filt_param(0),0)'对轮廓以周长特征进行降序排序
ZV_LISTGET(contlist,con,0)'获取第0个轮廓
dot_count = ZV_CONTCOUNT(con)'获取轮廓点数量
TABLE(10)=dot_count
FOR i = 0 TO dot_count-1
ZV_CONTGETPT(con,i,10000+i*2)'轮廓中的点坐标放到TABLE(0)中
NEXT
ZV_CONTLIST(ResImg,contlist,zv_color(0,255,0)) '绘制轮廓序列
ZV_LATCH(ResImg,1)
ENDSUB
本次,正运动技术【机器视觉运动控制一体机小课堂】 三分钟进行轮廓提取 ,就分享到这里。
审核编辑 黄昊宇
全部0条评论
快来发表一下你的评论吧 !