ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

VisionPro中Advanced脚本实战,检测瓶子中液面的位置

VisionPro中Advanced脚本实战,检测瓶子中液面的位置 工程流程ToolBlock工具关系脚本执行逻辑PMAlign定位Caliper测量液位Distance计算Graphic显示文字和线代码中容易理解错误的地方VisionPro实战案例基于PMAlign Caliper Distance实现液位检测并显示OK/NG 一、项目介绍 在工业视觉检测中经常需要检测产品的位置、尺寸以及状态。 本案例实现的功能 1. 使用 PMAlign 工具定位每一个瓶子的位置 2. 根据定位结果动态移动 Caliper 卡尺 3. 使用 Caliper 检测液面边缘 4. 使用 Distance 工具计算液位高度 5. 根据距离判断产品是否合格 6. 在图像中显示检测线和 OK/NG 结果。 最终效果 - 红色线表示检测位置 - OK 表示液位正常 - NG 表示液位异常。 整个检测流程如下输入图片↓CogPMAlignTool(定位瓶子)↓CogCaliperTool(检测液面边缘)↓CogDistanceSegmentLineTool(计算距离)↓脚本判断↓显示检测结果--- # 二、整体工具流程设计 本案例使用以下 VisionPro 工具 ## 1. CogIPOneImageTool 作用 负责图像预处理和输出图像。 主要作用 - 输入图片 - 提供后续工具使用的图像。 代码显示位置 csharp CogIPOneImageTool1.OutputImage后续所有绘制的线和文字都添加到了这个图像记录上。2. CogPMAlignTool作用定位瓶子。PMAlign通过模板匹配找到目标位置。例如图片中有8个瓶子瓶1 瓶2 瓶3 ... 瓶8PMAlign结果pma.Results里面保存所有匹配结果。每一个CogPMAlignResult代表一个找到的瓶子。3. CogCaliperTool作用检测液面边缘。Caliper不是负责找产品位置而是负责在指定区域寻找灰度变化明显的边缘。例如液体区域白色区域 ------------ 液面 灰色区域灰度变化的位置就是边缘。4. CogDistanceSegmentLineTool作用计算线段距离。输入CogLineSegment输出Distance例如起点 | | | 终点 距离20三、脚本整体结构1. 创建显示对象代码CogGraphicCollectiongcnewCogGraphicCollection();ListCogGraphicLabellabelsnewListCogGraphicLabel();其中CogGraphicCollection保存绘制图形。例如线矩形圆这里保存CogLineSegment用于显示红色检测线。List保存文字。例如OK NG最后统一显示。四、GroupRun执行流程分析GroupRun是整个脚本运行入口。代码publicoverrideboolGroupRun(refstringmessage,refCogToolResultConstantsresult)当ToolBlock运行时会首先进入这里。五、运行工具代码foreach(ICogTooltoolinmToolBlock.Tools){if(tool.Name!CogCaliperTool2){mToolBlock.RunTool(tool,refmessage,refresult);}}这里遍历ToolBlock里面所有工具。但是排除了CogCaliperTool2原因Caliper的位置需要根据PMAlign结果动态改变。执行顺序ImageTool ↓ PMAlign ↓ 其他工具 (暂时不运行Caliper)六、获取工具对象代码CogPMAlignToolpmamToolBlock.Tools[CogPMAlignTool1]asCogPMAlignTool;获取PMAlign工具。CogCaliperToolcmToolBlock.Tools[CogCaliperTool2]asCogCaliperTool;获取Caliper工具。CogDistanceSegmentLineTooldismToolBlock.Tools[CogDistanceSegmentLineTool1]asCogDistanceSegmentLineTool;获取距离计算工具。七、循环处理每一个瓶子代码foreach(CogPMAlignResultrinpma.Results)意思PMAlign找到几个目标就循环几次。例如找到8个瓶子循环8次八、根据PMAlign结果移动Caliper代码c.Region.CenterXr.GetPose().TranslationX;c.Region.CenterYr.GetPose().TranslationY;这是整个程序的关键。PMAlign负责定位瓶子在哪里Caliper负责测量液面在哪里所以需要把Caliper移动到PMAlign找到的位置。例如PMAlign找到X500 Y300那么Caliper中心X500 Y300九、运行Caliper寻找边缘代码mToolBlock.RunTool(c,refmessage,refresult);运行完成后Caliper产生结果c.Results.Edges其中Edges[0]表示第一个检测到的边缘。十、生成检测线代码CogLineSegmentsnewCogLineSegment();创建一条线。设置起点s.StartXc.Results.Edges[0].PositionX;s.StartYc.Results.Edges[0].PositionY;来源c.Results.Edges[0]这是Caliper检测出来的边缘位置。例如PositionX500 PositionY300那么线起点(500,300)设置终点代码s.EndXc.Results.Edges[0].PositionX20;s.EndYc.Results.Edges[0].PositionY;表示从检测点向右画20像素。效果起点 ---------------- 终点 20像素设置颜色s.ColorCogColorConstants.Red;显示红色。添加到集合gc.Add(s);保存这条线。十一、计算液位距离代码dis.Segments;这里表示把刚刚创建的线段交给距离工具。也就是告诉Distance工具计算这条线的长度然后mToolBlock.RunTool(dis,...)运行。结果dis.Distance例如Distance18十二、判断OK和NG代码if(dis.Distance20){label.SetXYText(s.StartX,s.StartY,NG);}else{label.SetXYText(s.StartX,s.StartY,OK);}判断规则距离结果20OK20NG例如液位正常Distance15 OK液位异常Distance25 NG十三、显示检测结果显示线代码ModifyLastRunRecord()里面mToolBlock.AddGraphicToRunRecord(t,lastRecord,CogIPOneImageTool1.OutputImage,);作用把红线添加到运行记录。显示文字代码foreach(CogGraphicLabellabelinlabels)然后AddGraphicToRunRecord()把OK/NG显示出来。十四、代码中容易理解错误的地方1. 为什么StartX不是自己定义的s.StartXc.Results.Edges[0].PositionX;StartX属于CogLineSegment表示线的起点。而PositionX来自CogCaliperTool表示检测到的边缘位置。关系Caliper找到边 ↓ 得到PositionX ↓ 赋值给线StartX ↓ 显示检测线2. 为什么需要dis.Segments因为距离工具不知道测哪条线。所以dis.Segments;相当于告诉距离工具计算这条线3. 为什么不直接固定坐标错误方式s.StartX500;原因产品位置会变化。正确方式PMAlign定位 ↓ 获取真实坐标 ↓ 动态调整Caliper4. 为什么要清空集合代码gc.Clear();labels.Clear();防止重复显示。否则第一次OK第二次OK OK不断叠加。十五、项目最终效果该项目实现✅ 自动定位多个瓶子✅ 自动寻找液面位置✅ 自动计算液位高度✅ 自动判断OK/NG✅ 自动显示检测结果整个项目体现了VisionPro工业视觉开发中的经典流程定位 ↓ 测量 ↓ 计算 ↓ 判断 ↓ 显示其中PMAlign解决位置问题Caliper解决边缘检测问题Distance解决尺寸计算问题Graphic解决结果显示问题。
返回列表