VisionPro二次开发学习笔记12-使用CogToolGroup控件进行图像检测

news2024/11/26 14:56:48

本示例演示了如何通过图像数据库使用 CogImageFileTool,并将其放入 CogToolGroup 中,对于数据库中的每个图像运行一次检测.

当用户按下 运行 按钮时,程序执行以下操作:

如果工具组中没有 CogImageFileTools,它将显示一条消息,告知用户该应用程序至少需要一个 CogImageFileTool,并且不再继续执行。
它遍历工具组,并将所有 CogImageFileTools 重置为其图像数据库中的第一张图像(如果它们有打开的数据库)。
它遍历工具组,并重置找到的任何 CogDataAnalysisTools 的统计信息。
它反复运行工具组,直到工具组中的第一个 CogImageFileTool 达到其数据库中的最后一张图像.

1. 界面设计

添加CogToolGroup控件和ListView,Button,一些文本和文本框.

在这里插入图片描述

2. 添加引用

using Cognex.VisionPro;
using Cognex.VisionPro.Exceptions;
using Cognex.VisionPro.ImageFile;
using Cognex.VisionPro.ToolGroup;

3. 声明变量

        private string TItle = "Cognex VisionPro CogToolGroup Test Applicaiton";
        private bool mTestInProgress;
        private long mAccept;
        private long mWarn;
        private long mReject;
        private long mError;

        private CogToolGroup toolGroup;
        private CogImageFileTool imageFileTool;

4. 运行按钮事件处理

  1. try-catch 块

    • 代码的主要逻辑放在 try 块中,目的是捕捉在执行过程中可能出现的异常。catch 块用于处理特定类型的异常(如 CogException 和一般的 Exception),并显示相应的错误信息。
  2. 测试进行状态检查

    if (mTestInProgress)
    {
        mTestInProgress = false;
        return;
    }
    
    • 检查是否有测试正在进行。如果有,则将 mTestInProgress 设置为 false 并返回,停止当前操作。
  3. 工具组初始化

    toolGroup = cogToolGroupEditV21.Subject;
    
    • cogToolGroupEditV21 获取当前的工具组。
  4. 重置统计计数器

    mAccept = 0;
    mWarn = 0;
    mReject = 0;
    mError = 0;
    UpdateTotals();
    listView1.Items.Clear();
    listView1.Activation = ItemActivation.OneClick;
    
    • 初始化接受、警告、拒绝和错误的计数器,并更新总计。清空 listView1 的项目,并设置激活模式为单击。
  5. 重置图像工具

    for (int i = toolGroup.Tools.Count - 1; i >= 0; i--)
    {
        if (toolGroup.Tools[i] is CogImageFileTool)
        {
            imageFileTool = (CogImageFileTool)toolGroup.Tools[i];
            imageFileTool.NextImageIndex = 0; // 重置为第一张图片
        }
    }
    
    • 遍历工具组中的所有工具,查找 CogImageFileTool 类型的工具,并将其 NextImageIndex 重置为 0(即第一张图片)。
  6. 工具有效性检查

    • 检查 imageFileTool 是否为 null,确保工具组至少有一个图像文件工具。
    • 检查 imageFileTool.Operator.Count,确保工具有可处理的图像文件。
    • 检查 imageFileTool.ImageIndexIncrement,确保图像索引增量非零。
  7. 重置数据分析工具的参数

    foreach (var item in toolGroup.Tools)
    {
        if (item is CogDataAnalysisTool dataAnalysisTool)
        {
            dataAnalysisTool.RunParams.ResetBufferedValues();
            dataAnalysisTool.RunParams.ResetRunningStatistics();
        }
    }
    
    • 遍历工具组中的所有工具,重置数据分析工具的缓冲值和运行统计信息。
  8. 开始测试

    button1.Text = "停止运行";
    mTestInProgress = true;
    
    • 更新按钮文本为“停止运行”,并将 mTestInProgress 设置为 true
  9. 处理图像

    long numProcessed = 0;
    do
    {
        this.Text = $"{TItle}({numProcessed}) of {imageFileTool.Operator.Count}";
        toolGroup.Run();
        numProcessed++;
    
        ListViewItem newItem = new ListViewItem((numProcessed - 1).ToString());
        // 添加处理时间和结果到 ListView
        ...
        listView1.Items.Add(newItem);
        UpdateTotals();
        Application.DoEvents();
    } while (mTestInProgress && imageFileTool.CurrentImageIndex < imageFileTool.Operator.Count - 1);
    
    • 使用 do-while 循环处理图像,更新窗口标题以显示处理状态。每次处理后将结果添加到 listView1 中,并更新统计信息。
  10. 结束测试

    button1.Text = "运行";
    mTestInProgress = false;
    this.Text = TItle;
    
    • 更新按钮文本为“运行”,将 mTestInProgress 设置为 false,并重置窗口标题。
  11. 异常处理

    catch (CogException ex)
    {
        MessageBox.Show(ex.Message);
    }
    catch (Exception gex)
    {
        MessageBox.Show(gex.Message);
    }
    
    • 捕捉 CogException 和一般的 Exception,并显示相应的错误消息。

5. ListView事件处理

这段代码包含三个事件处理程序,主要用于处理 ListView 控件中的特定用户交互。下面是对每个方法的详细解释:

  1. listView1_BeforeLabelEdit
private void listView1_BeforeLabelEdit(object sender, LabelEditEventArgs e)
{
    e.CancelEdit = true;
}
  • 目的:此方法在用户尝试编辑 ListView 控件中的标签(即项目名称)之前触发。
  • 参数
    • sender:触发事件的对象,通常是 listView1
    • e:包含事件数据的 LabelEditEventArgs 对象。
  • 逻辑
    • 通过设置 e.CancelEdit = true;,此方法阻止用户编辑 ListView 项目的名称。这意味着用户无法更改 ListView 中项目的标签。
  1. listView1_ColumnClick
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
    if (listView1.Sorting == SortOrder.Ascending || listView1.Sorting == SortOrder.None)
    {
        listView1.Sorting = SortOrder.Descending;
    }
    else
    {
        listView1.Sorting = SortOrder.Ascending;
    }
}
  • 目的:此方法在用户点击 ListView 的列标题时触发,目的是切换排序顺序。
  • 参数
    • sender:触发事件的对象,通常是 listView1
    • e:包含事件数据的 ColumnClickEventArgs 对象,提供有关单击的列的信息。
  • 逻辑
    • 检查当前的排序状态:
      • 如果当前排序为升序(SortOrder.Ascending)或没有排序(SortOrder.None),则将排序状态切换为降序(SortOrder.Descending)。
      • 如果当前排序为降序,则将排序状态切换为升序(SortOrder.Ascending)。
    • 这种实现允许用户通过单击列标题来快速切换排序方式。
  1. listView1_ItemActivate
private void listView1_ItemActivate(object sender, EventArgs e)
{
    if (mTestInProgress)
    {
        return;
    }

    CogToolGroup toolGroup = cogToolGroupEditV21.Subject;
    CogImageFileTool imageFileTool = null;
    for (int i = 0; i < toolGroup.Tools.Count; i++)
    {
        if (toolGroup.Tools[i] is CogImageFileTool)
        {
            imageFileTool = (CogImageFileTool)toolGroup.Tools[i];
            imageFileTool.NextImageIndex = int.Parse(listView1.SelectedItems[0].SubItems[0].Text);
        }
    }

    toolGroup.Run();
}
  • 目的:此方法在用户激活(单击)ListView 中的某个项目时触发。
  • 参数
    • sender:触发事件的对象,通常是 listView1
    • e:包含事件数据的 EventArgs 对象。
  • 逻辑
    • 首先检查是否有测试正在进行(mTestInProgress)。如果是,则直接返回,不执行后续操作。
    • 获取当前的工具组 toolGroup
    • 遍历工具组中的所有工具,寻找类型为 CogImageFileTool 的工具。
      • 一旦找到,设置其 NextImageIndex 为用户在 ListView 中选择的项目的索引。这个索引是通过解析所选项目的第一个子项(通常是图像索引)来获取的。
    • 调用 toolGroup.Run() 来运行工具组,处理新的图像。

6. 添加工具

运行程序,在CogToolGroup控件添加CogImageFileTool,CogIDTool,CogDataAnalysisTool工具,并连线

在这里插入图片描述

  1. 图片选择C:\Program Files\Cognex\VisionPro\Images\barcode.cdb使用.
  2. 运行图片文件可知,至少2个条码,最多4个.因此CogDataAnalysisTool工具设置拒绝下限为0,警告下限为1.

7. 界面效果

运行项目,发现所有条码均已检测到,listView和计数器均正常显示结果.
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

到这里,使用C#和CogToolGroup控件进行二次开发进行图像检测就完成了.

8. 项目示例

VisionPro二次开发:使用CogToolGroup控件进行图像检测

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

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

相关文章

Codeforces Pinely Round 4 (Div. 1 + Div. 2) A~G

A.Maximize the Last Element&#xff08;枚举&#xff09; 题意&#xff1a; 给你一个由 n n n个整数组成的数组 a a a&#xff0c;其中 n n n是奇数。 在一次操作中&#xff0c;你将从数组 a a a中删除两个相邻的元素&#xff0c;然后将数组的剩余部分连接起来。例如&…

轻松构建Electron应用:TypeScript与esbuild的完美搭档

简介 使用 TypeScript (TS) 编写 Electron 应用程序带来了许多好处&#xff0c;以下是一些主要优势&#xff1a; 类型安全&#xff1a;TypeScript 是一种静态类型语言&#xff0c;它在编译时检查类型错误&#xff0c;这有助于在开发过程中及早发现潜在的错误。更好的工具支持…

RK3568平台(背光篇)背光调试常见问题

一.屏幕背光概述 背光就是屏幕的从里往照射的光。 LCD 主要由液晶面板、背光、驱动电路等组成&#xff0c;液晶面板不会主动发光&#xff0c;需要背光源才能显示&#xff0c;液晶面板的作用就是通过电压改变某像素光的透过率来显示的&#xff0c;当然此光要求是偏振光&#x…

数据结构(5.5_3)——并查集的进一步优化

Find操作的优化(压缩路径) 压缩路径——Find操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点下 代码&#xff1a; //Find "查"操作优化&#xff0c;先找到根节点&#xff0c;再进行"路径压缩" int Find(int S[], int x) {…

Shell、C/C++、Python操作环境变量

环境变量 环境变量是一种在操作系统中用于存储信息的机制&#xff0c;这些信息可以被系统进程、应用程序和脚本访问和使用。环境变量在操作系统中的作用类似于一个全局配置参数&#xff0c;它们定义了操作系统的运行环境&#xff0c;包括系统行为、应用程序路径、用户信息等。…

uniapp自定义浮动图标、列表布局

uniapp自定义浮动图标 <button class="fab" @click="goPage"><image src="../../../static/yiyuan.png" mode="" style="width: 60rpx;height:60rpx;"></image></button>.fab {z-index: 100;positi…

TLE4966-3G带方向检测功能的高灵敏度汽车霍尔开关

TLE4966-3G是一款集成电路双霍尔效应传感器&#xff0c;专为使用旋转极轮的高精度应用而设计。通过片上有源补偿电路和斩波器技术实现精确的磁切换点和高温稳定性。 该传感器在Q2提供速度输出&#xff0c;其状态&#xff08;高或低&#xff09;与磁场值相对应。对于超过阈值BO…

小白零基础学数学建模系列-Day3-线性回归模型的构建与评估

文章目录 1 线性回归基础1.1 线性回归概念与应用1.2 数学原理与推导1.3 线性回归的实现 2 案例分析&#xff1a;房价预测2.1 加载数据2.2 数据预处理2.3 探索性数据分析2.4 观察选择特征2.5 准备训练模型的数据2.6 将数据拆分为训练集和测试集2.7 训练和测试模型2.8 模型评估 3…

Ubuntu每次登录都提示有新的更新,apt更新却0个软件需要升级:清空MOTD消息 安装update-notifier-common组件 运行强制更新脚本

问题 每登录ubuntu&#xff0c;都会显示有更新需要注意。 80更新可以立即应用。 这些更新中有 1 个是标准安全更新。 要查看这些附加更新&#xff0c;请运行&#xff1a;apt list --upgradable 然而使用更新命令却提示0可更新 查询了一下&#xff0c;这似乎是MOTD的错误&#x…

Gartner发布2024年网络风险管理成熟度曲线:使网络安全战略与业务目标保持一致的概念、方法、流程和技术

网络风险管理现在是高管和监管机构最关注的问题&#xff0c;它采用多种方法和技术来支持治理、风险管理和合规性。安全和风险管理领导者可以使用此技术成熟度曲线来评估解决方案并做出适当的采用决策。 战略规划假设 到 2026 年&#xff0c;60% 的网络安全职能将实施以业务影响…

【Qt】Qt编程注意事项

目录 Qr中的命名规范 Qt Creator中的快捷键 查询文档的方式 Qt窗口坐标体系 Qr中的命名规范 在学习编程语言阶段&#xff0c;给变量、函数、文件、类命名是非常有讲究的。 命名要有描述性&#xff0c;不要使用abc&#xff0c;xyz这种比较无规律的名字类描述。如果名字比较…

什么是前端微服务,有何优势

随着互联网技术的发展&#xff0c;传统的单体应用架构已经无法满足复杂业务场景的需求。微服务架构的兴起为后端应用的开发和部署提供了灵活性和可扩展性。与此同时&#xff0c;前端开发也经历了类似的演变&#xff0c;前端微服务作为一种新兴的架构模式应运而生。 一、前端微服…

开源web版3D展示工具Online3DViewer

Online3DViewer是一个免费且开源的Web解决方案&#xff0c;它允许用户在浏览器中直接预览和探索3D模型。 以下是关于Online3DViewer的详细介绍&#xff1a; 一、基本概述 定义&#xff1a;Online3DViewer是一个在线3D模型查看器&#xff0c;支持多种3D文件格式&#xff0c;用…

如何评价2023年数学建模国赛?

2023年的赛题已经发布了,ABC三题侧重点不同,但是A题专业性较强,涉及微分方程,以及优化模型,B题题目为多波束测线问题,第一问需要计算,结合函数和几何的相关知识点,问题2涉及到最小路径问题,如下有总结,可以查看相应的模块方法,C题目为“蔬菜类商品的自动定价与补货决…

C++ 哈希使用与底层原理

哈希的概念 哈希是一种建立映射的思想&#xff0c;我们尝试用的数据结构是哈希表 &#xff0c;又称「散列表」&#xff0c;其通过建立键 key 与值 value 之间的映射&#xff0c;实现高效的元素查询。具 体而言&#xff0c;我们向哈希表输入一个键 key &#xff0c;则可以在 &am…

Docker③_VMware虚拟机和Docker的备份与恢复

目录 1. VMware虚拟机的快照备份 1.1 VMware本机的快照备份 1.2 VMware快照备份到另一电脑 2. Docker知识点 2.1 Docker镜像和容器的关系 2.2 Docker的存储卷 2.3 Docker命令简介 2.4 删除Anylink镜像 3. Docker备份和恢复 3.1 确定要回滚的容器和版本 3.2 备份当前…

【C语言-扫雷游戏】mineweeper【未完成】

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

psychopy stroop 实验设计

斯特鲁stroop实验就是色词一致/不一致实验。 设计步骤如下&#xff1a; 1. 先去设置中将Input改为PsychToolbox&#xff0c; 2. 然后左上角File-New新建一个 3. 右键trial&#xff0c;rename改名 改成自己想要的名字即可&#xff0c;比如欢迎界面welcome。 4. 接下来添加提示语…

老阳推荐的temu选品师项目能不能做成?

在不断变化的电商领域&#xff0c;temU选品师项目作为一种新兴职业&#xff0c;受到了越来越多的关注。老阳的推荐使得这一项目引起了不少人的兴趣&#xff0c;那么&#xff0c;temU选品师项目究竟能否成功呢?让我们从一个新的角度来探讨这一问题。 新兴市场的机遇与挑战 temU…

C语言 ——— 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串

目录 题目要求 代码思路 代码实现 题目要求 写一个函数&#xff0c;判断一个字符串是否为另外一个字符串旋转之后的字符串 例如 s1 "AABCD" &#xff1b;s2 "BCDAA" &#xff0c;返回1 s1 "AABcd" &#xff1b;s2 "BCDAA" …