【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】
【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】
在VisionPro中,CogToolBlock 是一种容器工具,可以将多个视觉工具(如CogBlob、CogPMAlign等)组合成一个可复用的流程。通过C#与VisionPro联合编程,可以动态加载、配置和执行这些工具链。
加载CogToolBlockTool 工具
核心步骤:
步骤 1:创建ToolBlock实例
// 创建CogToolBlock实例
CogToolBlock toolBlock = new CogToolBlock();
步骤 2:加载ToolBlock文件
VisionPro的ToolBlock通常保存为.vpp文件(通过QuickBuild导出)或.toolblock文件。
string toolBlockPath = @"C:\VisionPro\MyToolBlock.vpp";
try
{toolBlock = CogSerializer.LoadObjectFromFile(toolBlockPath) as CogToolBlock;
}
catch (Exception ex)
{MessageBox.Show("加载ToolBlock失败: " + ex.Message);return;
}
步骤 3:设置输入参数
通过Inputs属性设置ToolBlock的输入参数(例如图像、阈值等):
// 假设ToolBlock有一个名为"InputImage"的输入
ICogImage inputImage = CogImageConverter.ToCogImage(bitmap); // 将Bitmap转换为VisionPro图像
toolBlock.Inputs["InputImage"].Value = inputImage;// 设置其他参数(如阈值)
toolBlock.Inputs["Threshold"].Value = 128;
步骤 4:执行ToolBlock
// 执行ToolBlock
toolBlock.Run();// 检查执行状态
if (toolBlock.RunStatus.Result != CogToolResultConstants.Accept)
{MessageBox.Show("ToolBlock执行失败: " + toolBlock.RunStatus.Message);return;
}
步骤 5:获取输出结果
通过Outputs属性获取输出参数:
// 获取输出结果(例如检测到的坐标)
double x = (double)toolBlock.Outputs["OutputX"].Value;
double y = (double)toolBlock.Outputs["OutputY"].Value;// 获取检测结果图像
CogImage8Grey resultImage = toolBlock.Outputs["ResultImage"].Value as CogImage8Grey;
步骤6:保存工具
CogSerializer.SaveObjectToFile(toolBlock,path); // 保存
完整示例代码
using Cognex.VisionPro;
using Cognex.VisionPro.ToolBlock;public void RunToolBlockExample()
{// 1. 加载ToolBlockCogToolBlock toolBlock = null;string toolBlockPath = @"C:\VisionPro\MyToolBlock.vpp";try{toolBlock = CogSerializer.LoadObjectFromFile(toolBlockPath) as CogToolBlock;}catch (Exception ex){MessageBox.Show("加载ToolBlock失败: " + ex.Message);return;}// 2. 设置输入参数Bitmap sourceBitmap = new Bitmap(@"C:\Images\test.bmp");ICogImage inputImage = CogImageConverter.ToCogImage(sourceBitmap);toolBlock.Inputs["InputImage"].Value = inputImage;toolBlock.Inputs["Threshold"].Value = 128;// 3. 执行ToolBlocktoolBlock.Run();// 4. 处理结果if (toolBlock.RunStatus.Result == CogToolResultConstants.Accept){double x = (double)toolBlock.Outputs["OutputX"].Value;double y = (double)toolBlock.Outputs["OutputY"].Value;CogImage8Grey resultImage = toolBlock.Outputs["ResultImage"].Value as CogImage8Grey;MessageBox.Show($"检测到坐标: ({x}, {y})");}else{MessageBox.Show("检测失败: " + toolBlock.RunStatus.Message);}// 5. 释放资源toolBlock.Dispose();\CogSerializer.SaveObjectToFile(toolBlock,path); 保存
}
关键注意事项
输入输出参数名称
- 必须与ToolBlock中定义的名称完全一致(区分大小写),否则会抛出异常。
ToolBlock激活状态
- 确保ToolBlock在QuickBuild中已正确激活(通过右键菜单激活工具)。
异常处理
- 使用try-catch捕获文件加载、参数设置等异常。
- 检查RunStatus.Result判断工具执行是否成功。
资源释放
- VisionPro对象(如CogImage、CogToolBlock)需要显式释放内存:
-
toolBlock.Dispose();
常见问题
加载ToolBlock时报错 "文件格式不支持"
- 确保文件是通过QuickBuild导出的合法ToolBlock文件。
输入参数类型不匹配
- 检查ToolBlock中参数的数据类型(如int vs double)。
执行速度慢
- 优化ToolBlock内部工具的参数(如降低PMAlign的精度要求)。
加载CogToolBlockTool工具详解实例
实例效果:
在窗体加载时创建tb变量并且加载CogToolBlock给变量赋值,当点击打开图片时,根据设定好的路径打开图片并展示在cogRecordDisplay1上,点击更改图片时更改tb变量中的输入图片,点击测量时测量出图片结果并且展示。在窗体跳转时将CogToolBlock的变量传输到窗体2中并且展示在cogToolBlockEditV21上。

一、设置visionPro工具

二、编写form1窗体事件(以下是源码)
public partial class Form1 : Form
{public Form1(){InitializeComponent();}ICogImage image = null; // tb块的图片CogToolBlock tb = null;/// <summary>/// 打开图片/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button1_Click(object sender, EventArgs e){image = cogRecordDisplay1.Image = ReadImage2();cogRecordDisplay1.Fit();}/// <summary>/// 读取图片的方式1/// </summary>/// <returns></returns>public ICogImage ReadImage1(){string path = @"C:\Program Files\Cognex\VisionPro\Images\nutsandbolts.bmp";CogImageFileTool fileTool = new CogImageFileTool();fileTool.Operator.Open(path,CogImageFileModeConstants.Read); // 读取图片fileTool.Run();return fileTool.OutputImage;}/// <summary>/// 读取图片的方式2/// </summary>/// <returns></returns>public ICogImage ReadImage2(){string path = @"C:\Program Files\Cognex\VisionPro\Images\nutsandbolts.bmp";Bitmap map = new Bitmap(path);ICogImage img = new CogImage8Grey(map); // 8 位的灰色// ICogImage img = new CogImage24PlanarColor(map); // 24位的位深图return img;}/// <summary>/// 更改图片/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button3_Click(object sender, EventArgs e){tb.Inputs["OutputImage"].Value = image;}/// <summary>/// 跳转Form/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button4_Click(object sender, EventArgs e){Form2 f2 = new Form2(tb);f2.ShowDialog();}/// <summary>/// 测量/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void button5_Click(object sender, EventArgs e){if (tb != null){// 把采集到的图像传输更改图片// tb.Ibputs 块的输入数据// ["OutputImage"] 块添加的图片// tb.Inputs["OutputImage"].Value = image;tb.Run();// 显示测量结果cogRecordDisplay1.Record = tb.CreateLastRunRecord().SubRecords[0]; // 把测量之后的记录赋值给控件cogRecordDisplay1的recordcogRecordDisplay1.Fit();int count = (int)tb.Outputs["Count"].Value;label1.Text = "显示斑点个数为:" + count;}}/// <summary>/// 加载TB块/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form1_Load(object sender, EventArgs e){string path = Directory.GetCurrentDirectory() + @"\blob.vpp";tb = (CogToolBlock)CogSerializer.LoadObjectFromFile(path);}
}
三、创建form2窗体并且设置cogToolBlockEditV21控件

四、编写form2窗体事件
public partial class Form2 : Form
{CogToolBlock tb;public Form2(CogToolBlock t){InitializeComponent();tb = t;}/// <summary>/// 加载/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Form2_Load(object sender, EventArgs e){// 把传递过来的toolblock进行展示cogToolBlockEditV21.Subject = tb;}}
相关文章:
【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】
【机械视觉】C#VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】 在VisionPro中,CogToolBlock 是一种容器工具,可以将多个视觉工具(如CogBlob、CogPMAlign等)组合成一个可复用的流程。通过C#与Visi…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED
问题:启动wsl里的Ubuntu24报错 报错信息: 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件,并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息,请访…...
常用AI工具推荐
AI对话相关 Deepseek https://chat.deepseek.com/ Kimi https://kimi.moonshot.cn/ 豆包 https://www.doubao.com/ 文心一言 https://yiyan.baidu.com/ 腾讯元宝 https://yuanbao.tencent.com 通义千问 https://tongyi.aliyun.com/qianwen/ 图片生成相关 即梦 https://jimen…...
用AI学编程3——Java学习1
一个Java文件, 整理出Java从入门到精通的所有知识点, 给出注释, 给出这样的Java文件 Java 学习整合文件 /*** Java 学习整合文件* 包含 Java 从入门到精通的主要知识点,包括基础语法、面向对象编程、异常处理、集合框架、多线程…...
如何监控 Pod 的 CPU/内存使用率,prometheus+grafana
一、监控 Pod 的 CPU/内存使用率的方法 1. 使用 kubectl top 命令(临时检查) # 查看所有 Pod 的资源使用率(需安装 Metrics Server) kubectl top pods --all-namespaces # 查看指定命名空间的 Pod kubectl top pods -n <n…...
云服务器Linux安装Docker
系统要求 Docker 官方建议将 Docker 运行在 Linux系统上,当然也可以在其他平台运行,本篇博客只介绍在 Linux 系统上的安装方法。 Docker 运行在 CentOS7.X 版本以上,本文使用阿里云 ECS 云服务器 CentOS 7.4 版本。 Docker 需要安装在 64 …...
信息安全与网络安全的区别_信息安全与网络安全之差异探析
在当今数字化时代,信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及,但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略,以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…...
Express 中 get 参数获取
1. 使用 req.query 获取 URL 查询字符串参数 在 GET 请求中,参数通常以查询字符串的形式附加在 URL 后面,格式为 ?参数名1值1&参数名2值2 。Express 里可通过 req.query 对象获取这些参数。 const express require("express"); const …...
充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)
充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发,采用模块化设计,支持单机部署与集群部署,能够根据业务需求动态扩展。系统前端使用uniapp框架,可…...
深度求索(DeepSeek)开源周技术全景与行业影响研究报告
2025年2月24日至28日,中国AI企业深度求索(DeepSeek)发起了为期五天的“开源周”活动,连续开源五大核心代码库(FlashMLA、DeepEP、DeepGEMM、DualPipe、EPLB)及分布式文件系统3FS,覆盖AI模型训练…...
设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan
前言 这几年芯片设计行业在国内像坐过山车。时而高亢,时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何? 我谈谈自己观点:芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后,芯…...
串口助手的C#编写以及有人串口服务器USR-DR301的使用
本文介绍C#编写串口程序的要点,串口服务器USR-DR301(RS232转TCP)的使用、以及调试过程中碰到的两个问题: 1). 调用串口报“连到系统上的设备没有发挥作用”. 2). “所有文本框都变成了透明”的异常处理 代码见:https://download.csdn.net/download/qq_34047402/9046713…...
Android中AIDL和HIDL的区别
在Android中,AIDL(Android Interface Definition Language) 和 HIDL(HAL Interface Definition Language) 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC(进程间通信࿰…...
【HeadFirst系列之HeadFirst设计模式】第18天之蝇量模式(Flyweight Pattern):优化资源的秘密武器
蝇量模式(Flyweight Pattern):优化资源的秘密武器 在软件开发中,当系统需要创建大量相似对象时,内存占用和性能问题就会浮出水面。《Head First 设计模式》介绍了 蝇量模式(Flyweight Pattern)…...
微信小程序将markdown内容转为pdf并下载
要在微信小程序中将Markdown内容转换为PDF并下载,您可以使用以下方法: 方法一:使用第三方API服务 选择第三方API服务: 可以选择像 Pandoc、Markdown-PDF 或 PDFShift 这样的服务,将Markdown转换为PDF。例如,PDFShift 提供了一个API接口,可以将Markdown内容转换为PDF格式…...
SQL CHAR_LENGTH返回字符串长度的函数
CHAR_LENGTH 是 SQL 中的一个用于返回字符串长度的函数。它计算的是字符串中的字符数,而不是字节数。这在处理多字节字符集(如 UTF-8)时尤其有用,因为一个字符可能会占用多个字节。 CHAR_LENGTH(string) string 是要计算长度的字…...
sqlserver删除表记录语句,及删除表时清零ID的SQL语句
sqlserver中,删除表中所有记录的语句如下 Delete from tableName 例,删除表logs的所有记录 sqlserver,删除表中所有数据,标识列ID归零,保留表结构的语句 truncate table tableName 例,删除表logs的所…...
求最大公约数问题(信息学奥赛一本通-1207)
【题目描述】 给定两个正整数,求它们的最大公约数。 【输入】 输入一行,包含两个正整数(<1,000,000,000)。 【输出】 输出一个正整数,即这两个正整数的最大公约数。 【输入样例】 6 9 【输出样例】 3 【题解代码】 #include<bits/stdc…...
Vue3中动态Ref的魔法:绑定与妙用
前言 在Vue 3的开发过程中,动态绑定Ref是一项非常实用的技术,特别是在处理复杂组件结构和动态数据时。通过动态绑定Ref,我们可以更灵活地访问和操作DOM元素或组件实例,实现更高效的交互和状态管理。本文将详细介绍如何在Vue 3中实现动态Ref的绑定,并通过实例展示其妙用。…...
Conda常用命令汇总
Conda 是一个流行的包管理器和环境管理工具,广泛应用于数据科学、机器学习等领域。它可以帮助我们管理 Python 包以及不同版本的环境,避免包冲突,提升项目的可复现性。以下是一些常用的 Conda 命令,涵盖环境创建、管理、包安装等常…...
2025年科技趋势深度解析:从“人工智能+”到量子跃迁的技术革命
一、“人工智能”国家战略:重塑产业生态的核心引擎 2025年政府工作报告首次将"人工智能"提升至国家战略层面,标志着AI技术正式成为驱动产业升级的核心力量。据麦肯锡最新研究显示,中国云计算市场规模已突破8315亿元,其…...
【瞎折腾/ragflow】构建docker镜像并部署使用ragflow
说在前面 操作系统:win11docker desktop版本:4.29.0docker engin版本:v26.0.0ragflow版本:nightly 安装docker 官网 如果是win11,backend建议使用wsl2 安装好后打开docker desktop,不然docker命令用不了 …...
哈弗赛恩公式计算长度JavaScript实现
哈弗赛恩公式(Haversine formula)是一种用于计算球面上两点间最短距离的数学方法,尤其适用于地球表面。本文将详细介绍哈弗赛恩公式的原理、应用以及如何使用JavaScript实现它。 一、哈弗赛恩公式原理 在球面几何中,哈弗赛恩公式…...
Pytest框架中的Fixture:深入理解与实际应用
Pytest是Python中最流行的测试框架之一,以其简洁的语法和强大的功能而闻名。在Pytest中,fixture是一个非常重要的概念,它允许我们在测试函数执行前后进行一些准备工作或清理工作。本文将深入探讨fixture的使用方法、实际应用场景以及一些高级…...
大模型赋能金融行业:从理念到落地实践
思维导图 引言 🌟 随着人工智能技术的飞速发展,大模型正在重塑各行各业,金融领域尤为明显。本文将基于业内领先金融科技公司的实践经验,系统探讨大模型在金融行业的落地应用、面临的挑战以及未来的发展方向。从AI发展历程、能力边…...
数据结构篇——串(String)
一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。 二、串的定义 2.1、串的基本定义 串(s…...
数据结构--【顺序表与链表】笔记
顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员,受保护成员在 arrList 类中仍然是受保护成员。 { …...
算法.习题篇
算法 — 地大复试 模拟 while循环和MOD循环计数 1.约瑟夫问题 http://bailian.openjudge.cn/practice/3254 using namespace std;bool isNoPeople(vector<bool> c)//判断当前数组是否一个小孩都没有了 {bool nopeople true;for (bool ival : c){if ( ival true)nop…...
大语言模型进化论:从达尔文到AI的启示与展望
文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…...
