ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Halcon焊点检测实战:从Blob分析到工业视觉核心流程详解

2026/8/4 2:38:16 拓冰建站 浏览量
Halcon焊点检测实战:从Blob分析到工业视觉核心流程详解 1. 从“焊点检测”说起为什么Halcon是工业视觉的“瑞士军刀”在电子制造、汽车零部件、新能源电池等精密装配领域焊点质量是决定产品可靠性的命门。一个虚焊、漏焊或焊球过大的缺陷轻则导致功能失效重则引发安全事故。传统的人工目检面对成千上万、微小如针尖的焊点不仅效率低下而且极易因疲劳导致漏判误判。这时机器视觉就成了刚需。而在工业视觉领域德国MVTec公司的Halcon软件因其强大的算法库和灵活的二次开发能力被工程师们誉为“瑞士军刀”。今天我们就来深度拆解一个经典的Halcon焊点检测例子。这个例子看似简单却浓缩了Halcon在工业质检中的核心思想从图像预处理、特征提取到决策判断的完整闭环。很多新手拿到Halcon面对琳琅满目的算子Operator会感到无从下手这个焊点检测案例就是一个绝佳的切入点。它不涉及复杂的3D或深度学习却能让你深刻理解如何将视觉问题转化为可执行的算法步骤。无论你是刚接触Halcon的工程师还是希望优化现有检测方案的从业者通过这个案例的“庖丁解牛”你都能掌握一套可复用的方法论。2. 案例场景与核心目标拆解我们到底要检测什么在深入代码之前我们必须先明确检测任务。一个模糊的目标会导致后续所有算法选型的偏差。假设我们的检测对象是一块PCB板上的球形焊点Solder Ball如下图所示此处为描述实际案例中应有图像检测物规则分布的球形焊点表面光亮在环形光源下呈现明显的高光区域。背景深色PCB板可能有丝印、走线等纹理但与焊点有较大对比度差异。潜在缺陷类型漏焊该有焊点的位置没有焊点。焊球过大/过小焊点尺寸超出公差范围。偏移焊点中心位置偏离预设位置过远。形状异常如拉尖、桥接等本例可能聚焦于前三种。核心检测逻辑这个例子采用的是一种非常经典且高效的策略——基于Blob分析斑点分析和模板匹配的组合拳。其流程可以概括为定位找到每一个焊点的大致位置。分割从背景中精确分离出每一个焊点区域。测量对每个分割出的区域计算关键特征如面积、圆度、位置。判定将测量值与预设标准比较输出OK/NG结果。这个逻辑是绝大多数2D视觉检测项目的骨架。接下来我们就一步步还原Halcon是如何实现这个骨架的。3. 图像预处理化繁为简凸显目标拿到原始图像read_image后直接处理往往效果不佳。噪声、光照不均、背景干扰都会影响后续步骤。预处理的目标就是增强焊点与背景的对比度抑制无关信息。3.1 色彩空间转换与通道选择焊点通常是金属色在彩色图像中可能与某些背景颜色混淆。一个常用技巧是转换到HSV或HSL色彩空间。饱和度S通道通常能很好地区分金属高光/亮色区域与暗淡背景。在Halcon中操作可能如下decompose3 (Image, Red, Green, Blue) // 如果是RGB图 trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, hsv) // 转换到HSV此时Saturation饱和度图像中焊点区域很可能比背景更亮。我们可以直接对Saturation图像进行后续处理也可以使用Intensity亮度通道因为环形光下的焊点中心很亮。实操心得不是所有情况都需要转HSV。如果打光非常均匀背景干净直接用灰度图rgb1_to_gray可能更简单高效。核心原则是用最少的步骤达到最好的分割效果。多做一个变换就多引入一份计算量和调试复杂度。3.2 图像增强与滤波即使选择了合适的通道图像可能仍然存在噪声或对比度不足的问题。增强对比度使用emphasize算子或scale_image可以拉伸灰度范围让亮的更亮暗的更暗。emphasize (Saturation, ImageEmphasize, 7, 7, 1.0) // 增强局部对比度平滑滤波为了消除细小噪声避免后续阈值分割产生大量小杂点可以使用均值滤波mean_image或高斯滤波gauss_filter。高斯滤波在平滑噪声的同时能更好地保留边缘通常是首选。gauss_filter (ImageEmphasize, ImageGauss, 3) // 使用3x3高斯滤波器注意滤波核大小这里是3需要谨慎选择。核太大会模糊焊点边缘导致后续尺寸测量不准核太小去噪效果不佳。这是一个需要根据图像分辨率反复调试的参数。3.3 阈值分割将焊点从背景中“抠”出来这是最关键的一步。我们的目标是得到一个二值化图像Region其中白色代表焊点黑色代表背景。Halcon提供了多种阈值方法全局阈值threshold最简单直接适用于前景背景灰度差异大的情况。你需要手动或通过统计gray_histogram确定一个阈值。threshold (ImageGauss, Regions, 120, 255) // 提取灰度值在120到255之间的区域动态阈值dyn_threshold适用于光照不均的场景。它使用一个平滑后的图像作为参考将原图与参考图对比提取比参考图亮或暗一定偏移值的区域。这对于处理有反光或阴影的焊点图像非常有效。mean_image (ImageGauss, ImageMean, 31, 31) // 生成参考图像 dyn_threshold (ImageGauss, ImageMean, Regions, 15, light) // 提取比参考图亮15个灰度值以上的区域选择策略如果焊点图像整体光照均匀用threshold足矣速度快。如果焊点表面有明暗变化或者背景有渐变dyn_threshold是更鲁棒的选择。这里有一个关键技巧可以先尝试threshold如果分割出的区域不完整内部有孔洞或粘连严重再考虑dyn_threshold。4. 区域处理与特征提取从“像素块”到“可测量对象”上一步得到的Regions可能包含多个连通域其中不仅有焊点还可能包含噪声点、丝印亮斑等。同时焊点区域可能因为阈值不完美而存在毛刺或小孔。我们需要对其进行“精修”。4.1 形态学操作净化与整形形态学是处理二值区域的利器。开运算opening先腐蚀后膨胀。可以消除小噪声点平滑区域边界并断开细小的连接。这是处理焊点区域后最常用的操作之一用于去除焊点边缘因阈值产生的细小凸起和杂点。opening_circle (Regions, RegionOpening, 1.5) // 使用圆形结构元素进行开运算半径为1.5像素闭运算closing先膨胀后腐蚀。可以填充区域内部的小孔洞连接邻近的区域。如果焊点区域内部因为反光出现黑洞可以用闭运算填充。选择特定区域select_shape这是滤除非焊点区域的核心算子。我们可以根据焊点应有的几何特征进行筛选。select_shape (RegionOpening, SelectedRegions, [area, circularity], and, [100, 0.7], [500, 1.0])这行代码的意思是从RegionOpening中选择那些同时满足面积在100到500像素之间且圆度在0.7到1.0之间的区域。圆度越接近1说明形状越接近完美的圆。这个操作能有效过滤掉面积过大/过小的灰尘、以及形状不规则的背景干扰物。4.2 特征测量量化焊点质量经过筛选的SelectedRegions理论上就是我们要检测的焊点了。接下来需要为每个焊点区域计算关键特征用于最终判断。area_center (SelectedRegions, Area, Row, Column) // 计算每个区域的面积和中心坐标 smallest_circle (SelectedRegions, RowCenter, ColumnCenter, Radius) // 计算最小外接圆得到更精确的中心和半径 circularity (SelectedRegions, Circularity) // 计算圆度现在对于每一个焊点我们都有了以下数据Area面积像素。Row,Column或RowCenter,ColumnCenter中心位置像素坐标。Radius等效半径像素。Circularity圆度。这些数据构成了焊点的“特征向量”是判定其是否合格的基础。5. 检测逻辑实现与判定制定“合格”的标准有了特征数据如何判定OK/NG这就需要我们制定明确的、量化的检测标准。5.1 基于规则的判定这是最直观的方法为每个特征设定上下限。尺寸检测焊点半径应在[R_min, R_max]之间。面积同理。// 假设标准半径为15-25像素 dev_display (Image) // 显示原图 for i : 0 to |Radius| - 1 by 1 if (Radius[i] 15 or Radius[i] 25) // 绘制NG标记例如画一个红圈 dev_set_color (red) disp_circle (3600, RowCenter[i], ColumnCenter[i], Radius[i]) // 记录NG信息 NG_Count : NG_Count 1 else dev_set_color (green) disp_circle (3600, RowCenter[i], ColumnCenter[i], Radius[i]) endif endfor位置度检测每个焊点都有一个理论坐标(Row_expected, Col_expected)。我们可以计算实际中心与理论中心的欧氏距离判断是否超出允许的偏移量T_offset。Distance : sqrt((RowCenter[i] - Row_expected[i])**2 (ColumnCenter[i] - Col_expected[i])**2) if (Distance T_offset) // 位置偏移超差判NG endif漏焊检测如果通过模板匹配或坐标列表预知了应该有N个焊点但select_shape后只找到了M个区域且M N那么就可以判定存在漏焊。需要进一步排查是确实漏焊还是因为图像质量问题如污染、严重反光导致算法未检出。5.2 引入模板匹配进行精确定位在上面的位置度检测中我们提到了“理论坐标”。这个坐标从哪里来对于固定产品的在线检测通常有两种方式CAD数据导入从设计图纸中获取焊点的精确坐标。模板学习Template Matching用一张“标准OK”的样品图像教会系统焊点应该在哪里。Halcon的模板匹配功能非常强大。我们可以先在一张标准图像上用前面提到的方法找到所有OK焊点的区域然后利用create_shape_model或create_ncc_model创建形状模板或灰度值模板。在检测时使用find_shape_model进行匹配得到的匹配结果中就包含了每个焊点在当前图像中的理论位置Homography矩阵变换后。这样即使产品在相机视野中有轻微的旋转、平移或缩放我们都能计算出每个焊点当前应该处于的精确位置再进行位置度判断鲁棒性大大增强。踩坑实录模板匹配的成败关键在于创建模板的图像质量以及匹配参数的设置如金字塔层级NumLevels、角度范围AngleStart、AngleExtent。如果产品变形较大或光照变化剧烈形状模板可能失效需要考虑使用灰度值模板(ncc_model)或更先进的基于局部变形匹配(find_local_deformable_model)。一个常见的误区是试图用一个模板匹配整块板子上的所有焊点这通常不如为每个焊点单独做小ROI感兴趣区域检测稳定。6. 方案优化与实战避坑指南按照上述流程一个基本的焊点检测程序就搭建起来了。但在实际工业现场你会遇到各种挑战。下面分享几个关键的优化点和避坑经验。6.1 光照的稳定性是生命线“三分算法七分打光”。焊点检测对光照尤其敏感。挑战焊点表面的高光区域会随着角度变化而移动可能导致阈值分割时区域分裂一个焊点被分成亮部和暗部两个区域。解决方案使用漫射圆顶光能提供非常均匀的照明极大削弱高光点使焊点表面灰度均匀是首选方案。使用环形光低角度如果必须保留一定高光来体现立体感则需固定光源和相机的相对位置并在算法上使用dyn_threshold或更高级的local_threshold来处理光照梯度。实时补偿在程序中加入白平衡或亮度归一化步骤如illuminate算子可以一定程度上补偿光照的缓慢漂移。6.2 处理粘连与重叠焊点当焊点间距过小或焊锡过多时两个焊点可能在二值图像中粘连成一个区域。问题area_center会把它识别为一个对象导致漏检和尺寸误判。解决方案形态学分割如果粘连处比较细可以使用opening运算尝试将其断开。分水岭算法watersheds这是处理粘连的经典算法。Halcon中的watersheds算子可以对灰度图像或距离变换后的图像进行分割能有效分离粘连区域。基于凹点检测的分割计算区域的凸包(convex)凸包与原始区域的差集就是凹点区域。如果存在两个明显凹点可以尝试在此处进行分割。经验之谈对于球形焊点如果粘连不严重分水岭算法通常是效果最好的。但需要先将二值区域转换为灰度图例如用距离变换distance_transform的结果因为分水岭是在灰度图上进行的。6.3 程序健壮性与异常处理工业现场环境复杂程序必须能处理各种意外。图像获取失败read_image后一定要用get_image_size检查图像是否有效或使用try...catch捕获异常。零检出处理如果select_shape后一个区域都没找到程序不能崩溃。应该判断为严重异常可能是镜头盖没打开、严重失焦、产品缺失触发报警并记录日志。特征值容错在计算circularity等特征时如果区域面积太小计算结果可能无意义如除零错误。在计算前应先判断区域是否有效。结果可视化与调试大量使用dev_display和dev_set_color用不同颜色区分OK/NG区域、显示检测框、标注测量值。Halcon的图形窗口调试能力是其巨大优势务必善用。7. 超越经典从Blob分析到更先进的方案经典的Blob分析方案在光照稳定、背景简单、对比度高的场景下非常高效。但当面对更复杂的挑战时我们需要知道还有哪些“武器”可用。7.1 针对低对比度与复杂背景如果焊点与背景灰度非常接近阈值分割将失效。此时可以考虑边缘检测焊点作为一个凸起或凹陷其边缘梯度通常很明显。使用edges_sub_pix提取亚像素边缘然后通过select_shape_xld筛选封闭的、圆形的轮廓。这种方法对整体灰度变化不敏感。特征检测使用points_foerstner或interest_points检测角点或特征点焊点中心有时会表现为一个特征点。但这方法稳定性相对较差。7.2 引入机器学习与深度学习当缺陷类型多样、规则难以用几何特征描述时如焊点表面的气孔、裂纹、颜色异常基于深度学习的分类或分割方法是最终解决方案。Halcon的深度学习工具Halcon集成了丰富的深度学习功能。对于焊点检测可以分类将每个焊点裁剪成小图用训练好的模型分类为OK/NG。目标检测使用detect_object直接定位并识别图像中所有焊点及其状态。语义分割使用segment对整张图像进行像素级分割标注出OK焊点区域、NG焊点区域和背景。数据是关键深度学习的成功极度依赖大量、高质量的标注数据。你需要收集包含各种缺陷的样本图像进行标注和训练。7.3 性能优化让检测更快在线检测往往对速度有苛刻要求如每分钟检测上百块板子。减少处理区域ROI不要在全图进行处理。如果焊点位置固定可以预先定义好多个小的ROI只在这些ROI内执行检测算法能极大减少计算量。算子选择threshold比dyn_threshold快area_center比smallest_circle快。在满足精度要求的前提下选择更快的算子。利用Halcon的自动并行化Halcon的HDevelop环境和运行时库会自动利用多核CPU进行并行计算。确保你的代码中没有不必要的顺序依赖。硬件加速对于深度学习模型使用GPU进行推理能获得数量级的速度提升。这个Halcon焊点检测例子就像一本工业视觉的“入门教科书”它展示的Blob分析流程是解决大量简单视觉问题的通用范式。从理解问题、预处理图像、分割区域、提取特征到制定规则每一步都蕴含着对物理世界到数字图像转换的深刻理解。在实际项目中我个人的体会是花在前期打光、镜头选型和机械定位上的时间往往比后期调试算法更能决定项目的成败。算法是解决问题的工具而清晰、稳定、高对比度的成像是问题能够被解决的前提。当你熟练掌握了这个经典案例后再面对更复杂的检测任务时你就能清晰地知道是该优化传统图像处理流程还是该引入更强大的深度学习工具了。