halcon PCB板上找焊盘的实例讲解

本文介绍了一种用于检测半导体封装中球形焊点的图像处理算法。该算法通过二值化、形态学操作等步骤从图像中识别并测量焊点的尺寸。
* ball.hdev: Inspection of Ball Bonding

dev_update_window ('off')
dev_close_window ()
dev_open_window (0, 0, 728, 512, 'black', WindowID)
read_image (Bond, 'die/die_03')
dev_display (Bond)
set_display_font (WindowID, 14, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
*二值化
threshold (Bond, Bright, 100, 255)
*把区域变换为长方形
shape_trans (Bright, Die, 'rectangle2')
dev_set_color ('green')
dev_set_line_width (3)
dev_set_draw ('margin')
dev_display (Die)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*重新剪切图片,边上的不要

reduce_domain (Bond, Die, DieGrey)


*二值化
threshold (DieGrey, Wires, 0, 50)
*填充中间空洞

fill_up_shape (Wires, WiresFilled, 'area', 1, 100)


dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*开运算,先腐蚀后膨胀,用来清除掉小杂点;闭运算相反,用来填充.

opening_circle (WiresFilled, Balls, 15.5)


dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*计算连通区域
connection (Balls, SingleBalls)
*选择像圆的区域
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0)
*排队排队
sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column')
dev_display (Bond)
dev_set_colored (12)
dev_display (FinalBalls)
disp_continue_message (WindowID, 'black', 'true')
stop ()
*这个关键了,最小化拟合圆,还得到了中心点和半径
smallest_circle (FinalBalls, Row, Column, Radius)
NumBalls := |Radius|
Diameter := 2*Radius
meanDiameter := sum(Diameter)/NumBalls
mimDiameter := min(Diameter)
dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i := 1 to NumBalls by 1
    if (fmod(i,2)=1)
        disp_message (WindowID, 'D: '+Diameter[i-1], 'image', Row[i-1]-2.7*Radius[i-1], max([Column[i-1]-60,0]), 'white', 'false')
    else
        disp_message (WindowID, 'D: '+Diameter[i-1], 'image', Row[i-1]+1.2*Radius[i-1], max([Column[i-1]-60,0]), 'white', 'false')
    endif

endfor


* dump_window (WindowID, 'tiff_rgb', './ball')
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()
dev_close_window ()
使用 Halcon 进行 PCB 上 pad 边界识别可以按以下步骤进行: ### 图像读取与预处理 首先,使用 `read_image` 算子读取 PCB 的图像。为了更好地进行后续处理,通常需要对图像进行预处理,比如灰度化(如果是彩色图像)、滤波去噪等。以下是示例代码: ```python import halcon as ha # 读取图像 hv_Image = ha.read_image('pcb_image.jpg') # 灰度化(如果是彩色图像) if ha.get_image_type(hv_Image) == 'rgb': hv_GrayImage = ha.rgb1_to_gray(hv_Image) else: hv_GrayImage = hv_Image # 中值滤波去噪 hv_FilteredImage = ha.median_image(hv_GrayImage, 'circle', 3, 'mirrored') ``` ### 边缘检测 使用合适的边缘检测算子来检测图像中的边缘。常用的边缘检测算子有 `sobel_filter`、`canny` 等。以 `canny` 算子为例: ```python # Canny 边缘检测 hv_Edges = ha.canny_edge(hv_FilteredImage, 'canny', 1, 20, 40) ``` ### 区域分割与筛选 通过边缘检测得到的边缘可能包含很多不需要的信息,需要进行区域分割和筛选,以出与 pad 相关的区域。可以使用形态学操作(如膨胀、腐蚀)和连通区域分析来实现。 ```python # 形态学膨胀 hv_DilatedEdges = ha.dilation_circle(hv_Edges, 3) # 连通区域分析 hv_ConnectedRegions = ha.connection(hv_DilatedEdges) # 根据面积、形状等特征筛选 pad 区域 hv_PadRegions = ha.select_shape(hv_ConnectedRegions, 'area', 'and', 100, 99999) ``` ### 边界拟合 对于筛选出的 pad 区域,可以使用 `fit_circle_contour_xld` 或 `fit_ellipse_contour_xld` 等算子来拟合 pad 的边界。 ```python # 提取区域的轮廓 hv_PadContours = ha.gen_contours_skeleton_xld(hv_PadRegions, 1, 'filter') # 拟合圆形边界 hv_CircleParameters = ha.fit_circle_contour_xld(hv_PadContours, 'atukey', -1, 0, 0, 3, 2) ``` ### 结果可视化 将识别出的 pad 边界在原图像上进行可视化展示。 ```python # 在原图像上绘制圆形边界 ha.disp_circle(hv_Image, hv_CircleParameters[0], hv_CircleParameters[1], hv_CircleParameters[2]) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值