如果机构连压块的位置都不给你保障,那就惨了,就如下图这个样子了。
左边的图如果算是正常的话,右边的图是不是你想叫妈?
压块的位置在跳舞,逼得你不能用固定的ROI来框焊点。
来一张素材图,然后我来整个算法的思路。
基本的思路是,threshold算子取得白色部分的region,然后求出一个内接的Rectangle,然后做下定位把这个矩形画出来。
这个就是我们要的动态的ROI了,无论压块怎么跳舞都不怕了!
list_files ('C:/Users/Administrator/Desktop/焊点图片', ['files','follow_links'], ImageFiles) tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima)$','ignore_case'], ImageFiles) for Index := 0 to |ImageFiles| - 1 by 1 read_image (Image, ImageFiles[Index]) gen_rectangle1 (ROI_0, 114.5, 183.5, 397.5, 599.5) reduce_domain(Image, ROI_0, ImageReduced) threshold (ImageReduced, Regions, 193, 255) closing_rectangle1(Regions, RegionClosing, 320, 320) fill_up(RegionClosing, RegionFillUp) smallest_rectangle2(RegionFillUp, Row, Column, Phi, Length1, Length2) Row:=Row+30 gen_rectangle2(Rectangle1, Row, Column, Phi, Length1, Length2) reduce_domain(Image, Rectangle1, ImageReduced2) mean_image(ImageReduced2, ImageMean, 15, 15) var_threshold(ImageMean, Region, 15, 15, 0.2, 2, 'dark') connection(Region, ConnectedRegions) select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999) closing_circle(SelectedRegions, RegionClosing1, 6.5) smallest_circle(RegionClosing1, Row2, Column2, Radius) gen_circle(Circle, Row2, Column2, Radius) dev_set_draw('margin') dev_set_line_width(2) dev_set_color('red') dev_display(Image) dilation_circle(Circle, RegionDilation, 3.5) dev_display(RegionDilation) stop() endfor
注意var_threshold算子的用法,在使用它前需要事先做图像滤波。这里用的是mean_image(中值滤波)
var_threshold也是动态阈值,上一篇还介绍了bin_threshold。
对于动态阈值完全懵比的童鞋请再读下面的贴子:
(1)Halcon学习(4-6)Region处理:动态阈值,分水岭
本例的效果如下:
因为本篇讨论的话题是动态的决定焊点ROI, 如果论焊点检测的效果还是不行滴,还需要后续文章继续讨论。
下面放几张由本算法处理的结果图片以满足下各位的好奇心。
左边这张有多选和误选的问题,多选表现在同一个位置出现两个圆。
右边那张误选严重,但是背景混合的焊点也正确选择对了。
左边这张箭头所指的焊点没选中,原因你懂的! 如果你认为是它和左边压块粘边了,那你就错了,其实它只是面积太小,被过滤掉了。
右边这张右上那个点也选中了,让人惊讶。
左边这张图其右下那个点出现了可怕的粘连。粘连问题是个重要的课题。
右边这张图其左边两个点为什么没有出现粘连问题呢? 这是因为动态决定ROI区域的机制避免了这个问题!
于是问题来了,为什么左图那个大红圈的点与下边框粘连到一起了呢?为什么动态ROI没能在这里发挥作用呢?
这是因为我在代码里,只是把内接矩形不加判断的直接下移30个像素,其实这样做对于这张图片上来说是不对的,会造成选中了底部黑色部分。
如下图,正常图片内接矩形下移30个像素是碰不到底边黑色部分的。
因此,我们的动态ROI还是需要再改进,可以自动决定是否可以下移30个像素,如果不能则能计算出最多能下移多少像素。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

