如何用VisionPro检测多个瓶子的液位高度?PMAlign+Caliper方案分享(机器视觉工程师经典案例)
康耐视VisionPro液面高度检测方案PMAlign Caliper ToolBlock脚本实现多目标液位标记摘要本文分享一个基于 Cognex VisionPro 的液面检测项目。通过CogPMAlignTool定位每一个容器位置再利用CogCaliperTool对每个容器区域进行边缘检测获取液面高度并通过CogToolBlock脚本自动绘制红色液位标记线。文章包含完整实现思路、脚本代码和关键参数说明典型机器视觉案例.一、项目背景与检测需求在制药、食品、化妆品等行业中瓶装液体的液位高度是一项关键检测项。液位过高或过低都可能影响产品质量。本次项目的需求是同时检测多个排列整齐的容器自动识别每个容器内的液面位置在液面位置绘制一条红色横线便于直观判断实现方案模板匹配定位 卡尺找边 脚本循环处理二、整体实现思路整个程序的流程如下图像采集通过相机获取待检测图像模板匹配使用CogPMAlignTool训练容器模板识别出所有容器得到每个容器的中心坐标(TranslationX, TranslationY)动态 ROI将CogCaliperTool的检测区域CogRectangleAffine中心点移动到每个匹配结果的中心位置边缘检测运行CogCaliperTool找到液面边缘点绘制标记根据边缘点坐标生成一条红色横线并叠加显示核心思想PMAlign 解决在哪里Caliper 解决液面在哪里脚本解决批量处理 可视化。三、工具配置1. CogPMAlignTool 配置训练一个容器的模板建议训练瓶身中部或肩部稳定特征设置合适的匹配分数阈值确保所有容器都能被检测到允许同时返回多个匹配结果Results集合2. CogCaliperTool 配置将卡尺工具的区域类型设置为CogRectangleAffine调整卡尺区域的大小和角度使其覆盖液面可能出现的区域设置边缘极性确保能够准确找到液面边缘四、核心脚本代码所有逻辑都在CogToolBlock的脚本中实现代码如下// 获取 PMAlign 工具CogPMAlignToolpmamToolBlock.Tools[CogPMAlignTool1]asCogPMAlignTool;// 获取卡尺工具CogCaliperToolcalmToolBlock.Tools[CogCaliperTool1]asCogCaliperTool;// 获取卡尺的仿射矩形区域用于动态移动 ROICogRectangleAffineaffinecal.RegionasCogRectangleAffine;// 创建图形集合用于存放绘制的液位线(脚本里面不写这里,写全局变量)CogGraphicCollectiongcnewCogGraphicCollection();// 清空上一次运行绘制的图形避免重复叠加gc.Clear();// 遍历 PMAlign 的所有匹配结果foreach(CogPMAlignResultiteminpma.Results){// 将卡尺 ROI 中心移动到当前匹配目标的中心affine.CenterXitem.GetPose().TranslationX;affine.CenterYitem.GetPose().TranslationY;// 运行卡尺工具检测当前容器内的液面边缘cal.Run();// 遍历当前卡尺结果foreach(CogCaliperResultitem1incal.Results){// 创建一条线段长度 50中心在液面边缘点CogLineSegmentlinenewCogLineSegment();line.SetStartEnd(item1.Edge0.PositionX-25,item1.Edge0.PositionY,item1.Edge0.PositionX25,item1.Edge0.PositionY);// 设置线条颜色为红色line.ColorCogColorConstants.Red;// 添加到图形集合用于显示gc.Add(line);}}五、代码解析5.1 工具对象获取CogPMAlignToolpmamToolBlock.Tools[CogPMAlignTool1]asCogPMAlignTool;CogCaliperToolcalmToolBlock.Tools[CogCaliperTool1]asCogCaliperTool;通过工具名称从ToolBlock中获取 PMAlign 和 Caliper 工具实例。5.2 动态 ROI 移动CogRectangleAffineaffinecal.RegionasCogRectangleAffine;affine.CenterXitem.GetPose().TranslationX;affine.CenterYitem.GetPose().TranslationY;关键点将卡尺区域的中心坐标设置为当前 PMAlign 匹配结果的中心坐标实现 ROI 对每个容器的跟随。5.3 绘制液位线line.SetStartEnd(item1.Edge0.PositionX-25,item1.Edge0.PositionY,item1.Edge0.PositionX25,item1.Edge0.PositionY);line.ColorCogColorConstants.Red;以液面边缘点为中心向左右各延伸 25 个像素绘制一条红色水平线段直观标识液面高度。六、运行效果图片 1ToolBlock 内部工具连接与运行结果说明该图展示了每个容器被 PMAlign 定位后Caliper 动态找边并在液面位置绘制红色标记线的结果。图片 2QuickBuild 整体作业流程说明该图展示了整个 QuickBuild 作业的流程和最终可视化效果。七、关键注意事项模板训练要稳定PMAlign 的模板尽量选择瓶身不受液位变化影响的区域避免液面高低影响匹配稳定性。Caliper ROI 大小要合适ROI 宽度要能覆盖液面可能的变化范围ROI 高度不宜过大避免误检到其他边缘边缘极性设置液面通常是从液体较暗到空气较亮的过渡或者相反需根据实际情况设置边缘极性。图形集合清空每次运行前调用gc.Clear()否则上一次运行的红线会残留在图像上。异常情况处理实际生产建议增加结果数量判断和空结果保护例如if(pma.Resultsnull||pma.Results.Count0)return;八、总结本方案通过PMAlign 定位 Caliper 找边 ToolBlock 脚本循环处理实现了多目标液面高度的自动检测和可视化标记。整个方案的优点结构清晰易于维护扩展性强增减容器数量无需修改脚本可视化效果好红色液位线直观明了希望这篇文章对你有所帮助文章版本v1.0软件环境Cognex VisionPro 9.x / QuickBuild转载请注明出处。