在《会PLC也能玩转机器视觉(二)》的课程中,我们讲述了ZPLC调用BASIC子程序完成机器视觉识别条形码的功能。

本期课程我们将通过BLOB斑点定位的视觉功能,继续和大家一起探讨使用ZPLC语言实现机器视觉功能的方法。

会PLC也能玩转机器视觉(三) BLOB斑点定位

一、检测原理

## (一)BLOB斑点检测

使用形态学方法(如二值化、膨胀、腐蚀等)将灰度图像转换成二值化图像,转换同时将检测特征处理成BLOB斑点并将干扰因素处理成图像背景,就可以准确地对检测特征进行提取并进一步处理。

##  (二)BLOB斑点定位

当需要检测的样品具有固定形状(如为圆环小零件)时,检测到BLOB斑点区域后,可以根据区域的特性,获取BLOB斑点区域的面积和中心位置XY,从而达到BLOB斑点定位的目的。同时还可以根据BLOB斑点区域拟合成最小外接矩形,并根据矩形宽高比过滤筛选掉不符合条件的BLOB斑点。

二、软件实现

## (一)检测要求

使用ZDevelop软件的ZBASIC编程语言编写程序,用于检测以下路径中图片的样品重心位置XY。再使用ZPLC编程语言调用BASIC程序的主任务,进行循环检测识别。

## (二)实例演示

1.打开ZDevelop软件:新建项目→新建HMI文件→新建main.bas文件→新建global_variable.bas文件→新建Plc1.plc文件,用于编写PLC执行程序→文件添加到项目。

2.设计HMI界面。

3.在global_variable.bas文件中添加全局变量。

        '''''全局变量大部分使用数组结构'''''''注:basic编程中很多函数会以TABLE(系统的数据结构)做为参数''table        说明                 table         说明''2       亮区域的面积            6       连通区域的数量            ''40~42  小圆斑点的面积和位置X,Y数据        '主任务状态'0 - 未初始化'1 - 停止'2 - 运行中'3 - 正在停止GLOBAL DIM main_task_statemain_task_state = 1' 定义主任务id - 10GLOBAL DIM main_task_idmain_task_id = 10'定义全局图像变量GLOBAL ZVOBJECT grabImg,disImg ''采集图像,显示图像'检测消耗时间GLOBal DIM d_detect_time'小圆的位置x/y结果GLOBal DIM d_circle_rst(24)'显示打印的字符GLOBAL ShowString(64)'定义本地图片索引GLOBAL DIM d_index'定义读取图片的路径GLOBAL DIM File_Name(100)   '运行HMI文件RUN "Hmi.hmi",1

4.关联HMI界面控件变量。

5.在main.bas文件中添加界面初始化函数,并在hmi系统设置中关联初始化函数名。

        end'注:'凡是要使用Region有关的算子在系统初始化时都要调用ZV_RESETCLIPSIZE(width, height)这个算子设置下图像尺寸,以满足相机分辨率,因为默认的是640*480尺寸'HMI界面初始化函数GLOBAL SUB hmi_init()main_task_state = 1          '主任务停止运行ZV_RESETCLIPSIZE(1280, 960)'初始化时依据图像分辨率设置区域的裁剪尺寸,此处图像分辨率为1280x960ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 7), HMI_CONTROLSIZEY(10, 7)) '设置锁存的大小'初始化测量参数d_index      = 0TABLE(6)=0   '将小圆数量初始化为0for i=0 to 23d_circle_rst(i)=0next ZV_SETSYSDBL("CamGetTimeout", 1000) '设置采集超时ZV_LATCHCLEAR(0)           '清空锁存通道0END SUB

6.在main.bas文件中添加HMI界面按下测试按钮响应的函数,并关联动作函数名。

        'HMI界面按下测试按钮时响应的函数GLOBAL SUB btn_test() TICKS=0'循环读取本地图片if(d_index=3) then d_index=0endifFile_Name="\圆定位\"+TOSTR(d_index,1,0)+".bmp"   '.../flash/圆定位/目录下的图片所在的路径名称ZV_IMGREAD(grabImg,File_Name,0)ZV_LATCH(grabImg, 0) TABLE(6)=0   '检测前先将数据清0d_detect_time=0for i=0 to 23d_circle_rst(i)=0next'定义变量,依次为白色像素连通区域,掩模区域,连通区域结果列表,小圆斑点区域ZVOBJECT regionWhite, regionMask, re_connecte,circle_connectZV_REGENFULLIMG(grabImg,regionMask)'根据低阈值和高阈值参数生成白色像素图像regionWhiteZV_RETHRESH(grabImg, regionMask, regionWhite, 128,255)'对白色像素区域进行一次1*1的开运算ZV_REOPENING(regionWhite,regionWhite,1,1)'对白色像素区域进行一次1*1的闭运算ZV_RECLOSING(regionWhite,regionWhite,1,1)'计算BLOB面积ZV_REAREA(regionWhite, 2)              '计算regionWhite亮区域的面积,存放到table(2)中  if(TABLE(2)>0) then '如果获取到的白色像素数量大于0                 ZV_RECONNECT(regionWhite,re_connecte) '计算区域的连通区域,存放到re_connecte列表中zv_refilter(re_connecte,0,11000,12000,0)'对区域列表中的区域进行过滤,保留面积在11000到12000的区域,面积不在此范围的区域将被过滤掉zv_refilter(re_connecte,20,0.9,1.1,0)'对区域列表中的连通区域进行过滤,保留最小外接矩形高宽比在0.9 到 1.1 的区域ZV_RESORT(re_connecte,1,1)   '对区域列表中的区域按照重心X的数据进行升序排序ZV_LISTCOUNT(re_connecte,6) '获取列表中的连通区域的数量,存放到table(6)中 endifZV_GRAYTORGB(grabImg,disImg)'将灰度图转换到RGB图像,用于绘制检测结果图像ZV_REGION(disImg, regionMask, 0, ZV_COLOR(0,0,0))'在disImg中绘制黑色的regionMask区域ZV_REGION(disImg, regionWhite, 0, ZV_COLOR(255,255,255))'在disImg中绘制白色的regionWhite区域for i=0 to TABLE(6)-1     '循环获取小圆斑点的位置XY信息生成圆测量器,检测圆心位置ZV_LISTGET(re_connecte,circle_connect,i)   '获取列表中序号为i的元素,即依次获取列表中小圆斑点的连通区域ZV_REGION(disImg,circle_connect,0,ZV_COLOR(255,255,0))'绘制斑点区域ZV_REAREACENTER(circle_connect,40)  '计算斑点区域的面积与中心位置,将位置放入TABLE(40)中ZV_MARKER(disImg,TABLE(41),TABLE(42),0,50,zv_color(0,255,0))   '在图像img中绘制十字ShowString=TOSTR(i,1,0)   '将BLOB的数量转换成字符串变量ZV_TEXT(disImg,ShowString,TABLE(41),TABLE(42),50,ZV_COLOR(0,0,255)) '显示结果文本d_circle_rst(i*2+0)=TABLE(41)'将测量圆的结果赋值给圆心变量,显示到界面中d_circle_rst(i*2+1)=TABLE(42)nextZV_LATCH(disImg, 0)     '在锁存通道0中显示结果图像d_index=d_index+1d_detect_time=ABS(TICKS)'计算检测消耗时间END SUB

7.在main.bas文件中添加HMI界面按下运行按钮响应的函数,并关联动作函数名。

        'HMI界面按下运行按钮时响应的函数GLOBAL SUB btn_run()if(2 = main_task_state) then           '如果主任务处于运行状态,打印提示信息并退出函数?"已经开启连续运行任务,请勿重复操作!"return endifif (1 = main_task_state) then          '如果主任务处于停止状态if (0 = PROC_STATUS(main_task_id)) then '如果任务未开启main_task_state = 2            '主任务状态设置为2,表示正在执行连续任务RUNTASK  main_task_id, main_task  '开启主任务endifendifEND SUB''主任务实现函数'main_task:'  while(1)'    if (3 = main_task_state) then      '如果主任务状态处于3即按下停止按钮时'      main_task_state = 1             '将主任务状态置为1'      exit while                     '退出循环'    endif'    '    '重复执行采集和检测函数'    btn_test()'    '  wend'END

8.在main.bas文件中添加HMI界面按下停止按钮响应的函数,并关联动作函数名。

        'HMI界面按下停止按钮时响应的函数GLOBAL SUB btn_stop()if (2 = main_task_state) then   '如果主任务状态处于3即正在连续执行任务时main_task_state = 3        '将主任务状态置为3,退出循环endifEND SUB

9.在main.bas文件中注释连续运行执行的主任务的函数部分,在Plc1.plc文件中添加ZPLC调用主任务执行函数子程序的代码。

三、效果演示


本次,正运动技术会PLC也能玩转机器视觉(三) BLOB斑点定位,就分享到这里。

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

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

会PLC也能玩转机器视觉(三)- BLOB斑点定位相关推荐

  1. 会PLC也能玩转机器视觉(一)

    梯形图(LAD, LadderLogic Programming Language)是PLC使用得最多的图形编程语言,被称为PLC的第一编程语言. 梯形图语言沿袭了继电器控制电路的形式,梯形图是在常用 ...

  2. 会PLC也能玩转机器视觉(二)- 条码识别

    前几期课程,我们讲述了PLC的梯形图语言的基本知识,并与大家分享了使用ZDevelop软件的ZPLC语言调用ZVision视觉指令的方法. 本期课程我们将通过使用ZPLC语言实现识别条形码的视觉功能的 ...

  3. 会PLC也能玩转机器视觉(二)

    前几期课程,我们讲述了PLC的梯形图语言的基本知识,并与大家分享了使用ZDevelop软件的ZPLC语言调用ZVision视觉指令的方法. 本期课程我们将通过使用ZPLC语言实现识别条形码的视觉功能的 ...

  4. CV:传统视觉知识—机器视觉系统的基础知识(机器视觉三要素+典型的工业机器视觉系统五大组件)

    CV:传统视觉知识-机器视觉系统的基础知识(机器视觉三要素+典型的工业机器视觉系统五大组件) 目录 机器视觉三要素 1.what-测量.判断 2.why-灵活性.自动化

  5. SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行)

    SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 原文:SQL Server调优系列玩转篇三(利用索引提示(Hint)引导语句最大优化运行) 前言 本篇继续玩转模块 ...

  6. 好久没玩laravel了,5.6玩下(三)

    好久没玩laravel了,5.6玩下(三) 好了,基础的测试通了,咱们开始增删改了 思路整理 先创建项目功能控制器 然后设置路由访问规则 然后开发项目的增删改功能 1 先创建项目的控制器 php ar ...

  7. 企业玩TikTok的三种方式

    企业玩TikTok的三种方式 一.电影教育性15秒视频 TikTok与YouTube不一样,在YouTube上,冗长的视频已成为常态.取而代之的是,TikTok视频的建议长度通常为15秒,即15秒宝贵 ...

  8. 【Microsoft Azure 的1024种玩法】三十. 使用Azure Data Studio之快速上手连接管理Azure SQL 数据库(一)

    [简介] Azure Data Studio 是一种跨平台的数据库工具,适合在 Windows.macOS 和 Linux 上使用本地和云数据平台的数据专业人员,Azure Data Studio 利 ...

  9. 三菱fx5U控制三轴伺服定位。(BOM表,CAD电气图纸,plc程序,人机界面)

    三菱fx5U控制三轴伺服定位.(BOM表,CAD电气图纸,plc程序,人机界面)5625627268876253电气攻城师1

最新文章

  1. kafka消费者如何读同一生产者消息_Kafka消费者生产者实例
  2. BZOJ 4422 Cow Confinement (线段树、DP、扫描线、差分)
  3. 201119阶段二sqlite3
  4. f分布表完整图_分布式计算引擎之星——Spark
  5. Java PushbackReader mark()方法与示例
  6. 线性代数的本质(干货!)
  7. spring:利用Spring AOP 使日志输入与方法分离
  8. phpMyAdmin出现错误 Access denied for user 'root'@'localhost' (using password: NO)
  9. 芯片领域再起风波 国内IC行业挑战来临
  10. 什么是 SNMP 和 MIB什么是 SNMP 和 MIB
  11. Minimum Snap闭式求解相关公式推导
  12. android自动打开软键盘,Android打开关闭软键盘
  13. 域名系统(Domain Name System,DNS)
  14. 大汉诡辩达人陆贾的公关策略cathy荷塘月色新浪博客
  15. 阿里技术专家的编程方法论:如何写出一手漂亮的代码?
  16. 【NOIP2014】提高组初赛答案加解析
  17. 概率图模型(6)马尔科夫随机场
  18. SSM使用poi把Excel内容读取到数据库和把数据库内容导出到Excel
  19. Android Study Material Design 十 再探沉浸式
  20. WebDAV之葫芦儿·派盘+书藏家

热门文章

  1. 最新计算机java毕业设计选题题目推荐
  2. linux 内存清理 释放命令,linux 内存清理释放命令(示例代码)
  3. python分析红楼梦中人物形象_《红楼梦》三大人物形象分析
  4. 如何快速制作一个H5单页面网站
  5. Unity3D-游戏ARVR开发进阶课程 - 动画系统-宋晓波-专题视频课程
  6. hdu 6578 Blank dp求 给定区间中数字不同的方案数
  7. CSS篇之5. 样式的层级关系,选择器优先级,样式冲突,以及抽离样式模块怎么写,说出思路,有无实践经验
  8. 原生js实现星级评分
  9. 天津成考计算机水平考试,天津市成考《计算机基础考试大纲》(高中起点)
  10. 官网下载Eclipse历史版本