【机械视觉】C#+VisionPro联合编程———【三、加载CogToolBlock工具详解,以及实例】

news2025/3/9 6:32:15

【机械视觉】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. 加载ToolBlock
    CogToolBlock 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. 执行ToolBlock
    toolBlock.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的record
            cogRecordDisplay1.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;
    }


    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2311993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

启动wsl里的Ubuntu24报错:当前计算机配置不支持 WSL2,HCS_E_HYPERV_NOT_INSTALLED

问题&#xff1a;启动wsl里的Ubuntu24报错 报错信息&#xff1a; 当前计算机配置不支持 WSL2。 请启用“虚拟机平台”可选组件&#xff0c;并确保在 BIOS 中启用虚拟化。 通过运行以下命令启用“虚拟机平台”: wsl.exe --install --no-distribution 有关信息&#xff0c;请访…

信息安全与网络安全的区别_信息安全与网络安全之差异探析

在当今数字化时代&#xff0c;信息安全与网络安全成为了人们关注的热点话题。尽管这两个概念经常被提及&#xff0c;但它们之间存在着明显的区别。本文旨在探讨信息安全与网络安全的定义、范畴及应对策略&#xff0c;以帮助读者更好地理解和应对相关挑战。 一、定义与范畴的差…

充电桩快速搭建springcloud(微服务)+前后端分离(vue),客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

充电桩管理系统是专为中小型充电桩运营商、企业和个人开发者设计的一套高效、灵活的管理平台。系统基于Spring Cloud微服务架构开发&#xff0c;采用模块化设计&#xff0c;支持单机部署与集群部署&#xff0c;能够根据业务需求动态扩展。系统前端使用uniapp框架&#xff0c;可…

设计AI芯片架构的入门 研究生入行数字芯片设计、验证的项目 opentitan

前言 这几年芯片设计行业在国内像坐过山车。时而高亢&#xff0c;时而低潮。最近又因为AI的热潮开始high起来。到底芯片行业的规律是如何&#xff1f; 我谈谈自己观点&#xff1a;芯片设计是“劳动密集型”行业。 “EDA和工具高度标准化和代工厂的工艺标准化之后&#xff0c;芯…

串口助手的C#编写以及有人串口服务器USR-DR301的使用

本文介绍C#编写串口程序的要点,串口服务器USR-DR301(RS232转TCP)的使用、以及调试过程中碰到的两个问题: 1). 调用串口报“连到系统上的设备没有发挥作用”. 2). “所有文本框都变成了透明”的异常处理 代码见:https://download.csdn.net/download/qq_34047402/9046713…

Android中AIDL和HIDL的区别

在Android中&#xff0c;AIDL&#xff08;Android Interface Definition Language&#xff09; 和 HIDL&#xff08;HAL Interface Definition Language&#xff09; 是两种用于定义跨进程通信接口的语言。AIDL 是 Android 系统最早支持的 IPC&#xff08;进程间通信&#xff0…

sqlserver删除表记录语句,及删除表时清零ID的SQL语句

sqlserver中&#xff0c;删除表中所有记录的语句如下 Delete from tableName 例&#xff0c;删除表logs的所有记录 sqlserver&#xff0c;删除表中所有数据&#xff0c;标识列ID归零&#xff0c;保留表结构的语句 truncate table tableName 例&#xff0c;删除表logs的所…

【瞎折腾/ragflow】构建docker镜像并部署使用ragflow

说在前面 操作系统&#xff1a;win11docker desktop版本&#xff1a;4.29.0docker engin版本&#xff1a;v26.0.0ragflow版本&#xff1a;nightly 安装docker 官网 如果是win11&#xff0c;backend建议使用wsl2 安装好后打开docker desktop&#xff0c;不然docker命令用不了 …

哈弗赛恩公式计算长度JavaScript实现

哈弗赛恩公式&#xff08;Haversine formula&#xff09;是一种用于计算球面上两点间最短距离的数学方法&#xff0c;尤其适用于地球表面。本文将详细介绍哈弗赛恩公式的原理、应用以及如何使用JavaScript实现它。 一、哈弗赛恩公式原理 在球面几何中&#xff0c;哈弗赛恩公式…

大模型赋能金融行业:从理念到落地实践

思维导图 引言 &#x1f31f; 随着人工智能技术的飞速发展&#xff0c;大模型正在重塑各行各业&#xff0c;金融领域尤为明显。本文将基于业内领先金融科技公司的实践经验&#xff0c;系统探讨大模型在金融行业的落地应用、面临的挑战以及未来的发展方向。从AI发展历程、能力边…

数据结构篇——串(String)

一、引入 在计算机中的处理的数据内容大致可分为以整形、浮点型等的数值处理和字符、字符串等的非数值处理。 今天我们主要学习的就是字符串数据。本章主要围绕“串的定义、串的类型、串的结构及其运算”来进行串介绍与学习。 二、串的定义 2.1、串的基本定义 串&#xff08;s…

数据结构--【顺序表与链表】笔记

顺序表 template <class T> class arrList :public List<T> //表示 arrList 类以公有继承的方式继承自 List<T> 类 //公有继承意味着 List<T> 类的公共成员在 arrList 类中仍然是公共成员&#xff0c;受保护成员在 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的启示与展望

文章大纲 引言大语言模型中的“进化论”思想体现遗传变异过度繁殖和生存斗争大模型“过度繁殖”与“生存竞争”机制解析**一、过度繁殖:技术迭代的指数级爆发****二、生存竞争:计算资源的达尔文战场****三、生存竞争胜出关键要素****四、行业竞争格局演化趋势**核心结论自然选…

编程考古-Borland历史:《.EXE Interview》对Anders Hejlsberg关于Delphi的采访内容(上)

为了纪念Delphi在2002年2月14日发布的25周年(2020.2.12),这里有一段由.EXE杂志编辑Will Watts于1995年对Delphi首席架构师Anders Hejlsberg进行的采访记录。在这次采访中,Anders讨论了Delphi的设计与发展,以及即将到来的针对Windows 95的32位版本。 问: Delphi是如何从T…

系统架构设计师—系统架构设计篇—基于体系结构的软件开发方法

文章目录 概述基于体系结构的开发模型-ABSDM体系结构需求体系结构设计体系结构文档化体系结构复审体系结构实现体系结构演化 概述 基于体系结构&#xff08;架构&#xff09;的软件设计&#xff08;Architecture-Based Software Design&#xff0c;ABSD&#xff09;方法。 AB…

基于Python+Django的网上招聘管理系统

项目介绍 PythonDjango网上招聘系统的设计与实现(Pycharm Django Vue Mysql) 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。整个平台包括前台和后台两个部分。 - 前台功能包括&#xff1a;首页、岗位详情页、简历中…

Vue23Web 基礎性拉滿的面試題(2025版)還沒更新完...

Vue2&3 基礎性1. 關於Vue2和Vue3生命週期的差別2. Vue2&3組件之間傳參不同點Vue2 傳遞與接收Vue3 傳遞與接收 (使用script setup語法糖)Vue3 傳遞與接收 (不使用script setup語法糖) 3. Vue2&3 keep-alive 組件Vue2 keep-aliveVue3 keep-alive 進階性爲什麽POST請求…

GitHub神秘组织3小时极速复刻Manus

一、背景 昨夜科技圈被两个关键词刷屏&#xff1a;​Manus激活码炒至6万&#xff0c;​GitHub神秘项目OpenManus突然开源。 Manus之所以如此火爆&#xff0c;是因为在演示视频中自主分析股票、筛选简历、规划旅行的能力。同时&#xff0c;想要体验Manus就需要内测邀请码&…

文件上传漏洞(upload靶场)

目录 Pass-01&#xff1a;前端绕过 方法一&#xff1a;浏览器禁用js 方法二:直接修改或删除js脚本 方法三&#xff1a;修改后缀绕过 Pass-02:服务器检测 Pess-03:黑名单绕过 Pass-04:.htaccess文件 Pass-05:windows特性和user.ini 方法一&#xff1a;php.自动解析为ph…