【C# + HALCON 机器视觉】测量矩形生成算子(gen_measure_rectangle2)在半导体引线键合检测中的深度应用

摘要:针对半导体引线键合工艺中的金线尺寸检测需求,本文提出基于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+L1cos(Φ)sL2sin(Φ)ty=Column+L1sin(Φ)s+L2cos(Φ)t
其中 $ s \in [-1, 1], t \in [-w/2, w/2] , , w $ 为测量线宽度。

2.2 测量流程

图像采集
ROI定位
生成测量矩形
边缘提取
尺寸计算
CPK分析
超差?
PLC调整压力
数据存储

三、硬件与软件架构

3.1 硬件系统搭建

工业相机
远心镜头
LED同轴光源
键合机平台
激光位移传感器
图像采集卡
工控机
PLC控制器
  • 相机: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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI_DL_CODE

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值