HALCON之焊点检测(四):动态定位焊点区域ROI
如果机构连压块的位置都不给你保障,那就惨了,就如下图这个样子了。
左边的图如果算是正常的话,右边的图是不是你想叫妈?
压块的位置在跳舞,逼得你不能用固定的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 1read_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+30gen_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处理:动态阈值,分水岭
(2)视觉检测之焊点检测(三):从干扰背景中提取焊点
本例的效果如下:

因为本篇讨论的话题是动态的决定焊点ROI, 如果论焊点检测的效果还是不行滴,还需要后续文章继续讨论。
下面放几张由本算法处理的结果图片以满足下各位的好奇心。
左边这张有多选和误选的问题,多选表现在同一个位置出现两个圆。
右边那张误选严重,但是背景混合的焊点也正确选择对了。

左边这张箭头所指的焊点没选中,原因你懂的! 如果你认为是它和左边压块粘边了,那你就错了,其实它只是面积太小,被过滤掉了。
右边这张右上那个点也选中了,让人惊讶。

左边这张图其右下那个点出现了可怕的粘连。粘连问题是个重要的课题。
右边这张图其左边两个点为什么没有出现粘连问题呢? 这是因为动态决定ROI区域的机制避免了这个问题!

于是问题来了,为什么左图那个大红圈的点与下边框粘连到一起了呢?为什么动态ROI没能在这里发挥作用呢?

这是因为我在代码里,只是把内接矩形不加判断的直接下移30个像素,其实这样做对于这张图片上来说是不对的,会造成选中了底部黑色部分。
![]()
如下图,正常图片内接矩形下移30个像素是碰不到底边黑色部分的。

因此,我们的动态ROI还是需要再改进,可以自动决定是否可以下移30个像素,如果不能则能计算出最多能下移多少像素。
参考来源:www.skcircle.com
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
