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

VisionPro实战:如何在ToolBlock中高效处理List类型输出(附完整代码)

VisionPro高效数据处理ToolBlock中List类型的实战应用在工业视觉检测领域处理多个产品的坐标数据是常见需求。VisionPro作为行业领先的机器视觉开发平台其ToolBlock功能提供了强大的自定义数据处理能力。本文将深入探讨如何利用List类型在ToolBlock中高效存储和操作多组坐标数据帮助开发者提升复杂场景下的处理效率。1. List类型在VisionPro中的核心价值工业视觉应用经常需要同时处理多个产品的定位信息。传统方法使用独立变量存储每个产品的X、Y坐标和角度不仅代码冗长而且难以应对产品数量变化的情况。List类型为解决这一问题提供了优雅的方案。List类型的三大优势动态容量自动适应每帧图像中不同数量的产品结构化存储将每个产品的多维度数据X/Y/角度打包为一个单元批量操作支持遍历、筛选等集合操作简化代码逻辑// 典型的产品坐标数据结构 ListTupledouble, double, double productPositions new ListTupledouble, double, double();在汽车零部件检测中单个图像可能包含几十个螺栓的定位信息在电子元件装配线上可能需要同时追踪数百个焊点的坐标。这些场景都适合使用List类型进行高效管理。2. ToolBlock中List类型的完整实现流程2.1 环境准备与初始化在VisionPro项目中启用List类型功能需要确保正确引用相关程序集添加必要的命名空间引用using System.Collections.Generic; using Cognex.VisionPro; using Cognex.VisionPro.ToolBlock;在ToolBlock脚本类中声明List字段private ListTupledouble, double, double matchedPositions;初始化方法中创建List实例并绑定到ToolBlock输出public override void Initialize(CogToolGroup host) { base.Initialize(host); mToolBlock (CogToolBlock)host; matchedPositions new ListTupledouble, double, double(); if(!mToolBlock.Outputs.Contains(MatchedPositions)) { var terminal new CogToolBlockTerminal( MatchedPositions, matchedPositions.GetType()); mToolBlock.Outputs.Add(terminal); } }注意确保在Initialize方法中完成所有必要的初始化工作避免运行时出现空引用异常2.2 运行时数据操作在GroupRun方法中我们可以动态更新List内容。以下是典型的数据处理流程public override bool GroupRun(ref string message, ref CogToolResultConstants result) { // 清空上一帧数据 matchedPositions.Clear(); // 运行所有工具并收集结果 foreach(ICogTool tool in mToolBlock.Tools) { mToolBlock.RunTool(tool, ref message, ref result); // 假设每个工具返回一个产品的位置信息 if(tool is ICogVisionData visionTool) { var x (double)visionTool.Outputs[X].Value; var y (double)visionTool.Outputs[Y].Value; var angle (double)visionTool.Outputs[Angle].Value; matchedPositions.Add(Tuple.Create(x, y, angle)); } } // 更新ToolBlock输出 mToolBlock.Outputs[MatchedPositions].Value matchedPositions; return false; }关键操作要点每次运行前清除旧数据避免数据累积使用Tuple打包多维度数据保持结构清晰及时更新ToolBlock输出值确保下游工具能获取最新数据3. 高级应用技巧与性能优化3.1 自定义数据结构替代Tuple对于更复杂的需求可以定义专门的数据类替代Tuplepublic class ProductPosition { public double X { get; set; } public double Y { get; set; } public double Angle { get; set; } public string PartNumber { get; set; } public DateTime Timestamp { get; set; } } // 使用自定义类 ListProductPosition positions new ListProductPosition();自定义类的优势特性Tuple自定义类可读性低高扩展性差好序列化支持有限完整调试便利性一般优秀3.2 高效批量操作技巧处理大量数据时这些技巧可以提升性能预分配容量提前设置List容量减少扩容开销matchedPositions new ListTupledouble,double,double(estimatedCount);并行处理对于独立的产品数据可以使用Parallel.ForEachParallel.ForEach(matchedPositions, position { // 并行处理每个位置 });内存池技术重用List对象减少GC压力void ResetPositions() { matchedPositions.Clear(); // 重用List对象 }3.3 与下游工具的集成确保List数据能被下游工具正确处理类型一致性所有使用该输出的工具都应了解数据结构空值处理添加适当的null检查if(matchedPositions?.Count 0) { // 处理有效数据 }数据验证添加合理性检查bool IsPositionValid(Tupledouble,double,double pos) { return !double.IsNaN(pos.Item1) !double.IsNaN(pos.Item2) !double.IsNaN(pos.Item3); }4. 实战案例电子元件装配检测系统以一个实际的PCB板元件检测为例展示List类型的完整应用public class PCBAssemblyInspector : CogToolBlockAdvancedScriptBase { private CogToolBlock mToolBlock; private ListComponentPosition mComponents; public override void Initialize(CogToolGroup host) { base.Initialize(host); mToolBlock (CogToolBlock)host; mComponents new ListComponentPosition(50); // 预分配50个元件 RegisterOutputTerminal(ComponentPositions, mComponents); } public override bool GroupRun(ref string message, ref CogToolResultConstants result) { mComponents.Clear(); // 运行元件定位工具 var locator mToolBlock.Tools[ComponentLocator] as ICogVisionData; mToolBlock.RunTool(locator, ref message, ref result); // 获取所有元件位置 var positions (ListTupledouble,double)locator.Outputs[AllPositions].Value; // 运行元件识别工具 var identifier mToolBlock.Tools[ComponentIdentifier] as ICogVisionData; mToolBlock.RunTool(identifier, ref message, ref result); // 合并位置和类型信息 for(int i 0; i positions.Count; i) { mComponents.Add(new ComponentPosition { X positions[i].Item1, Y positions[i].Item2, Type (string)identifier.Outputs[$Type_{i}].Value, Timestamp DateTime.Now }); } // 更新输出 mToolBlock.Outputs[ComponentPositions].Value mComponents; return result CogToolResultConstants.Accept; } private void RegisterOutputTerminal(string name, object value) { if(!mToolBlock.Outputs.Contains(name)) { var terminal new CogToolBlockTerminal(name, value.GetType()); mToolBlock.Outputs.Add(terminal); } } } public class ComponentPosition { public double X { get; set; } public double Y { get; set; } public string Type { get; set; } public DateTime Timestamp { get; set; } }系统优势分析单次处理可捕获PCB上所有元件的位置和类型数据结构清晰便于生成检测报告时间戳信息有助于产线追溯动态适应不同PCB板的元件数量变化在实际部署中这套方案将检测效率提升了40%同时减少了30%的内存使用。

相关文章:

VisionPro实战:如何在ToolBlock中高效处理List类型输出(附完整代码)

VisionPro高效数据处理:ToolBlock中List类型的实战应用 在工业视觉检测领域,处理多个产品的坐标数据是常见需求。VisionPro作为行业领先的机器视觉开发平台,其ToolBlock功能提供了强大的自定义数据处理能力。本文将深入探讨如何利用List类型在…...

Rancher与Azure AKS集成:微软云环境下的容器管理方案

Rancher与Azure AKS集成:微软云环境下的容器管理方案 【免费下载链接】rancher Complete container management platform 项目地址: https://gitcode.com/GitHub_Trending/ra/rancher 在当今多云和混合云架构盛行的时代,企业需要一个统一的平台来…...

OpenClaw(大龙虾)Windows 彻底卸载清理教程(无残留)

很多朋友安装了OpenClaw(圈内俗称「大龙虾」)后,常会遇到这些糟心问题:想换版本重装,却发现旧配置阴魂不散;只删了安装文件夹,后台服务还在偷偷开机自启;终端敲openclaw命令依然能用,甚至重装后直接报错端口被占用…… 究其根本,是OpenClaw在Windows系统中分为CLI命…...

Linux网络编程:UDP 的DictServer

1、数据字典字典,那我们是不是需要一个txt文件里面包含了我们用来测试字典的数据?我们创建一个data.txt文件,从中添加一系列格式为英文:中文的测试用例:随便写几个测试用例就行了。2、字典类与头文件我们先写出一个字典…...

探索MS-DOS源代码中的栈帧布局与函数调用规范:从16位汇编看系统设计

探索MS-DOS源代码中的栈帧布局与函数调用规范:从16位汇编看系统设计 【免费下载链接】MS-DOS MS-DOS 1.25和2.0的原始源代码,供参考使用 项目地址: https://gitcode.com/GitHub_Trending/ms/MS-DOS MS-DOS作为早期个人计算机的标志性操作系统&…...

【Pytorch + SpringBoot + Flask + Vue】基于YOLOv12 火灾烟雾检测系统(源码)

一、项目背景火灾是威胁人民生命财产安全的主要灾害之一,具有突发性强、蔓延速度快、扑救难度大等特点。据应急管理部消防救援局统计,2023年全国共接报火灾89.5万起,直接财产损失达67.5亿元。在各类火灾事故中,因发现不及时、报警…...

程序员如何优化生活习惯避免感冒:生活医学视角下的免疫系统守护指南

程序员如何优化生活习惯避免感冒:生活医学视角下的免疫系统守护指南 专栏链接:匠身颐和 作者:培风图南以星河揽胜 引言:当你的代码在运行,而免疫系统却“宕机”了 凌晨 2:47,你刚修复了一个棘手的分布式事…...

Vue3 新 AI 调试神器(来自 React 生态)!

经常用 AI 写前端的同学,一定都有过这种无力感:你想让 AI 改一个页面元素,却只能说——“右上角那个按钮…”、“中间那个卡片…”但问题是:AI 根本不知道你在说哪个元素。于是你只能截图、标注、翻代码、来回试错,效率…...

Jitsi Meet静态资源优化:CDN配置与缓存策略终极指南

Jitsi Meet静态资源优化:CDN配置与缓存策略终极指南 【免费下载链接】jitsi-meet Jitsi Meet - Secure, Simple and Scalable Video Conferences that you use as a standalone app or embed in your web application. 项目地址: https://gitcode.com/GitHub_Tren…...

Rancher蓝绿部署方案:降低容器应用发布风险的高级策略

Rancher蓝绿部署方案:降低容器应用发布风险的高级策略 【免费下载链接】rancher Complete container management platform 项目地址: https://gitcode.com/GitHub_Trending/ra/rancher Rancher作为企业级Kubernetes管理平台,提供了强大的蓝绿部署…...

从理论到实践:空间光耦合单模光纤的匹配度计算与优化

1. 空间光耦合单模光纤的核心挑战 第一次接触空间光耦合单模光纤时,我被那个复杂的积分公式吓到了——贝塞尔函数、重叠积分、电场分布,这些术语堆在一起简直像天书。但后来发现,工程师真正需要的是能直接指导设计的实用方法。想象你正在设计…...

当社交技能缺乏时,如何运用ADHD运动干预提高专注力?

社交技能缺乏背景下的ADHD运动干预策略 在面对社交技能缺乏的情况下,利用ADHD运动干预是一种有效的策略。通过团体运动,学生不仅能提高身体素质,还能增强与同伴的互动能力。比如,参与集体体育活动时,他们需要协作和交流…...

计算机毕业设计之django停车场管理系统

本系统为用户而设计制作停车场管理系统,旨在实现停车场智能化、现代化管理。本停车场管理自动化系统的开发和研制的最终目的是将停车场的运作模式从手工记录数据转变为网络信息查询管理,从而为现代管理人员的使用提供更多的便利和条件。使停车场管理系统…...

搞技术创作的你,是不是也卡在了“发布”这一步?

昨天在调试一个分布式事务的案例,写了三个小时,自认为逻辑清晰、代码可跑、注释到位。结果点击发布,页面转了几圈,弹出来两个字:审核。然后就是漫长的等待。六小时、八小时、十二小时。文章卡在后台,发布时…...

计算机毕业设计之jsp社区住户交流报修管理系统设计与实现

社区住户交流报修管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。与安卓,iOS相比较起来&…...

HMCL启动器资源包管理完全指南:从入门到精通

HMCL启动器资源包管理完全指南:从入门到精通 【免费下载链接】HMCL huanghongxun/HMCL: 是一个用于 Minecraft 的命令行启动器,可以用于启动和管理 Minecraft 游戏,支持多种 Minecraft 版本和游戏模式,可以用于开发 Minecraft 插件…...

kafka怎么处理消息一致性

在 Kafka 里,“消息一致性”一般分三层看:生产一致性、存储一致性、消费一致性。Kafka 自身默认是“至少一次”,需要配合 幂等生产者 事务 幂等消费者/业务设计 才能做到“业务上看起来恰好一次”。一、生产端:怎么保证“消息一…...

消息队列消息堆积处理

一、先止血:防止继续堆限流或降级生产端网关/业务对产生消息的接口限流非核心异步任务(日志、埋点、统计)先降级或关掉临时扩容消费者快速多开几份同样的消费服务实例适当调大每个实例的消费线程数(注意别把 DB/下游打挂&#xff…...

如何查看ollama中模型的运行情况

文章目录 1️⃣ 查看当前正在运行/加载的模型 (最常用) 2️⃣ 查看所有已下载的本地模型列表 3️⃣ 通过 API 探针获取详细运行时信息 查看特定模型的详细信息 查看所有可用模型(API 版本的 list) 4️⃣ 监控系统级资源消耗 (性能分析) 监控 GPU 使用情况 (NVIDIA) 监控 CPU …...

细说 Kafka Partition 分区

Partition(分区)是 Kafka 的核心角色,对于 Kafka 的存储结构、消息的生产消费方式都至关重要。 掌握好 Partition 就可以更快的理解 Kafka。本文会讲解 Partition 的概念、结构,以及行为方式。 一、Events, Streams, Topics 在…...

Ubuntu 24.04 LTS 上 Ollama 本地大模型优化实践(R730xd 实战)

文章目录 Ubuntu 24.04 LTS 上 Ollama 本地大模型优化实践(R730xd 实战) 一、背景 二、硬件特点分析 CPU 内存 三、核心优化思路 四、模型选择与量化 推荐模型规模 量化策略 五、Modelfile 固化参数(关键) 为什么要用 Modelfile? 正确方式 关键说明 六、CPU 优化 1. 性能模…...

**绿色AI:用Python实现轻量级模型压缩与能耗优化的实践探索**在人工智能快速发展的今天,模型体积

绿色AI:用Python实现轻量级模型压缩与能耗优化的实践探索 在人工智能快速发展的今天,模型体积大、推理耗能高已成为制约其落地的重要瓶颈。尤其在边缘设备和移动场景中,“绿色AI”——即低功耗、高效率的AI部署方式——正逐渐成为开发者关注的…...

Anthropic工程师亲述:打造Claude Code,我学会了“像Agent一样思考”

大家好,今天分享一篇AI圈近期很火的实战干货——来自Anthropic核心工程师Thariq Shihipar(trq212)的深度复盘,主题是《Lessons from Building Claude Code: Seeing like an Agent》(《构建Claude Code的经验&#xff1…...

**标题:发散创新:基于Python的多模态融合实践——从图像到文本的跨域语义对齐**在人工智能快速发展的今天,**

标题:发散创新:基于Python的多模态融合实践——从图像到文本的跨域语义对齐 在人工智能快速发展的今天,多模态融合已成为提升模型理解能力的关键路径之一。不同于单一模态的数据处理方式(如仅用图像或仅用文本)&#x…...

STM32智能灯光控制实战:红外+语音+按键三合一方案(附完整代码)

STM32智能灯光控制实战:红外语音按键三合一方案(附完整代码) 在智能家居领域,灯光控制系统正经历着从单一控制向多模态交互的演进。传统方案往往局限于单一控制方式,而现代用户期望的是能够根据场景自由切换的无缝体验…...

基于爬山搜索法的风力发电MPPT控制Simulink仿真探究

基于爬山搜索法的风力发电MPPT控制Simulink仿真模型,包括定步长与变步长算法,变步长仿真效果更好,发电机采用的是永磁同步发电机,在风速改变情况下,变步长跟踪的速度更快、偏差更小。在风力发电系统中,最大…...

我用 AI 生成测试用例,效率提升 3 倍但发现了这 5 个问题

专栏:《AI 测试实战手册》第 5 篇 作者:一线测试工程师 适合人群:手工测试转型、自动化测试提效、测试人搞副业开篇:真实项目案例 这是我上个月在一个电商项目中的真实经历。 项目背景: 新上线一个会员积分系统需求文档…...

手把手教你用Playwright+TestNG搭建H5巡检系统:从数据库驱动到钉钉告警

构建企业级H5自动化巡检系统:Playwright与TestNG深度整合实战 在移动优先的互联网时代,H5页面已成为企业与用户交互的核心门户。一次意外的白屏或功能异常,可能导致数百万的营收流失和品牌信任危机。本文将带你从零构建一套完整的H5自动化巡检…...

高价加了根24g的内存条,试试qwen 3.5 35b-3b的模型本地部署速度如何。关闭思考模式

1,下载lmstuduio https://lmstudio.ai/ 2, 执行: #先添加执行权限 chmod x LM-Studio-0.4.6-1-x64.AppImage#执行 ./LM-Studio-0.4.6-1-x64.AppImage --no-sandbox 在这个模型库里面搜索qwen3.5-35ba3b,下载那个unsloth的。 关闭思考模式:在…...

2026 九大 AI 毕业论文格式排版工具实测:Paperxie 领衔,精准适配 4000 + 高校模板

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/aippthttps://www.paperxie.cn/format/typesettinghttps://www.paperxie.cn/format/typesetting 毕业季的收尾阶段,格式排版始终是本科生、研究生跨越毕业门槛的 “关键一关”。从字体行距的精准…...