ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VisionPro基础工具调参:焊锡检测与轴承缺珠误检率控制

VisionPro基础工具调参:焊锡检测与轴承缺珠误检率控制 简介康耐视VisionPro基础工具教程以PDF单文件形式呈现共1个pdf文档压缩包约4.8MB属机器视觉方向的课程类资料面向刚接触该软件的工程师、自动化设备调试人员以及需要快速上手VisionPro的学生。内容围绕实际项目中最常用的模块展开从GigE相机硬件连接、网卡巨帧与IP配置、防火墙设置等步骤讲起梳理相机连接异常的排查思路随后系统介绍QuickBuild的页面结构与作业逻辑逐一说明容器类工具以及取像、斑点分析、卡尺测量等常用工具的参数含义与算法原理此外还包含脚本编写、VPP与C#联合编程的方法附录汇总相机连接常见问题。教程以图文并茂的方式把工具面板、区域设置、结果输出等细节讲透适合照着目录逐项练习也可作为调试时的速查手册。目前已有403人学习下载。1. 一条焊锡检测线的误检率为什么最后要靠VisionPro基础工具收口焊锡检测和轴承缺珠检测这两类工位现场最常听到的抱怨不是算法不够先进而是同一个位置昨天判合格今天判不良。定位偏了两个像素、卡尺卡在毛刺上、斑点阈值被光照漂移顶过去任何一个环节松一点误检率就上来了。康耐视VisionPro的基础工具恰好处理的正是这些环节CogPMAlignTool把工件的位置和角度找回来CogCaliperTool沿指定方向找边缘CogBlobTool统计连通区域的面积与数量CogCNLSearchTool用归一化相关做外观比对。单个工具跑通不难难的是把它们串成一个可复用、换料换光后仍然能给出同一结论的作业。这篇面向已经装好VisionPro、能打开QuickBuild的工程师从工具职责边界讲到参数落值、C#调用方式和ToolBlock脚本的进阶写法。2. VisionPro基础工具的职责边界与作业组织方式2.1 一条Job的四段结构采图、定位、测量、判定VisionPro里一个能上产线的作业基本都跑不出这四段。采图段通常是CogAcqFifoTool接相机或者调试阶段用CogImageFileTool读一批离线图定位段负责把工件的位姿求出来让后面的测量工具不必依赖绝对坐标测量段做真实的边缘、圆、斑点计算判定段把测量值转成Pass/Fail并输出给PLC或上位机。这里的关键是换域。定位工具输出的是一个ICogTransform2D后续的卡尺、找圆、斑点工具如果把输入图像的坐标空间接到这个变换上工件在视野里平移几毫米、转十几度测量量值仍然一致。很多人把每个工具都单独接原图工件一动整条Job全废返工量非常大。常见做法是给每个测量工具单独设一个CogCopyRegionTool或者直接在工具的InputImage上挂SpaceTree让VisionPro自己做坐标换算。调试阶段还有一点容易被忽略输出单位。像素单位下的距离值在换镜头、换工作距离以后毫无可比性所以标定要早做。棋盘格标定用CogCalibCheckerboardTool走九点用CogCalibNPointToNPointTool标定完把CogCalibTool的输出接到测量工具的输出空间上结果就直接是毫米。2.2 CogPMAlignTool、CogCNLSearchTool、CogBlobTool、CogCaliperTool各管什么这四个工具是VisionPro里被调用频率最高的基础件但它们的适用场景差别很大。CogPMAlignTool基于几何特征做模板匹配训练时用的是边缘几何信息所以对光照变化、部分遮挡、对比度下降有一定容忍度输出的是亚像素级的位姿。它适合有明确轮廓的工件定位比如轴承端面、连接器外壳、PCB板边。CogCNLSearchTool走的是归一化相关这条路线训练的是灰度模板而不是几何模板。它对整体亮度线性变化不敏感对纹理和灰度分布敏感速度通常比PatMax快但角度和缩放的搜索范围不能给太大否则耗时会陡增。外观比对类任务比如焊点外观是否存在、丝印是否印全用它比较顺手。CogBlobTool是二值化之后的连通域统计输出每个斑点的面积、质心、周长、外接矩形。它对阈值极度敏感所以现场用得最多的反而是它的相对阈值模式和自动阈值模式而不是手填一个固定灰度值。CogCaliperTool是投影边缘检测把一个矩形投影带内的灰度沿方向做投影再在投影曲线上找满足对比度阈值的边。它的优势是给定了搜索方向和投影长度以后抗噪能力比直接找单像素极值强很多。测宽度、测间距、测圆上的点到基准的距离基本都靠它。2.3 按检测任务挑工具的对照表任务类型首选工具关键输出常见误用工件整体定位CogPMAlignTool位姿、Score训练区域把背景也框进去灰度外观比对CogCNLSearchTool匹配位置、Score角度范围给到 ±180 度圆孔/圆轴找心CogFindCircleTool圆心、半径投影长度小于噪点尺寸宽度/间距测量CogCaliperTool边缘坐标极性设成 Either 不做筛选面积/数量统计CogBlobTool斑点列表用固定阈值跑全天标定换算CogCalibCheckerboardTool像素到毫米映射标定板拍虚这张表只是起点。实际选型还要看节拍CogPMAlignTool的PatMax算法精度高但耗时也更长如果节拍紧、工件轮廓又足够清晰可以先试PatQuick精度不够再换。而CogCNLSearchTool在缩放搜索范围上要克制一般现场给到 ±5% 到 ±10% 就够了给到 ±30% 以上单次运行时间会明显拉长。3. 用CogPMAlignTool加CogCaliperTool搭一个能跑通的定位测量Job3.1 CogPMAlignTool训练模板训练区域、原点、角度范围怎么给训练这一步决定了后面所有环节的上限。打开CogPMAlignTool先在图上框训练区域。经验是训练区域要包含工件上最具有几何辨识度的部分尽量避开可能有油污、字符、反光的位置。同一批工件里如果某个特征在部分样品上会缺失就不要把它框进去。原点的设置同样关键。默认原点在训练区域的中心但实际使用中建议手动拖到一个物理意义明确的点上比如轴心或者角点。这样做的好处是后面做位置补偿的时候偏移量的物理含义清晰。角度范围通过Pattern的Angle属性给一般设成 ±5 到 ±15 度配合产线上料机构的实际重复精度不要凭感觉给 ±180。训练算法的选择上PatMax适合有明确边缘、要求亚像素精度的场景PatQuick速度快适合轮廓简单或节拍紧的工位PatMaxSynthetic在没有实物样本、只有CAD图的时候有用。训练完成后Score 值在 0.8 以上通常说明模板本身质量可以如果同一批图训练完 Score 抖动很大问题多半在光照不一致先调光源而不是调算法。RunParams里几个必调的AcceptThreshold 决定接受下限现场一般从 0.6 起调误判再往上加NumToFind 是要找的目标数量单工件就是 1Clutter 是杂斑抑制工件上有小面积干扰纹理时把它调到能压住噪声又不吃掉主体特征的位置。3.2 CogCaliperTool卡尺参数极性、对比度阈值、投影长度、搜索长度卡尺的四个参数决定了它能不能在真实图像上找到边。Edge0Polarity 是极性决定它找的是从暗到亮还是从亮到暗的边。这项千万不要设成 Either因为一旦设成 Either投影曲线上的噪声尖峰也可能被当成边选进去。如果料件方向可能翻转更稳妥的做法是跑两次卡尺、对两个结果做一致性判断而不是放宽极性。ContrastThreshold 是对比度阈值。设太高会找不到边设太低会找到噪声边。常见做法是先设一个中等值看结果里的对比度值实际是多少再把这个阈值设在实际对比度的六成左右。ProjectionLength 是投影长度也就是沿边缘方向参与平均的像素数。这个值要大于噪声的尺度但不要超过边缘本身的直线度范围。圆弧面上做卡尺时投影长度给大了会把弧当成直线处理量出来的边缘位置会偏。SearchLength 是搜索长度即沿边缘法线方向找边的范围。给得太小工件稍微偏一点就找不到给得太大同一条边上可能拉进其他结构。一般按工件的位置重复精度加余量来给重复精度 ±0.1 mm搜索长度给到 0.5 mm 到 1 mm 通常够用。FilterHalfWidth 是滤波半宽作用是平滑投影曲线。噪声大时适当加但加太多会让边缘位置发生偏移因为它等于是对曲线做了加权平均。3.3 C#加载vpp并读取结果的最小代码离线调好工具之后最终要落到C#里跑。下面这段是最小骨架。using System; using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using Cognex.VisionPro.PMAlign; using Cognex.VisionPro.Caliper; // 1. 加载QuickBuild里调好的作业文件 CogToolBlock job (CogToolBlock)CogSerializer.LoadObjectFromFile(D:\Jobs\Bearing.vpp); // 2. 把采到的图像塞进作业的输入终端终端名以QuickBuild里定义的为准 job.Inputs[InputImage].Value acquiredImage; // ICogImage // 3. 运行 job.Run(); // 4. 判断整体结果RunStatus 里带着每个内部工具的执行状态 if (job.RunStatus.Result ! CogToolResultConstants.Accept) { // 定位失败或某一步测量失败直接返回别继续读结果 return; } // 5. 读定位结果Score、角度、位姿 CogPMAlignTool pm (CogPMAlignTool)job.Tools[CogPMAlignTool1]; double score pm.Results[0].Score; double angleDeg pm.Results[0].GetPose().Rotation * 180.0 / Math.PI; ICogTransform2D pose pm.Results[0].GetPose(); // 6. 读卡尺结果边缘点坐标已经是毫米制前提是输出空间挂了标定 CogCaliperTool cal (CogCaliperTool)job.Tools[CogCaliperTool1]; double edge0X cal.Results[0].Edge0PositionX; double edge0Y cal.Results[0].Edge0PositionY; // 7. 用位姿把像素点映射到工件坐标系 double mapX 0, mapY 0; pose.MapPoint(edge0X, edge0Y, ref mapX, ref mapY);第 1 步的CogSerializer.LoadObjectFromFile是整个流程的入口它把 vpp 里所有工具的配置、训练模板、脚本一起反序列化所以现场改完参数一定要重新保存 vpp否则程序读到的还是旧配置。第 3 步的Run()是同步阻塞调用节拍紧的时候可以放在独立线程或用异步方式不要放在UI线程里硬等。第 4 步用RunStatus.Result做整体判断比逐个工具去查RunStatus更省事但要注意某个内部工具失败不一定让整个作业返回 Reject取决于 ToolBlock 里对工具失败的处理设置。关键工位建议在脚本里显式汇总这部分在最后一章展开。第 5 步的GetPose()返回的是从模板坐标系到当前图像坐标系的变换旋转量是弧度。第 7 步的MapPoint是常用的坐标换算方法把像素坐标映射到工件坐标之后同一批料在不同位置测出来的值才能横向比较。4. 焊锡检测和轴承缺珠检测里CogBlobTool与CogCNLSearchTool的参数怎么定4.1 轴承缺珠检测CogFindCircleTool定圆再上CogBlobTool统计缺珠检测的思路是先在端面上把滚道圆找出来然后在圆内做斑点统计。CogFindCircleTool的 RunParams 里ExpectedCircularArc 给的是预期圆心、半径和参与搜索的圆弧角度范围。如果端面上有多个同心的圆环角度范围一定要收窄只让卡尺分布在真正要用的那一段圆弧上否则找出来的圆会跳到另一个圆环上。接下来是极性。滚道上的珠子通常比背景亮或比背景暗取决于打光方式。用同轴光时珠子一般偏亮此时 Edge0Polarity 设成 DarkToLight用低角度环形光时影子会出来可能反过来。这一步要拿一张真实的NG图去试不要凭图纸猜。ContrastThreshold 建议从 15 到 25 起调ProjectionLength 至少给到珠子直径的两到三倍否则单个珠子上的噪声会让圆拟合跳变。NumToFind 一般设 1但如果视野里有多个轴承设成实际数量并配合搜索区域限制。圆找到之后把圆作为输入传给 CogBlobTool在圆内做阈值分割。这里的参数主要看三组SegmentationParams.Polarity 决定找亮斑还是暗斑SegmentParams.PixelThresholdRelative 是相对阈值它基于图像的最大最小灰度动态计算抗光照变化的能力比绝对阈值强RegionMode 和 ConnectivityMinPixels 控制连通性珠子间有轻微粘连时把连通性调小一点可以避免把两颗珠子合成一个斑点。最后用 AreaMin 和 AreaMax 卡住珠子应有的面积区间。缺珠的判定逻辑就是圆内斑点数量小于期望值或者总面积低于下限。4.2 焊锡检测CogCNLSearchTool的阈值与杂斑设置焊锡外观检测用 CogCNLSearchTool 的典型做法是把一张OK样品上的焊点区域当作模板训练进去运行的时候在待测区域里找这个模板。如果 Score 高于接受阈值说明焊点外观与OK样品接近低于阈值说明外观异常。Pattern 训练时训练区域要精确框到焊锡本体不要带上周围的PCB阻焊层和走线因为它们在不同板上位置会有轻微差异会把相似度拉低。RunParams.AcceptThreshold 现场一般从 0.7 起调这个值比 CogPMAlignTool 的阈值要高因为灰度相关的得分分布本身就偏高。Clutter 这个参数在焊锡检测里性价比很高焊点周围有丝印或小元件时把它调到 20% 到 40%能明显减少误判。Angle 和 Scale 的搜索范围要克制。焊锡检测通常是固定工位、固定料件角度给 ±3 度、缩放给 ±5% 就足够。给大了以后工具会在更多候选位置上算相关值既耗时间也容易在错误位置上出现高得分。一个常被忽略的点是 TrainingMode。CNLSearch 支持多种训练模式对光照一致性差的工位选对光照变化不敏感的模式比在阈值上反复试要有效得多。4.3 参数落值参考与调参顺序工具参数起始值调整方向CogPMAlignToolAcceptThreshold0.60误判多往上调CogPMAlignToolClutter10%干扰纹理多往上调CogCaliperToolContrastThreshold实际对比度×0.6找不到边往下调CogCaliperToolProjectionLength噪点尺度×3边缘跳变时加大CogBlobToolPixelThresholdRelative由自动模式给初值光照变化大时全靠它CogBlobToolConnectivityMinPixels30粘连多往下调CogCNLSearchToolAcceptThreshold0.70漏检多往下调CogCNLSearchToolAngle±3°按机构重复精度给调参顺序上我一般按定位、测量、判定的顺序推进先把 CogPMAlignTool 的 Score 稳定在 0.85 以上再调卡尺和斑点最后才动判定阈值。反过来的话前面环节一改后面的阈值全部要重调一遍。下面这段是在外部程序里批量改参数、跑批并回收结果的写法方便在一批离线图上快速试参数。// 遍历一个文件夹里的图逐张跑作业统计每个工具的运行状态 foreach (string file in System.IO.Directory.GetFiles(D:\Images, *.bmp)) { CogImageFileTool imgTool new CogImageFileTool(); imgTool.Operator.Open(file, CogImageFileModeConstants.Read); imgTool.Run(); job.Inputs[InputImage].Value imgTool.OutputImage; job.Run(); CogPMAlignTool pm (CogPMAlignTool)job.Tools[CogPMAlignTool1]; // 记录每张图的定位分值和整体判定便于回看哪一类图容易出问题 Console.WriteLine({0}, score{1:F3}, result{2}, System.IO.Path.GetFileName(file), pm.Results.Count 0 ? pm.Results[0].Score : 0.0, job.RunStatus.Result); }Results.Count在定位失败时为 0直接取Results[0]会抛异常所以取分值之前一定要判空。把 Score 和整体判定一起打印出来回看数据时能快速区分是定位问题还是判据问题Score 普遍偏低说明模板或光源该调了Score 正常但判定不稳问题在后面的测量或阈值。5. CogToolBlock脚本的进阶写法与结果验证5.1 在GroupRun里改参数、回写结果ToolBlock脚本放在CogToolBlockAdvancedScriptBase的派生类里核心入口是GroupRun。返回false表示继续执行ToolBlock内部工具返回true表示跳过常规执行、完全由脚本接管。public override bool GroupRun(ref string message, ref CogToolBlockResult result) { // 外部通过 RunParams 终端传入的配方阈值换料调机时不用改vpp double accept Convert.ToDouble(mToolBlock.Inputs[AcceptThreshold].Value); CogPMAlignTool pm (CogPMAlignTool)mToolBlock.Tools[CogPMAlignTool1]; pm.RunParams.AcceptThreshold accept; // 从同一张图里拿到当前产品的料号按料号切不同阈值区间 CogBlobTool blob (CogBlobTool)mToolBlock.Tools[CogBlobTool1]; string partNo mToolBlock.Inputs[PartNo].Value as string; blob.RunParams.AreaMin partNo A12 ? 220 : 180; // 汇总判定结果写回输出终端供上层程序读取 mToolBlock.Outputs[TotalBlobs].Value blob.Results.Count; mToolBlock.Outputs[FinalResult].Value pm.Results.Count 0 ? OK : NG; return false; // false继续执行内部工具true跳过 }把阈值做成 Inputs 终端而不是写死在代码里是这类脚本最有价值的地方。产线换料号时上位机改一个数值就能切配方不需要打开QuickBuild重存vpp也不需要停机重启软件。注意Convert.ToDouble对终端类型有要求终端设成 Double 类型才安全如果设成 String运行时会抛转换异常。另外要留意的执行顺序GroupRun在内部工具执行之前被调用。所以在GroupRun里读blob.Results读到的是上一次运行的结果不是本次的。要读本次结果应该用GroupPostRun或者把汇总逻辑放在脚本的GroupPostRun重载里。这一点是现场最容易踩的坑之一表现就是结果慢一拍。5.2 用同一批图验证脚本是否真的生效改完脚本别急着上线。准备一批覆盖各种情况的图合格品、边缘偏差品、明显NG品每类至少二十张。在GroupRun和GroupPostRun各加一条日志把配方值、工具分值、最终判定按图名输出到同一个csv里。对比两次运行一次锁定参数跑一次打开脚本动态切参数跑。如果两次结果完全一致说明脚本里的赋值没生效多半是终端名拼错、类型不匹配或者赋值位置在工具执行之后。如果两次不一致且符合预期再检查边界把阈值终端置成极端值比如 0 或 1看工具是否按预期全部通过或全部拒绝这一步能验证绑定的确实是目标参数而不是同名的另一个。最后把这一组配方值连同脚本一起存进 vpp并在产线换型表里记录每个料号对应的参数区间。下次建新Job时直接从这个文件复制比每次从零调参省事得多。本文还有配套的精品资源点击获取
返回列表