当前位置: 首页 > article >正文

机器视觉VsionPro液位检测

VisionPro 液位检测项目完整笔记这是工业液位 / 液面高度检测的标准方案模板匹配定位 动态卡尺找液面 距离判定 OK/NG适用于瓶装、杯装、试管类液位检测。我把代码、工具、逻辑全部整理成可直接学习、复用的笔记结构清晰、重点标注。一、整体功能一句话总结模板匹配CogPMAlignTool定位瓶子 / 容器位置动态移动卡尺CogCaliperTool2到目标位置精准找液面边缘点画红色水平线标记液面位置距离工具CogDistanceSegmentLineTool计算液面高度判定 OK/NG并在图像上显示绿色 / 红色标签图形叠加显示直观判断液位是否合格二、使用工具清单核心 4 个工具表格工具名称作用CogPMAlignTool1模板匹配定位容器位置解决产品偏移问题CogCaliperTool1辅助卡尺脚本未使用一般用于定位基准线CogCaliperTool2主检测卡尺动态找液面边缘CogDistanceSegmentLineTool1距离测量计算液面到基准线的高度CogIPOneImageTool1图像预处理灰度 / 滤波提升检测稳定性三、代码逐段笔记最核心1. 命名空间固定引用c##region namespace imports using System; using System.Collections; using System.Drawing; using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using Cognex.VisionPro.PMAlign; // 模板匹配 using Cognex.VisionPro.Caliper; // 卡尺 using Cognex.VisionPro.Dimensioning;// 距离/尺寸工具 using Cognex.VisionPro.ImageProcessing; // 图像处理 #endregion作用导入 VisionPro 工具库让脚本可以调用匹配、卡尺、距离工具。2. 私有变量脚本全局对象c##region Private Member Variables private CogToolBlock mToolBlock; // 工具块主体固定 CogGraphicCollection gc new CogGraphicCollection(); // 图形集合 #endregiongc用来统一存放所有要画的线、文字最后一次性显示比 List 更适合 VisionPro 图形管理3. 主运行逻辑最重要逐行解析c#// 1. 运行工具块里所有工具预处理、匹配、卡尺等 foreach(ICogTool tool in mToolBlock.Tools) mToolBlock.RunTool(tool, ref message, ref result); // 2. 获取4个核心工具对象 CogPMAlignTool pma mToolBlock.Tools[CogPMAlignTool1] as CogPMAlignTool; CogCaliperTool c mToolBlock.Tools[CogCaliperTool2] as CogCaliperTool; CogDistanceSegmentLineTool dis mToolBlock.Tools[CogDistanceSegmentLineTool1] as CogDistanceSegmentLineTool; // 清空上一帧图形避免重叠 gc.Clear(); // 3. 遍历匹配到的目标支持多目标 foreach (CogPMAlignResult item in pma.Results) { // // 动态移动卡尺到匹配位置 // c.Region.CenterX item.GetPose().TranslationX; c.Region.CenterY item.GetPose().TranslationY; c.Run(); // 卡尺重新运行找边缘 // // 画红色水平线标记液面 // CogLineSegment s new CogLineSegment(); s.StartX c.Results.Edges[0].PositionX; // 液面X s.StartY c.Results.Edges[0].PositionY; // 液面Y s.EndX c.Results.Edges[0].PositionX 20; // 向右画20像素 s.EndY c.Results.Edges[0].PositionY; s.Color CogColorConstants.Red; s.LineWidthInScreenPixels 5; // 粗线醒目 gc.Add(s); // 加入图形集合 // // 距离测量 OK/NG判定 // CogGraphicLabel label new CogGraphicLabel(); dis.Segment s; // 把液面线段给距离工具 dis.Run(); // 计算距离液面到基准线 // 阈值15 → NG ≤15 → OK if(dis.Distance 15) { label.SetXYText(s.StartX, s.StartY, NG); label.Color CogColorConstants.Red; } else { label.SetXYText(s.StartX, s.StartY, OK); label.Color CogColorConstants.Green; } gc.Add(label); // 把OK/NG标签加入集合 } return false;核心逻辑总结模板定位 → 动态移动卡尺解决产品偏移卡尺找液面边缘点画红线标记液面距离工具算高度阈值判定 OK/NG图形存入集合等待显示4. 图形叠加显示最后一步c#// 把所有线、标签画到输出图上 foreach(ICogGraphic g in gc) { mToolBlock.AddGraphicToRunRecord( g, lastRecord, CogIPOneImageTool1.OutputImage, // 画在预处理后的图 ); }四、工具配置关键要点必记1. CogPMAlignTool1模板匹配学习模板瓶身 / 瓶口固定特征作用得到产品 XY 坐标让卡尺跟着产品动2. CogCaliperTool2液面检测卡尺边缘极性明→暗 或 暗→明根据液面是亮还是暗搜索方向垂直向下 / 向上扫过液面对比阈值调高避免干扰3. CogDistanceSegmentLineTool1距离工具一条线是基准线标准液位另一条是卡尺找到的液面线输出两条线之间的垂直距离五、关键知识点面试 / 项目必背液位检测 模板定位 垂直卡尺找边缘动态卡尺匹配结果 XY → 卡尺中心 XY → 重新 Run用CogLineSegment画线标记液面用DistanceSegmentLine测高度差图形统一存入CogGraphicCollectionOK/NG 根据距离阈值判断六、常见调整参数液面 OK 高度if(dis.Distance 15)里的15红线长度20可改长改短红线粗细LineWidthInScreenPixels 5卡尺位置根据匹配结果偏移微调 XY七、完整流程图示plaintext图像采集 → 预处理(IPOne) → 模板匹配(PMAlign) → 动态移动卡尺(Caliper2) → 找液面边缘 → 画红线 → 距离计算 → OK/NG判定 → 图形叠加显示总结这是最标准、最稳定、工业最常用的 VisionPro 液位检测方案鲁棒性强模板匹配抗偏移精度高卡尺亚像素边缘直观红线 OK/NG 标签可扩展多目标、多容器工具参数CogCaliperTool1CogCaliperTool2脚本命名空间#region namespace importsusing System;using System.Collections;using System.Drawing;using System.IO;using System.Windows.Forms;using Cognex.VisionPro;using Cognex.VisionPro.ToolBlock;using Cognex.VisionPro3D;using Cognex.VisionPro.ImageProcessing;using Cognex.VisionPro.PMAlign;using Cognex.VisionPro.Caliper;using Cognex.VisionPro.Dimensioning;#endregion第一部分#region Private Member Variablesprivate Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock;CogGraphicCollection gc new CogGraphicCollection();#endregion第二部分// Run each tool using the RunTool functionforeach(ICogTool tool in mToolBlock.Tools)mToolBlock.RunTool(tool, ref message, ref result);CogPMAlignTool pma mToolBlock.Tools[CogPMAlignTool1] as CogPMAlignTool;CogCaliperTool c mToolBlock.Tools[CogCaliperTool2] as CogCaliperTool;CogDistanceSegmentLineTool dis mToolBlock.Tools[CogDistanceSegmentLineTool1] as CogDistanceSegmentLineTool;gc.Clear();foreach ( CogPMAlignResult item in pma.Results){c.Region.CenterX item.GetPose().TranslationX;c.Region.CenterY item.GetPose().TranslationY;c.Run();CogLineSegment s new CogLineSegment();s.StartX c.Results.Edges[0].PositionX;s.StartY c.Results.Edges[0].PositionY;s.EndX c.Results.Edges[0].PositionX 20;s.EndY c.Results.Edges[0].PositionY;s.Color CogColorConstants.Red;s.LineWidthInScreenPixels 5;gc.Add(s);CogGraphicLabel label new CogGraphicLabel();dis.Segment s;dis.Run();if( dis.Distance 15 ){//NGlabel.SetXYText( s.StartX, s.StartY, NG);label.Color CogColorConstants.Red;}else{//OKlabel.SetXYText(s.StartX, s.StartY, OK);label.Color CogColorConstants.Green;}gc.Add(label);}return false;第三部分foreach( ICogGraphic g in gc){mToolBlock.AddGraphicToRunRecord(g,lastRecord,CogIPOneImageTool1.OutputImage,);}完整代码#region namespace imports using System; using System.Collections; using System.Drawing; using System.IO; using System.Windows.Forms; using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock; using Cognex.VisionPro3D; using Cognex.VisionPro.ImageProcessing; using Cognex.VisionPro.PMAlign; using Cognex.VisionPro.Caliper; using Cognex.VisionPro.Dimensioning; #endregion public class CogToolBlockAdvancedScript : CogToolBlockAdvancedScriptBase { #region Private Member Variables private Cognex.VisionPro.ToolBlock.CogToolBlock mToolBlock; CogGraphicCollection gc new CogGraphicCollection(); #endregion /// summary /// Called when the parent tool is run. /// Add code here to customize or replace the normal run behavior. /// /summary /// param namemessageSets the Message in the tools RunStatus./param /// param nameresultSets the Result in the tools RunStatus/param /// returnsTrue if the tool should run normally, /// False if GroupRun customizes run behavior/returns public override bool GroupRun(ref string message, ref CogToolResultConstants result) { // To let the execution stop in this script when a debugger is attached, uncomment the following lines. // #if DEBUG // if (System.Diagnostics.Debugger.IsAttached) System.Diagnostics.Debugger.Break(); // #endif // Run each tool using the RunTool function foreach(ICogTool tool in mToolBlock.Tools) mToolBlock.RunTool(tool, ref message, ref result); CogPMAlignTool pma mToolBlock.Tools[CogPMAlignTool1] as CogPMAlignTool; CogCaliperTool c mToolBlock.Tools[CogCaliperTool2] as CogCaliperTool; CogDistanceSegmentLineTool dis mToolBlock.Tools[CogDistanceSegmentLineTool1] as CogDistanceSegmentLineTool; gc.Clear(); foreach ( CogPMAlignResult item in pma.Results) { c.Region.CenterX item.GetPose().TranslationX; c.Region.CenterY item.GetPose().TranslationY; c.Run(); CogLineSegment s new CogLineSegment(); s.StartX c.Results.Edges[0].PositionX; s.StartY c.Results.Edges[0].PositionY; s.EndX c.Results.Edges[0].PositionX 20; s.EndY c.Results.Edges[0].PositionY; s.Color CogColorConstants.Red; s.LineWidthInScreenPixels 5; gc.Add(s); CogGraphicLabel label new CogGraphicLabel(); dis.Segment s; dis.Run(); if( dis.Distance 15 ) { //NG label.SetXYText( s.StartX, s.StartY, NG); label.Color CogColorConstants.Red; } else { //OK label.SetXYText(s.StartX, s.StartY, OK); label.Color CogColorConstants.Green; } gc.Add(label); } return false; } #region When the Current Run Record is Created /// summary /// Called when the current record may have changed and is being reconstructed /// /summary /// param namecurrentRecord /// The new currentRecord is available to be initialized or customized./param public override void ModifyCurrentRunRecord(Cognex.VisionPro.ICogRecord currentRecord) { } #endregion #region When the Last Run Record is Created /// summary /// Called when the last run record may have changed and is being reconstructed /// /summary /// param namelastRecord /// The new last run record is available to be initialized or customized./param public override void ModifyLastRunRecord(Cognex.VisionPro.ICogRecord lastRecord) { foreach( ICogGraphic g in gc) { mToolBlock.AddGraphicToRunRecord( g, lastRecord, CogIPOneImageTool1.OutputImage,); } } #endregion #region When the Script is Initialized /// summary /// Perform any initialization required by your script here /// /summary /// param namehostThe host tool/param public override void Initialize(Cognex.VisionPro.ToolGroup.CogToolGroup host) { // DO NOT REMOVE - Call the base class implementation first - DO NOT REMOVE base.Initialize(host); // Store a local copy of the script host this.mToolBlock ((Cognex.VisionPro.ToolBlock.CogToolBlock)(host)); } #endregion }

相关文章:

机器视觉VsionPro液位检测

VisionPro 液位检测项目完整笔记这是工业液位 / 液面高度检测的标准方案:模板匹配定位 动态卡尺找液面 距离判定 OK/NG,适用于瓶装、杯装、试管类液位检测。我把代码、工具、逻辑全部整理成可直接学习、复用的笔记,结构清晰、重点标注。一、…...

面试必问!MySQL 事务到底是怎么实现的?这篇文章讲透了

说实话,这个问题我被问过不止一次。每次有人来问我 MySQL 事务是怎么回事,我都发现大家普遍停留在「ACID 四个特性」这个层面,背得挺溜,但真要问你 MySQL 底层是怎么实现原子性的,怎么保证崩了数据不丢,怎么…...

H5Maker开源编辑器:3步搭建你的专属H5创作平台

H5Maker开源编辑器:3步搭建你的专属H5创作平台 【免费下载链接】h5maker h5编辑器类似maka、易企秀 账号/密码:admin 项目地址: https://gitcode.com/gh_mirrors/h5/h5maker 想要快速制作精美的H5页面却苦于没有专业设计技能?H5Maker开…...

别再踩坑了!Element Plus侧边栏折叠动画卡顿?试试这个CSS样式和collapse-transition配置

Element Plus侧边栏动画卡顿优化实战:从CSS到性能调优全解析 当我们在企业级后台系统中使用Element Plus的侧边栏菜单时,折叠动画的流畅度直接影响用户体验。很多开发者都遇到过这样的场景:点击折叠按钮后,菜单项像被"粘住&q…...

红队新神器!哪吒网络安全:DeepSeek 驱动的终端 AI 渗透指挥台

最近安全圈又出了个超棒的开源工具!一个潜伏了很久的 Rust 项目突然发布,它就是哪吒网络安全(nezha_cyber)—— 专为红队演练、渗透测试和漏洞研究打造的终端 AI 指挥台,用 DeepSeek 大模型给安全人员赋能,…...

从Modbus RTU通讯协议入手,手把手教你用Python控制伺服电机(附时代超群AIMotor示例代码)

Python实战:基于Modbus RTU协议精准控制伺服电机全流程解析 伺服电机作为工业自动化领域的核心执行元件,其精确控制能力直接影响设备性能。我曾在一个半导体封装设备项目中,需要同时协调12台伺服电机完成微米级定位,当时使用Pytho…...

别再乱改代码了!Discuz X3.5论坛登录状态判断与页面跳转的3种正确姿势(附移动端适配)

Discuz X3.5登录状态判断与页面跳转的3种专业实现方案 在Discuz X3.5论坛开发中,登录状态判断与跳转逻辑看似简单,实则暗藏诸多技术细节。许多站长直接从网络复制代码片段,导致页面闪烁、SEO收录异常或移动端适配失效等问题。本文将深入剖析三…...

如何用VinXiangQi打造你的智能象棋AI助手:3个步骤快速上手

如何用VinXiangQi打造你的智能象棋AI助手:3个步骤快速上手 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi 想要拥有一个能自动识别棋盘、分析棋…...

智能作业车辆路径规划【附ROS仿真】

✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。 ✅ 如需沟通交流,扫描文章底部二维码。(1)Dijkstra全局路径与改进TEB局部规划融合:首先基于…...

终极指南:如何在Mac上完整支持Xbox控制器游戏体验

终极指南:如何在Mac上完整支持Xbox控制器游戏体验 【免费下载链接】360Controller TattieBogle Xbox 360 Driver (with improvements) 项目地址: https://gitcode.com/gh_mirrors/36/360Controller 你是否曾经满怀期待地想在Mac上体验主机游戏的畅快&#xf…...

从USB到以太网:一文搞懂不同标准(CRC-32/CRC-8)的Verilog并行实现差异

从USB到以太网:CRC校验的Verilog并行实现实战解析 在高速数字接口设计中,CRC校验如同一位沉默的哨兵,时刻守护着数据完整性。当工程师面对USB 3.0的CRC-32、以太网的CRC-32C或SATA的CRC-8等不同标准时,如何在FPGA中高效实现这些校…...

终极窗口尺寸强制调整工具:3步彻底解决顽固窗口问题

终极窗口尺寸强制调整工具:3步彻底解决顽固窗口问题 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer 你是否遇到过那些无法调整大小的顽固窗口?老旧软件界面…...

为 OpenClaw Agent 框架配置 Taotoken 作为统一的模型提供商

为 OpenClaw Agent 框架配置 Taotoken 作为统一的模型提供商 1. 准备工作 在开始配置之前,请确保已安装 OpenClaw 框架并完成基本环境搭建。同时需要在 Taotoken 控制台获取有效的 API Key,并在模型广场确认要使用的模型 ID。Taotoken 提供的模型 ID 通…...

WaveTools鸣潮工具箱:终极免费工具箱解锁游戏新体验 [特殊字符]

WaveTools鸣潮工具箱:终极免费工具箱解锁游戏新体验 🚀 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否曾经因为《鸣潮》游戏卡顿而烦恼?是否因为多个账号切换繁琐…...

告别官网!在PyCharm里直接调教ChatGPT写Python代码(附飞机大战实战)

在PyCharm中打造AI编程助手:用ChatGPT插件开发飞机大战游戏 每次在浏览器和IDE之间反复切换查文档、调试代码时,你是否想过:如果有个懂编程的助手能直接嵌入开发环境会怎样?现在PyCharm的ChatGPT插件让这成为可能。不同于官网版本…...

如何让明日方舟干员成为你的桌面伙伴?5个简单步骤部署开源桌宠神器Ark-Pets终极指南

如何让明日方舟干员成为你的桌面伙伴?5个简单步骤部署开源桌宠神器Ark-Pets终极指南 【免费下载链接】Ark-Pets Arknights Desktop Pets | 明日方舟桌宠 (ArkPets) 项目地址: https://gitcode.com/gh_mirrors/ar/Ark-Pets 想让《明日方舟》中的干员突破次元壁…...

Go语言技能树实战:从并发模式到REST API的工程化演练

1. 项目概述:一个Go语言技能树的实战演练场 最近在GitHub上看到一个挺有意思的仓库,叫 guynhsichngeodiec/cc-skills-golang 。光看这个名字,你可能会有点懵,但点进去就会发现,这其实是一个围绕Go语言技能点构建的实…...

快速解锁VMware macOS支持:完整实战指南

快速解锁VMware macOS支持:完整实战指南 【免费下载链接】unlocker VMware Workstation macOS 项目地址: https://gitcode.com/gh_mirrors/unloc/unlocker 在Windows或Linux系统上运行macOS虚拟机,是许多开发者和技术爱好者的实际需求。VMware U…...

ARM架构TLB管理机制与性能优化实践

1. ARM架构TLB管理机制概述 在ARM架构的处理器中,TLB(Translation Lookaside Buffer)是内存管理单元(MMU)的核心组件,负责缓存虚拟地址到物理地址的转换结果。当操作系统修改页表时,必须及时使T…...

Flutter定位权限处理全攻略:从iOS弹窗到Android后台定位,一个Demo搞定所有坑

Flutter定位权限处理全攻略:从iOS弹窗到Android后台定位,一个Demo搞定所有坑 在Flutter应用开发中,定位功能几乎是LBS类应用的标配,但权限处理却让不少开发者头疼。iOS 14的精确定位临时授权、Android 10的后台定位权限、权限被永…...

Twinkle Tray显示器亮度管理终极指南:免费快速调节多显示器亮度

Twinkle Tray显示器亮度管理终极指南:免费快速调节多显示器亮度 【免费下载链接】twinkle-tray Easily manage the brightness of your monitors in Windows from the system tray 项目地址: https://gitcode.com/gh_mirrors/tw/twinkle-tray Twinkle Tray是…...

别再只盯着幅值了!用MatLab搞定CSI相位矫正,让你的无线定位更精准

别再只盯着幅值了!用MatLab搞定CSI相位矫正,让你的无线定位更精准 在无线感知与定位研究中,CSI(Channel State Information)的幅值信息长期占据着研究者的视线焦点,而相位信息却像被遗忘的金矿&#xff0c…...

Android设备管理终极指南:Escrcpy如何彻底改变你的工作流

Android设备管理终极指南:Escrcpy如何彻底改变你的工作流 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 在移动开发、测试和设备管…...

Python人脸识别入门:除了face-recognition,你还需要知道dlib库的这些安装“玄学”

Python人脸识别开发者的必修课:深入解析dlib库的安装逻辑与底层原理 人脸识别技术正在从实验室走向日常生活,而Python开发者往往被一个看似简单的安装问题绊住脚步——dlib库的安装。这个隐藏在face-recognition库背后的C图形库,为何会成为无…...

PyTorch增量学习超快

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PyTorch增量学习的超速优化:从边缘设备到实时AI的革命 目录 PyTorch增量学习的超速优化:从边缘设备到实时…...

从‘cp -r not specified’报错,聊聊Linux命令设计的‘潜规则’与学习心法

从‘cp -r not specified’报错,聊聊Linux命令设计的‘潜规则’与学习心法 第一次在终端里敲下cp folder1 folder2却看到cp: omitting directory的红色警告时,我盯着屏幕愣了三秒。这个看似"不友好"的错误提示,后来成了我理解Linux…...

告别SATA卡顿!5分钟搞懂NVMe SSD为啥这么快(附选购避坑指南)

告别SATA卡顿!5分钟搞懂NVMe SSD为啥这么快(附选购避坑指南) 当你按下开机键,盯着屏幕上转圈的加载图标;或是游戏载入时,看着进度条缓慢蠕动;又或是拷贝大型文件,进度百分比像老牛拉…...

RAGENativeUI:终极GTA模组界面开发指南,快速打造原生级游戏体验

RAGENativeUI:终极GTA模组界面开发指南,快速打造原生级游戏体验 【免费下载链接】RAGENativeUI 项目地址: https://gitcode.com/gh_mirrors/ra/RAGENativeUI 价值主张开篇:告别界面开发噩梦,拥抱高效创作时代 想象一下&a…...

别再问怎么装ipa了!从企业签到TF上架,iOS开发者最全的四种分发方案实战对比

iOS应用分发方案全解析:从企业签名到TestFlight上架实战指南 每次面对iOS应用分发这个老话题,总能看到开发者群里冒出各种"求推荐稳定签名服务"、"TF上架又被拒了怎么办"的求助。作为经历过数十个应用从内测到上线全周期的老手&…...

用Unity LayerMask玩出花:一个‘层’搞定游戏中的敌我识别、场景交互与UI管理

用Unity LayerMask玩出花:一个‘层’搞定游戏中的敌我识别、场景交互与UI管理 在游戏开发中,我们经常需要处理各种复杂的交互逻辑。想象一下,当玩家点击屏幕时,系统需要快速判断这次点击是针对敌人、可拾取物品还是UI按钮。传统做…...