会PLC也能玩转机器视觉(三)

  1.png

  

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

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

  

  《视频教程:会PLC也能玩转机器视觉(三)》

  一 检测原理

  

  (一)BLOB斑点检测

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

  (二)BLOB斑点定位

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

  二 软件演示

  

  (一)检测要求

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

  

  2.png

  

  (二)实例演示

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

  

  3.png

  

  2.设计HMI界面。

  

  4.png

  

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

  

            '''''全局变量大部分使用数组结构'''''

            ''注:basic编程中很多函数会以TABLE(系统的数据结构)做为参数

            ''table        说明                 table         说明

            ''2       亮区域的面积            6       连通区域的数量            

            ''40~42  小圆斑点的面积和位置X,Y数据        

            

            '主任务状态

            '0 - 未初始化

            '1 - 停止

            '2 - 运行中

            '3 - 正在停止

            GLOBAL DIM main_task_state

            main_task_state = 1

            

            ' 定义主任务id - 10

            GLOBAL DIM main_task_id

            main_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.png

  

  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)'初始化时依据图像分辨率设置区域的裁剪尺寸,此处图像分辨率为1280x960

                ZV_LATCHSETSIZE(0, HMI_CONTROLSIZEX(10, 7), HMI_CONTROLSIZEY(10, 7)) '设置锁存的大小

                  '初始化测量参数

                d_index      = 0

                TABLE(6)=0   '将小圆数量初始化为0

                for i=0 to 23

                    d_circle_rst(i)=0

                next 

                       

                ZV_SETSYSDBL("CamGetTimeout", 1000) '设置采集超时

                ZV_LATCHCLEAR(0)           '清空锁存通道0

            END SUB

  

  6.png

  

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

  

            'HMI界面按下测试按钮时响应的函数

            GLOBAL SUB btn_test() 

              

                TICKS=0

                '循环读取本地图片

                if(d_index=3) then 

                    d_index=0

                endif

                File_Name="\圆定位\"+TOSTR(d_index,1,0)+".bmp"   '.../flash/圆定位/目录下的图片所在的路径名称

                ZV_IMGREAD(grabImg,File_Name,0)

                ZV_LATCH(grabImg, 0) 

                TABLE(6)=0   '检测前先将数据清0

                d_detect_time=0

                for i=0 to 23

                    d_circle_rst(i)=0

                next

                '定义变量,依次为白色像素连通区域,掩模区域,连通区域结果列表,小圆斑点区域

                ZVOBJECT regionWhite, regionMask, re_connecte,circle_connect

                ZV_REGENFULLIMG(grabImg,regionMask)

                '根据低阈值和高阈值参数生成白色像素图像regionWhite

                  ZV_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)中 

                endif

                ZV_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)

                next

                ZV_LATCH(disImg, 0)     '在锁存通道0中显示结果图像

                d_index=d_index+1

                d_detect_time=ABS(TICKS)'计算检测消耗时间

              

            END SUB

  

  7.png

  

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

  

            'HMI界面按下运行按钮时响应的函数

            GLOBAL SUB btn_run()

                 if(2 = main_task_state) then           '如果主任务处于运行状态,打印提示信息并退出函数

                      ?"已经开启连续运行任务,请勿重复操作!"

                 return 

                 endif

                 

                if (1 = main_task_state) then          '如果主任务处于停止状态

                    if (0 = PROC_STATUS(main_task_id)) then '如果任务未开启

                        main_task_state = 2            '主任务状态设置为2,表示正在执行连续任务

                        RUNTASK  main_task_id, main_task  '开启主任务

                    endif

                endif

            END 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.png

  

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

  

            'HMI界面按下停止按钮时响应的函数

            GLOBAL SUB btn_stop()

                if (2 = main_task_state) then   '如果主任务状态处于3即正在连续执行任务时

                     main_task_state = 3        '将主任务状态置为3,退出循环

                endif

              

            END SUB

  

  9.png

  

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

  

  10.png

  

  小视频

  

  11.png

  12.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值