HALCON示例程序ball电路板焊点识别、检测、测量程序2剖析(与上篇文章使用了不同方法)

HALCON示例程序ball电路板焊点识别、检测、测量程序2

示例程序源码(加注释)

*这是关于显示的函数,已经介绍过了
dev_update_off ()
*定义一个字符串变量ImageNames,ImageNames[0]的含义为’die/die_02’以此类推
ImageNames := ‘die/’ + [‘die_02’,‘die_03’,‘die_04’,‘die_07’]
*设置显示颜色的色彩个数,及不同的连通域使用12种不同颜色表示
dev_set_colored (12)
*读入图片
read_image (Bond, ImageNames[0])
*得到图片尺寸
get_image_size (Bond, Width, Height)
*关闭窗口
dev_close_window ()
*打开窗口
dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)
*设置显示格式
set_display_font (WindowHandle, 16, ‘mono’, ‘true’, ‘false’)
*区域设置为边缘显示模式
dev_set_draw (‘margin’)
*设置线条显示宽度为3
dev_set_line_width (3)
*这句话是HALCON的一个求字符串个数的一个语句,即ImageNames[]数组里边有多少个原素
NumImages := |ImageNames|
*接下来使用FOR循环对每一张图片进行遍历检测
for I := 0 to NumImages - 1 by 1
*读入图片
read_image (Bond, ImageNames[I])
*显示读入图片
dev_display (Bond)
*求图片Bond的最大灰度与最小灰度
min_max_gray (Bond, Bond, 0, Min, Max, Range)
*使用刚刚求得的灰度值最大值对图片进行二值化,这样有一个好处,就是提高了程序的通用性,如果使用固定阈值进行二值化,会导致产品因光照不均或产品位置变化而产生的图片质量差异时导致检测出错。
threshold (Bond, Bright, Max - 80, 255)
*这个算子在上节也介绍过了,求解外接矩形
shape_trans (Bright, Die, ‘rectangle2’)
*显示求得矩形
dev_display (Die)
*使用求得矩形裁剪图片使图片处理区域减少,加快图像处理速度
reduce_domain (Bond, Die, DieGrey)
*再次求解最大最小灰度值,上一次是为了选择出电路板,这一次是为了选择出焊点
min_max_gray (Die, Bond, 0, Min, Max, Range)
*使用刚刚求得的灰度值最小值对图片进行二值化
threshold (DieGrey, Wires, 0, Min + 30)
*选择区域面积介于1-100的进行孔洞填充
fill_up_shape (Wires, WiresFilled, ‘area’, 1, 100)
*使用圆形元素对各个区域进行开运算
opening_circle (WiresFilled, Balls, 9.5)
*把整个定义域进行分割,分割成不同的连通域
connection (Balls, SingleBalls)
*选择最大面积的矩形
select_shape_std (SingleBalls, Rect, ‘rectangle1’, 90)
*矩形不是我们所需要的焊盘,则将选择出来的矩形区域减去
difference (SingleBalls, Rect, IntermediateBalls)
*生成一个空的区域Forbidden
gen_empty_region (Forbidden)
*这个函数是使用矩形区域对区域进行迭代扩张,接触到其他区域或者灰度值相差过大,则停止。或者用于分割区域与区域的重合区域。
*函数原型expand_gray(Regions, Image, ForbiddenArea : RegionExpand : Iterations, Mode, Threshold : )
*Regions:要进行操作的区域;Image:原始图像;RegionExpand:不进行扩张的区域;Iterations:迭代次数;Mode:模式;Threshold:阈值
expand_gray (IntermediateBalls, Bond, Forbidden, RegionExpand, 4, ‘image’, 6)
*对区域使用圆形元素进行开运算
opening_circle (RegionExpand, RoundBalls, 15.5)
*根据区域的相对位置对区域进行排序,这个在上一例子中进行了讲解
sort_region (RoundBalls, FinalBalls, ‘first_point’, ‘true’, ‘column’)
*求取最小外接圆
smallest_circle (FinalBalls, Row, Column, Radius)
*接下来就是使用半径,对焊点的直径求取了平均值
NumBalls := |Radius|
Diameter := 2 * Radius
meanDiameter := sum(Diameter) / NumBalls
mimDiameter := min(Diameter)
dev_display (RoundBalls)
*这里就是对检测的图片个数进行一个判断,如果所有图片检测完了,那么不再显示继续按钮
if (I != NumImages)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
endif
stop ()
endfor

处理思路

这个焊点检测拿到图片后我们想到的他的一个特点是圆的对吧,在一个我们看一下焊盘的灰度值很低,这个例程就是使用了这个特性完成了这个检测任务。先通过阈值对电路板进行了一个选取,减少非电路板部分对检测的干扰。然后通过最大最小灰度阈值选择出焊点,因为照片噪点或者产品本身就有噪点,对封闭区域做了一个填充。之后选择出矩形的干扰。对选择出的焊盘进行了扩张,这是为了使焊点半径求取更加准确。之后使用圆形元素进行了一个开运算,搞掉焊盘的那些毛刺。之后对区域排序求解最小外接矩形。之后做了一个简单计算,大功告成。

后记

大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值