摘要:针对半导体引线键合工艺中的金线尺寸检测需求,本文提出基于C#与HALCON的矩形测量解决方案。通过
gen_measure_rectangle2
算子生成高精度测量区域,结合measure_pos
算子实现亚像素级边缘定位,完成金线宽度、间距等关键尺寸的实时测量。系统集成CPK过程能力分析与PLC实时控制,实测测量精度达±0.5μm,CPK值实时监控确保工艺稳定性。文中详细阐述测量原理、算法实现及工业集成流程,并提供完整代码与可视化检测结果。
文章目录
【C# + HALCON 机器视觉】测量矩形生成算子(gen_measure_rectangle2
)在半导体引线键合检测中的深度应用
关键词:C#;HALCON;gen_measure_rectangle2
;半导体检测;金线测量;CPK分析;PLC控制
一、引言
半导体引线键合(Wire Bonding)是芯片封装的关键工艺,金线宽度(通常5-25μm)与间距(10-50μm)的精度直接影响电气性能。传统接触式测量易损伤器件,而基于gen_measure_rectangle2
的机器视觉方案可实现非接触式亚像素级测量。本文结合HALCON的矩形测量算子与C#工业控制技术,构建从图像采集、尺寸测量到工艺调整的闭环系统,满足半导体行业对高精度、高稳定性检测的需求。
二、测量原理与算子解析
2.1 gen_measure_rectangle2
原理
该算子用于生成矩形测量区域,核心参数:
Row
/Column
:矩形中心坐标(亚像素精度)Phi
:矩形旋转角度(弧度,逆时针为正)Length1
/Length2
:矩形半长轴与半短轴长度Width
:测量线宽度(像素,通常设为1)
数学模型:
矩形边界方程为:
{ x = Row + L 1 ⋅ cos ( Φ ) ⋅ s − L 2 ⋅ sin ( Φ ) ⋅ t y = Column + L 1 ⋅ sin ( Φ ) ⋅ s + L 2 ⋅ cos ( Φ ) ⋅ t \begin{cases} x = \text{Row} + L_1 \cdot \cos(\Phi) \cdot s - L_2 \cdot \sin(\Phi) \cdot t \\ y = \text{Column} + L_1 \cdot \sin(\Phi) \cdot s + L_2 \cdot \cos(\Phi) \cdot t \end{cases} {
x=Row+L1⋅cos(Φ)⋅s−L2⋅sin(Φ)⋅ty=Column+L1⋅sin(Φ)⋅s+L2⋅cos(Φ)⋅t
其中 $ s \in [-1, 1], t \in [-w/2, w/2] , , , w $ 为测量线宽度。
2.2 测量流程
三、硬件与软件架构
3.1 硬件系统搭建
- 相机:Basler acA1920-155um(1920×1200像素,155fps)
- 镜头:Navitar 12MP远心镜头(畸变<0.1%)
- 光源:525nm波长LED同轴光源(均匀性>95%)
- 传感器:基恩士IL-600激光位移传感器(精度±0.1μm)
3.2 软件功能模块
模块名称 | 核心功能 |
---|---|
图像预处理 | 平场校正、高斯滤波、动态阈值分割 |
测量区域生成 | gen_measure_rectangle2 创建旋转矩形ROI |
边缘测量 | measure_pos 提取亚像素边缘坐标 |
尺寸计算 | 宽度、间距、角度等参数计算 |
过程控制 | CPK值计算与PLC压力参数调整 |
数据追溯 | MongoDB存储测量数据与图像日志 |
四、核心代码实现
4.1 图像预处理与ROI定位
private HObject PreprocessImage(HObject ho_Image)
{
try
{
// 平场校正
HObject ho_FlatField;
HOperatorSet.ReadImage(out ho_FlatField, "flat_field.png");
HOperatorSet.FlatField(ho_Image, ho_FlatField, out ho_Image, "ramp");
// 高斯滤波
HOperatorSet.GaussFilter(ho_Image, out ho_Image, 1.5, 1.5, "mirrored");
// 动态阈值分割
HOperatorSet.DynThreshold(ho_Image, ho_Image, out HObject ho_Segmented,
"max_separability", "light", 0.2);
// 形态学去噪
HOperatorSet.ClosingCircle(ho_Segmented, out ho_Segmented, 2);
HOperatorSet.Connection(ho_Segmented, out ho_Segmented);
return ho_Segmented;
}
catch (HOperatorException ex)
{
Logger.Error($"预处理失败: {
ex.Message}");
throw;
}
}
4.2 测量矩形生成与边缘提取
private void GenerateMeasureRectangles(HTuple hv_Region, out List<MeasureData> measureDatas)
{
measureDatas = new List<MeasureData>();
HTuple hv_Num = null;
// 获取缺陷区域轮廓
HOperatorSet.Boundary(hv_Region, out HObject ho_Boundary, "outer");
HOperatorSet.MinMaxBoundingRectangle(ho_Boundary, out HTuple hv_Row, out HTuple hv_Column,
out HTuple hv_Row2, out HTuple hv_Column2);
// 计算矩形中心与角度
double centerRow = (hv_Row.D + hv_Row2.D) / 2;
double centerColumn = (hv_Column.D + hv_Column2.D) / 2;
double angle = CalculateRegionAngle(ho_Boundary); // 自定义角度计算函数
// 生成测量矩形(宽度方向)
HTuple measureHandleWidth;
HOperatorSet.GenMeasureRectangle2(centerRow, centerColumn, angle,
(hv_Row2.D - hv_Row.D)/2, 2, // Length1=半长轴,Length2=2μm(根据标定系数转换)
ho_Image.Width, ho_Image.Height, "nearest_neighbor", out measureHandleWidth);
// 生成测量矩形(间距方向)
HTuple measureHandleGap;
HOperatorSet.GenMeasureRectangle2(centerRow, centerColumn + 10, angle,
5, 2, ho_Image.Width, ho_Image.Height, "nearest_neighbor", out measureHandleGap);
// 执行边缘测量
MeasureData widthData = PerformEdgeMeasurement(measureHandleWidth, ho_Image);
MeasureData gapData = PerformEdgeMeasurement(measureHandleGap, ho_Image);
measureDatas.Add(widthData);
measureDatas.Add(gapData);
}
private MeasureData PerformEdgeMeasurement(HTuple measureHandle, HObject ho_Image)
{
HTuple hv_Pos, hv_Deriv, hv_Amplitude, hv_Quality;
HOperatorSet.MeasurePos(ho_Image, measureHandle, "all", "edge_para",
out hv_Pos, out hv_Deriv, out hv_Amplitude, out hv_Quality);
// 计算边缘间距(宽度)
double[