如何用VisionPro检测多个瓶子的液位高度?PMAlign+Caliper方案分享(机器视觉工程师经典案例)

发布时间:2026/11/1 9:23:09

如何用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转载请注明出处。
延伸阅读

更多相关文章

2026/10/30 12:29:10

AI生成的沙盒地图为什么“大而空”?把这7项写进提示词

很多人第一次用自然语言生成沙盒游戏,会输入这样一句话: 做一个开放世界沙盒游戏,里面有山脉、城堡和道路,玩家可以自由探索。 生成结果往往很有气势:地图面积很大,有山、有城堡,也有纵横交错的…

2026/10/30 16:24:57

数据驱动如何革新青训?伊犁基地从经验到科学的实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 2:01:37

1.c++入门篇

1.c中的关键字asmdoifreturntrycontinueautodoubleinlineshorttypedefforbooldynamic_castintsignedtypeidpublicbreakelselongsizeoftypenamethrowcaseenummutablestaticunionwchar_tcatchexplicitnamespacestatic_castunsigneddefaultcharexportnewstructusingfriendclassext…

2026/11/1 2:01:37

《江灯合声》:有可行的分框版,也仍可以选择连续鸣谢

武汉江岸区栎坡合唱团在免费节目册《江灯合声》中,以表格集中鸣谢资助者。各家共同要求改为独立小框,团里仍想保留表格。现有全名与支持事项清楚可见,双方此前未承诺具体排版。我支持保留表格。补充的试排材料让选择更具体:分框能…

2026/11/1 2:01:37

关于“贾子猜想”的数学地位、结构特征与讨论边界

关于“贾子猜想”的数学地位、结构特征与讨论边界摘要 本文对“贾子猜想”进行基于公开表述与现有数学事实的分析。该猜想主张:当正整数 n3m>5(即 n6,9,12,15,…)时,方程x₁ⁿ x₂ⁿ ⋯ xₙⁿ yⁿ不存在正整数解。文章首先…

2026/11/1 2:01:37

启动报Port 8088 was already in use?先查是谁占的

启动报Port 8088 was already in use?先查是谁占的 项目启动报 Port 8088 was already in use,意思很直白:这个端口已经有人占了。 先说原理:端口是"门牌号",一间房只住一个进程 端口就是一台机器上的门牌号…

2026/11/1 2:01:37

担心文档上云?本地运行的办公AI才敢放心用

单位上周开了个会,主题是"AI 提效",散会时领导补了一句:涉及客户资料的文档,不许往云端传。这话一出,会议室里本来跃跃欲试的同事全蔫了——大家平时用的那些在线 AI,文档一上传就不知道存哪儿去…

2026/11/1 1:56:37

华为OD机试真题 新系统 2026-10-28 JavaGoC【社交网络消息转发】

目录 题目 思路 Code 题目 题目内容: 在一个社交网络中,有 N 个用户(编号 0 到 N−1);每个用户都有一个「转发名单」(整数),该数二进制格式中的第 i 位为 1 表示此用户会把消息转发给第 i 个用户。 给定一个整数数组 forwardLists 和一个整数 initialSenders,请…

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/1 0:01:26

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/1 1:01:33

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑