HALCON示例程序board.hdev检测电路板焊锡有无程序剖析

HALCON示例程序board.hdev检测电路板焊锡有无程序剖析

示例程序源码(加注释)

*这是关于系统设置的函数,剪辑区域,设置剪辑区域设置为使能。为clip_region做的设置,后文会介绍
get_system (‘clip_region’, Information)
set_system (‘clip_region’, ‘true’)
*关闭窗口更新
dev_update_window (‘off’)
*关闭窗口
dev_close_window ()
*开启窗口,这个函数之前介绍过了
dev_open_window (0, 0, 512, 512, ‘black’, WindowID)
*读入图片,注意,这里读入了4张图片,都存在images变量当中
read_image (Images, [‘ic0’,‘ic1’,‘ic2’,‘ic3’])
将多个单通道图像转化为多通道图像,这样操作的话这就属于一个变量了,上边读入的时候,四张图像是一个数组并不是一张图像。
channels_to_image (Images, Ic)
*select_obj - 从对象数组中选择对象。现在我们就发现这个images是个图像数组。
*这个算子非常好理解,第一个参数:就是图像数组,也就是我们需要的图片在哪个数组里边;第二个参数:*我们取出的图像叫什么,我们要给他重新命名;第三个参数:你想取出这个图像数组中的哪个图片。
select_obj (Images, Input1, 1)
*显示刚刚取出的图片
dev_display (Input1)
*这个是显示F5继续的那个按钮,之前讲解的历程已经说过了。
set_display_font (WindowID, 14, ‘mono’, ‘false’, ‘false’)
disp_continue_message (WindowID, ‘black’, ‘true’)
*停止一下,让我们能直观的看到我们刚刚取出的图片。
stop ()
*和上边取出第一张图片一样,取出第二张图片并显示。
select_obj (Images, Input2, 2)
dev_display (Input2)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*和上边取出第二张图片一样,取出第三张图片并显示。
select_obj (Images, Input3, 3)
dev_display (Input3)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*和上边取出第三张图片一样,取出第四张图片并显示。
select_obj (Images, Input4, 4)
dev_display (Input4)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*多个通道的平均灰度值。这个算子是这样计算的,先把这个多通道图片的灰度值按照坐标一个一个的相加,*之后除以这个图片的通道数。IC:多通道图片;ImageMean:经过多通道均值计算的图片。
mean_n (Ic, ImageMean)
*显示多通道均值后的图片
dev_display (ImageMean)
*对图像数组Images里边的图片进行阈值分割,选取灰度值在0-40的区域。注意:images里边有4个图片,
*进行阈值分割后也会生成4个区域。
threshold (Images, Darks, 0, 40)
*将将筛选出的区域取并集命名为Dark。
union1 (Darks, Dark)
*对筛选出的区域的空洞进行填充
fill_up (Dark, DarkFilled)
*设置显示颜色为绿色
dev_set_color (‘green’)
*显示刚刚筛选出的区域,现在我们惊奇的发现,竟然把电路板上的电路线全部选取出来了。
dev_display (DarkFilled)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
对图像数组Images里边的图片进行阈值分割,选取灰度值在100-255的区域。注意:images里边有4个图
*片,进行阈值分割后也会生成4个区域。
threshold (Images, Lights, 100, 255)
*将将筛选出的区域取并集命名为Light。
union1 (Lights, Light)
*intersection 算子是取交集,前两个参数是输入区域,也就是你想把哪两个区域取交集;第三个参数是输出
*区域,两个输入区域的交集。
intersection (DarkFilled, Light, Intersection)
*显示ImageMean
dev_display (ImageMean)
*显示Intersection
dev_display (Intersection)
disp_continue_message (WindowID, ‘black’, ‘true’)
*现在是不是又惊奇的发现电路板上电路中有焊锡的部分被筛选出来了。
stop ()
*complement 求取区域的补,怎么理解这个补字呢,就是说这个图片区域内除了你选取区域以外的全部区
*域。第一个参数是要进行取补的区域;第二个参数是输入区域的补。
*特别注意:如果系统标志’clip_region’为’true’(默认值),则返回到目前为止处理的最大图像和输入区域的
差异。如果系统标志’clip_region’为’false’,则resluting区域将无限大。为避免这种情况,通过将Region的补码标志设置为TRUE来实现补码。
complement (DarkFilled, Back)
*显示Back
dev_set_color (‘red’)
dev_display (Back)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*expand_region - 填充区域之间的间隙或分割重叠区域。我们这里用到了填充
*函数原型:expand_region(Regions,ForbiddenArea:RegionExpanded:Iterations,Mode ?
*Regions:要进行填充的区域;ForbiddenArea:填充的边界;ForbiddenArea:填充或者分割之后的区域;Iterations:迭代次数;Mode :模式,填充还是分割。
expand_region (Intersection, Back, RegionExpanded, 10, ‘image’)
*对填充过后的区域进行空洞填充
fill_up (RegionExpanded, Good)
显示;我们现在惊奇的发现电路板上有焊锡的区域被提取的很完整,接下来是不是就好办了,把电路和有焊锡区域做减法不就OK了吗。
dev_display (ImageMean)
dev_set_color (‘green’)
dev_display (Good)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*difference 求取两个区域的不同。前两个参数输入区域,要进行求取差异的区域;第三个参数是差异区域。
difference (DarkFilled, Good, Rest)
*显示
dev_set_color (‘red’)
dev_display (Rest)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*expand_gray - 填充区域之间的间隙,这个算子之前也介绍过了
expand_gray (Rest, Ic, Good, Bad, 6, ‘image’, 5)
*显示
dev_display (Bad)
disp_continue_message (WindowID, ‘black’, ‘true’)
stop ()
*对筛选出的Bad区域进行区域分割
connection (Bad, ConnectedBad)
*使用select_shape 选取面积值在150- 99999的区域,目的是为了消除杂点。
select_shape (ConnectedBad, BigBad, ‘area’, ‘and’, 150, 99999)
*area_center 对区域进行一个面积与位置统计
area_center (BigBad, AreaBad, Row, Column)
*count_obj 对漏焊数量进行计数
count_obj (BigBad, NumMissingSolder)
AreaMissingSolder := sum(AreaBad)
*显示
dev_display (Images)
dev_set_color (‘green’)
dev_set_draw (‘margin’)
dev_set_line_width (3)
dev_display (Good)
dev_set_color (‘red’)
dev_display (BigBad)
dev_set_draw (‘fill’)
dev_set_line_width (1)
dev_update_window (‘on’)
set_system (‘clip_region’, Information)

处理思路

这个电路焊锡检测是一个非常宝贵的例程,因为焊锡表面反光非常强,所以电路板从上下左右四个方向分别进行打光分析,利用了焊锡反光这一特性。把人们最讨厌的反光,通过精巧的思路转化为检测焊锡的利器。

后记

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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值