血管支架直径只有几毫米上面的金属网丝细得像头发丝公差却常常要求在几十微米以内。这种零件放到产线上做全检靠人眼盯显微镜不现实靠传统接触式测量又容易划伤表面。所以这几年很多医疗器械厂家在找机器视觉方案Halcon 正是这类场景里相当顺手的一套工具。我前后做过几个显微测量类的视觉项目血管支架检测是其中比较典型的一个——结构复杂、反光强烈、公差严格还要同时兼顾缺陷检测和尺寸测量。这篇文章就把完整的技术链路拆开讲一遍包括方案设计、硬件选型、Halcon 算子链、标定方法以及现场调试里容易踩的坑。1. 项目全局先看懂血管支架检测难在哪1.1 血管支架为什么是视觉检测里难啃的骨头血管支架本身的物理特性决定了它比普通五金件难拍得多。首先是尺寸小支架外径通常只有 2 到 4 毫米长度在 8 到 40 毫米不等壁厚或丝径多在 0.05 到 0.2 毫米之间。这意味着视野很小相机分辨率必须足够高不然单根金属丝在图像里只占一两个像素后续测量和缺陷判断根本做不下去。其次是不锈钢或钴铬合金表面的镜面反射。血管支架大多经过电解抛光表面光亮在常规环形光源下会形成大面积高光金属丝边缘的灰度梯度非常陡。拍出来往往是一边白得溢出、一边黑得看不清给阈值分割带来很多麻烦。第三个难点是姿态不统一支架是圆筒状网架结构放在载具上容易滚动拍照时各根丝不在同一个焦平面上景深稍有不足边缘就会虚。第四个难点在于公差尺度。支架展开网孔的尺寸、支撑筋的宽度、波峰的间距、末端倒角的形状都是临床性能的重要参数。有些关键尺寸公差只有正负几十微米放在 2 毫米直径的零件上比例上相当于普通机械加工里的微米级精度视觉系统稍有标定偏差测出来的数就不可信。1.2 订单背后那串检测指标到底有哪些工程上做任何项目第一步都是把需求翻译成可执行的检测项。血管支架检测通常分成几何尺寸测量和表面缺陷检测两大类。几何测量包括外径、长度、网孔尺寸、支撑筋宽度、波形节距、壁厚、末端圆角等缺陷检测则包括断丝、裂纹、毛刺、异物附着、锈点、压扁变形、涂层脱落等。有的客户还会要求测量支架在压握状态下的直径变化或者预装到球囊上的折叠形态这属于更高阶的定制需求。不同厂家对这些项目的标准和定义不完全一致。有的把长度定义为两端最远点距离有的定义为骨架中心线的弧长网孔尺寸有的测内切圆有的测对角线距离。如果需求澄清阶段没有逐项确认清楚后面算法写完、系统平移交付之后再来改成本会成倍增加。所以项目启动时我会先做一张检测项清单每个尺寸明确标出定义方式、公差带、量具基准和抽样频率这部分花的时间往往比写算法还多但非常值得。2. 整体方案设计和选型逻辑2.1 相机、镜头、光源怎么配才不会白费算法工夫视觉检测里有个基本规律图像质量决定了算法难度的上限。血管支架这种高反光微细零件光源和镜头选错了后面写再多滤波和增强代码都只是修补不如一开始就把成像做好。镜头方面优先考虑远心镜头。普通工业镜头在工作距离变化时放大倍率会变血管支架本身有高度差姿态也不是完全水平普通镜头拍出来的尺寸在图像里会忽大忽小像素当量不稳定。远心镜头能保证在一定深度范围内图像放大倍率几乎不变这对微米级测量非常重要。工作距离和视野要根据目标尺寸反推例如视野做到 20 毫米左右配 500 万或 1000 万像素相机单个像素对应的物理尺寸可以控制在 3 到 5 微米测量分辨率基本够用。光源是成像环节里最需要花心思的部分。血管支架反光强打光方式直接影响边缘提取效果。我常用的组合是背光和同轴光两路照明背光用来拍支架的整体轮廓和尺寸金属丝呈暗色、背景亮边缘对比度好阈值分割简单同轴光用来拍表面缺陷光线垂直照射后反射回来进入镜头平整区域亮度均匀凹凸和划痕会产生明显的灰度变化。实际项目中也可以考虑多角度低角度环形光但要控制亮度和角度防止大面积镜面反射把纹理细节吞掉。相机一般用面阵 CMOS 就够关键是传感器靶面尺寸要和镜头匹配避免暗角。帧率不是主要矛盾因为支架检测通常是静态拍照真正限制节拍的是上下料时间而不是相机的采集速度。2.2 Halcon 在这个项目里的位置为什么合适选 Halcon 而不是费尽心思自己写底层算法主要原因是时间成本和可靠性。血管支架检测涉及到亚像素边缘提取、轮廓拟合、区域形态学、轮廓比较等大量图像处理算法Halcon 在这些方面已经封装得很成熟比如 edges_sub_pix 提取亚像素轮廓、fit_circle_contour_xld 做圆弧拟合、gen_measure_rectangle2 做矩形测量调用起来非常稳定。这些算子经过了大量工业项目的验证出问题的概率远低于自己从零实现的版本。Halcon 的另一个优势是快速原型验证。同一套算法逻辑在 C 里写一遍调试可能要两三天在 Halcon 的 HDevelop 环境里两个小时就能跑通初步流程确认可行后再导出为 C# 或 C 工程做集成。HDevelop 里有变量监视、图像窗口交互查看中间结果、断点调试对算法调试来说非常高效。当然 Halcon 也存在一些限制比如授权费用较高、运行环境依赖 License但这在医疗器械类项目中通常可以接受毕竟客户更看重系统的稳定性和交付周期而不是省软件成本。2.3 先定流程再写代码避免返工血管支架检测的整体流程可以拆成五个环节标定、定位、图像预处理、测量或缺陷判断、结果输出。标定负责建立像素和物理尺寸的映射关系是所有尺寸测量的前提定位用于将支架调整到统一的坐标系下抵消载具定位偏差和支架摆放角度变化预处理负责降噪、增强对比度、去除背景干扰测量和缺陷判断是核心算法利用经过定位的标准参考位置来提取特征值结果输出阶段根据规格判定 OK 或 NG并保存图像和数据。这个顺序不要随意打乱。有些工程师一上来就直接做阈值分割和测量忽略了标定和定位结果换一只支架或者重新上料后结果变得不稳定。定位的作用不仅仅是让图像看起来整齐更重要的是让后续所有 ROI 选框自动对齐这样在处理大量图像时算法参数保持一致不需要根据位置动态变化稳定性显著提升。如果支架在视野内的位置和角度可以重复到像素级别后续缺陷检测和尺寸测量会省力得多。3. Halcon 图像处理管线逐个拆3.1 预处理不是所有图都要猛滤波拿到图像后有人习惯先来一遍中值滤波或者高斯滤波。对于血管支架这种本身具有精细网格结构的零件滤波半径过大会抹掉细小丝径的边缘细节反而让测量失真。我的习惯是先观察原始图像的噪声类型如果是传感器噪声明显用轻微高斯滤波Sigma 设置在 0.5 到 1.0 之间如果是不锈钢纹理造成的高频干扰用 median_image 配合较小的掩膜尺寸比如 3x3 或 5x5。到底是滤波还是不滤波以及滤波强度多大应当通过处理前后边缘轮廓的亚像素位置稳定性来评估不要只看视觉上是否变亮变干净。Halcon 里常用的预处理流程为先读取图像转换为灰度图然后根据实际需要做均值或 Gauss 滤波再做一次对比度拉伸例如用 scale_image_max 或 equ_histo_image 增强暗部细节。但要注意对比度拉伸对灰度值做了非线性变化会在一定程度上改变边缘位置因此如果后续要做高精度测量同一条测量链路上的预处理参数必须保持一致不能在调试中频繁更换。背景不均匀是血管支架图像另一个典型问题载具本身可能带有划痕、污渍、反光而这些区域恰好和支架的边缘接近。这时可以考虑用动态阈值分割即先估计背景灰度再在局部范围内比较前景和背景的差异而不是对整幅图像使用固定灰度阈值。Halcon 中的 dyn_threshold 配合 mean_image 实现动态阈值分割在这个场景里效果比较明显。更直接的方式是将载具设计成哑光黑色并做遮光处理尽量让背景灰度均匀这比在算法层面硬分割省事得多。3.2 分割和区域筛选找出支架的主体预处理完成后先要把支架主体区域从背景中提取出来。使用背光照明时支架在图像中呈现为暗色区域背景是亮色直接调用 threshold 算子选择低灰度区间即可。例如灰度范围选在 0 到 80 之间这只是初始值实际要根据图像灰度统计来调整。threshold 得到的结果往往是包含几根断丝、阴影、灰尘点等的大量小区域需要进一步用 connection 将连通的像素分成多个独立区域再用 select_shape 筛选。select_shape 是基于区域形状特征做筛选的标准算子可以根据面积、宽度、高度、矩形度、延伸度等特征过滤掉不想要的干扰区域。例如支架主体区域通常具有较大的面积和较长的轮廓而灰尘点、孤立噪声的面积很小可以直接过滤掉。支架网格的形状有可能被误判为多个分离的区域这时候还需要用 union1 或 union2 将属于同一个支架的多个区域合并回完整区域尤其是支架的两端由于结构不连续而被分割成两块的情况。必要时还可以用 closing_circle 做闭运算连接断裂处但这个操作要非常谨慎闭运算会改变区域边缘轮廓对后续基于边缘的尺寸测量有影响仅适合做区域级判断时使用。对于同轴光成像的缺陷检测流程分割逻辑则完全不同。缺陷区域往往是高光区域中局部亮度异常的地方常用 local_threshold 或动态阈值结合灰度形态学提取暗斑、亮斑然后按缺陷典型尺寸特征筛选。比如毛刺的形态特征表现为细长突出断丝表现为轮廓缺口涂层脱落表现为长条状灰度异常这些都需要有针对性的特征参数才能准确筛选。3.3 亚像素轮廓提取把边缘精度推到微米级像素级边缘在血管支架拍摄条件下往往不够用。一个像素可能对应 3 到 5 微米的物理尺寸如果直接用像素边缘测量结果跳跃幅度很大远远达不到几十微米公差的需求。因此必须使用亚像素边缘提取算子让边缘定位精度达到 0.1 像素左右。Halcon 中 edges_sub_pix 是应用最多的亚像素边缘提取算子。它有多种过滤器类型常用的有 canny 和 lumen。Canny 边缘检测强调边缘连续性和单像素响应适合提取清晰的支架外形lumen 对边缘的灰度过渡模型拟合更好在镀层边缘、弱对比度场景下能提供更稳定的亚像素精度。参数中高阈值和低阈值需要根据图像灰度梯度的绝对值来设置设置过高会漏掉低对比度边缘过低则会把噪声也算成边缘。一般做法是先查看梯度直方图取一个能保持边缘完整又尽量少出现碎边缘的阈值组合。提取到亚像素轮廓后轮廓数据是线状的 XLD 对象里面会包含大量长度较短的碎轮廓不方便直接做测量。需要先用 segment_contours_xld 将边缘分解成直线段和圆弧段再根据长度和曲率筛选真正需要的轮廓。如果目标是一个完整的支架外轮廓还可以用 select_contours_xld 按长度过滤掉干扰碎片必要时用 union_adjacent_contours_xld 把割裂的同一边缘重新连接起来最终生成一条完整的、闭合的支架轮廓供尺寸测量和缺陷分析使用。3.4 缺陷特征判断逻辑不是所有灰度变化都是缺陷缺陷检测的核心不只是把“异常”找出来还要避免把正常纹理误判为缺陷。血管支架表面的金属编织纹路、压握痕迹、激光切割痕迹在图像上都有灰度起伏如果缺陷判定阈值设得过高正常产品会被大批量误杀设得过低真正的缺陷会漏过去。项目前期需要收集足够的良品图像和不良品样本统计出每个特征的正常波动范围再设定合理阈值。缺陷特征通常分成三类。一是几何特征例如断丝表现为轮廓宽度突变、轮廓局部缺口毛刺表现为锯齿状突起异常区域面积小、圆形度高但延伸度与相邻骨架不同压扁变形表现为整体长宽比、外接矩形尺寸异常。二是灰度特征例如锈斑往往是一簇暗斑灰度均值明显低于周围正常丝面涂层剥落则是灰度反差很大的区域同时有特定的纹理边缘。三是纹理特征Halcon 中可以利用滤波响应、灰度共生矩阵等描述符做更精细的区分但这种做法对算力消耗较高通常只在普通形态学筛选解决不了问题的时候才使用。实际工程中我更推荐建立分层判定策略第一层用几何形状粗筛排除粉尘、水滴和图像噪声第二层用灰度统计精筛识别疑似缺陷第三层对可疑区域做局部轮廓检查判定是否属于真正的支架本体缺陷。这种分层结构的好处是每一层只负责一部分判断参数独立可调现场调优时不会牵一发而动全身。4. 血管支架尺寸测量的标定与实现4.1 像素当量标定测准的根本在标定尺寸测量之前必须有可靠的像素当量标定。这里所谓的像素当量就是每一个像素对应的物理尺寸比如 1 像素等于 0.0035 毫米。标定方式主要有两类使用标准标定板或使用已知尺寸的标准工件。标定板标定的优点是精度高、通用性好通常是棋盘格或圆点阵列板。Halcon 中可以使用 find_calib_object 自动提取标定板特征并计算标定结果最终建立相机内参和畸变模型。对于远心镜头标定模型与普通镜头不同Halcon 里需要设置 camera_type 为 area_scan_telecentric_division 或类似选项如果选错了类型计算出的世界坐标依然在中心区域看着正确但在视野边缘的测量结果会出现系统性偏差。标准工件标定的思路更直接找一个外径、长度经过高精度测量仪器确认过的血管支架或标准圆柱放在视野中拍图用算法测量出像素尺寸再用已知物理尺寸反算像素当量。这种方式的优点是标定过程非常贴近真实工件状态光源反射情况和支架一致缺点是只对同一类支架有效换型号就要重新标定。实际项目中我会两种方式配合使用先用标定板建立镜头畸变模型再用标准工件做最终的像素当量修正兼顾全局精度和局部一致性。4.2 Halcon 测量算子组合从外径到网孔尺寸尺寸测量的实现我一般不用只靠 Blob 区域的那种“测区域宽高”的粗糙方法而是基于亚像素边缘轮廓做拟合。举个外径测量的典型例子血管支架在背光下提取出整体轮廓后左右两侧各是一段近似圆弧的 XLD 轮廓可以用 fit_circle_contour_xld 分别拟合左右轮廓得到两个圆心和半径再根据圆心距离和半径计算出支架在该位置的截面宽度。如果支架截面是规则圆形也可以直接对单侧轮廓拟合圆弧通过半径乘以 2 得到直径但这种方式要求支架轴线与相机光轴严格垂直稍有角度偏差测量误差就会被放大。对于支撑筋宽度这类小尺寸测量常规做法是测量线与边缘垂直相交的两点间距。Halcon 的 measure_pos 算子可以定义一条测量线段沿线段采样灰度值再通过边缘灰度变化定位边界点。将测量线旋转到与骨架方向垂直的位置获取边缘位置后计算两点距离即可得到丝宽。这里有一个关键细节单次测量的误差来源非常多比如光照变化导致的灰度斜率变化、支架摆放角度微小不同、镜头畸变残余等因此建议在同一条测量位置重复采集多帧图像对多个测量点做平均用统计值作为最终的实测数据而不是取单帧测量值。网孔尺寸的测量比较特殊因为网孔形状不是规整的圆或矩形而是由波形丝围成的多边形。我通常提取网孔周围骨架的中线或亚像素轮廓利用相邻交点计算孔的对角长度、内切圆半径等参数。这个过程比较依赖高精度的边缘提取和交点计算Halcon 中 get_contour_xld 获取轮廓点序列后可以自行计算交点也可以使用 fit_line_contour_xld 拟合直线后计算其交点两者得到的测量值含义不同需要跟客户确认最终以哪个几何定义为验收标准。4.3 测量重复性为什么必须做 GRR 验证算法跑通之后不能只看一个样品测一次准不准关键要看同一工件反复装夹拍照时测量值的重复性和再现性。这是医疗器械视觉检测项目的验收重点之一。所谓重复性指同一台设备、同一个操作员、同一工件在多次测量中结果的一致程度再现性则指不同操作员或不同时间段内结果的一致性。实际做法是选取 3 个覆盖公差范围的标准支架每个支架在不同时间分别测量 10 次记录测量结果计算每组数据的极差和标准差。一个参考标准是每个关键尺寸的波动范围应当小于公差带的三分之一理想情况下小于十分之一更稳。如果重复性波动过大就要回溯到成像环节看是光源闪烁、震动、夹具不稳还是边缘提取参数选择不当。很多项目到了验收阶段才发现重复性不合格往往不是算法的问题而是硬件平台没有做防震处理或者支架在载具里的定位方式不够可靠。5. 缺陷判定逻辑与实际落地的三个细节5.1 判定逻辑设计用特征组合替代单点阈值血管支架的缺陷形态丰富单靠一个特征阈值几乎不可能覆盖所有情况。比较合适的做法是针对每一类缺陷设计一组特征向量再以逻辑组合方式判断。例如锈斑类缺陷最典型的特征是区域灰度均值显著低于正常丝面、灰度方差较大、边界不规则。真正的锈斑通常同时满足这几项条件而单纯阴影、水渍等干扰往往只满足其中一两项利用这种组合可以显著降低误判率。在 Halcon 中实现并不复杂对每个可疑区域运行 area_center、gray_features、select_shape 等算子提取面积、灰度均值、灰度方差、矩形度、凸性等特征然后在 HDevelop 里用一个公式把多个特征加权组合成评分超过设定分数才判定为缺陷。这比直接用一个灰度阈值判断要稳健得多。每类缺陷都要单独建立一套特征模型不能指望一个万能参数解决所有缺陷问题。5.2 落地时的三个隐藏坑第一个坑是曝光时间不稳定。现场的环境光、光源控制器老化、相机增益自动模式都会导致图像明暗发生微小变化虽然人眼看不出来但亚像素边缘位置会发生漂移直接影响测量结果。解决方式是关闭相机的自动曝光和自动增益打光使用恒流控制或反馈稳定型光源控制器并在系统启动时做白平衡校正和亮度基准监测。第二个坑是支架在载具中的姿态不一致。血管支架是柔性件即便初始摆放方向一致载具运动过程中的震动、气压变化也会让它滚动或翘起。当支架倾斜时投影宽度会比真实尺寸大。解决方案是设计 V 型槽或磁性压持载具并增加一个姿态检测环节在定位算法中同时拟合支架两端端面的位置如果发现倾斜角度超过阈值就触发重新定位避免把倾斜引起的尺寸变化误判为不合格品。第三个坑是高频噪声和细小缺陷的取舍。血管支架丝径很细缺陷往往也很小但图像中同样存在金属纹理带来的高频噪声。很多算法调试过程中为了让缺陷更清晰而加大锐化结果噪声也被放大导致误判率飙升。我的经验是先保持图像原始灰度特征优先用几何特征识别缺陷当几何特征无法区分时再考虑引入频域特征不要一上来就做很强的增强处理。6. 现场实施中的常见问题与排查心得6.1 现场常见问题速查表血管支架视觉检测项目从开发到交付最容易碰到下面这些情况我整理了一张排查对照表基本覆盖了大部分现场问题的排查方向。问题现象常见原因调整方向同一工件测量结果波动大支架在位姿不稳、震动、光源闪烁先检查机械定位和固定方式再排查光源驱动稳定性边缘轮廓时断时续阈值设置过高、光照不均、景深不足降低分割阈值调整光源角度检查镜头景深范围实际尺寸偏大或偏小但有规律像素当量标定不对或镜头类型选错重新做标定确认远心镜头模型使用标准件复核微缺陷检测与良品误判矛盾特征阈值单一或滤波过度改用多特征组合判定减少过度平滑处理不同批次产品检测结果不一致前工序电抛光效果波动与工艺沟通确认批次差异增加灰度归一化环节系统长时间运行后结果漂移光源衰减、相机温度变化定期做亮度基准检测增加光源寿命预警6.2 调试阶段最值得花时间的环节很多项目组喜欢把时间花在调阈值上但实际经验告诉我最值得花时间的环节是样品样本收集和需求定义。血管支架的不良品类型多样如果前期没有收集到足够多的真实缺陷样品算法训练和验证都没有依据。我会建议客户在项目启动前先提供三批样品一批良品用来确定正常的特征波动范围一批典型不良品覆盖每类缺陷的最明显形态一批边界不良品专门用来卡验收标准和误判率。有了这三批样品算法的参数标定和验收测试才能做扎实。实际上输出来自于高质量的输入视觉检测项目尤其如此。光源调试的阶段我会带着相机在现场反复试不同角度、不同高度的照明方案把支架各个朝向的图像都拍下来观察直到找到一个在大多数姿态下都能稳定呈现出清晰轮廓的成像方案然后才进入算法开发。过早进入算法阶段而忽略成像优化往往会把问题复杂化提高算法开发难度拉长整个项目周期。我在实际项目中的体会是血管支架视觉检测成功的关键第一步是光学成像第二步是标定稳定性第三步才是算法逻辑。软件算法在 Halcon 中确实强大且高效但前提是在前面的环节把图像和标定做扎实。完成一个稳定的检测系统往往不是靠某一个高级算子一锤定音而是把成像、硬件定位、特征定义、统计验证这些基础环节一步步做扎实。如果手头也有类似的高精度细丝类零件检测需求可以先从成像实验开始用不同光源组合拍摄一版再对比 Halcon 的边缘提取效果你会很快找到适合项目的技术路径。