VisionPro二次开发学习笔记12-使用CogToolGroup控件进行图像检测
本示例演示了如何通过图像数据库使用 CogImageFileTool,并将其放入 CogToolGroup 中,对于数据库中的每个图像运行一次检测.
当用户按下 RunTest 按钮时,程序执行以下操作:
如果工具组中没有 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. 运行按钮事件处理
-
try-catch 块:
- 代码的主要逻辑放在
try块中,目的是捕捉在执行过程中可能出现的异常。catch块用于处理特定类型的异常(如CogException和一般的Exception),并显示相应的错误信息。
- 代码的主要逻辑放在
-
测试进行状态检查:
if (mTestInProgress) {mTestInProgress = false;return; }- 检查是否有测试正在进行。如果有,则将
mTestInProgress设置为false并返回,停止当前操作。
- 检查是否有测试正在进行。如果有,则将
-
工具组初始化:
toolGroup = cogToolGroupEditV21.Subject;- 从
cogToolGroupEditV21获取当前的工具组。
- 从
-
重置统计计数器:
mAccept = 0; mWarn = 0; mReject = 0; mError = 0; UpdateTotals(); listView1.Items.Clear(); listView1.Activation = ItemActivation.OneClick;- 初始化接受、警告、拒绝和错误的计数器,并更新总计。清空
listView1的项目,并设置激活模式为单击。
- 初始化接受、警告、拒绝和错误的计数器,并更新总计。清空
-
重置图像工具:
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(即第一张图片)。
- 遍历工具组中的所有工具,查找
-
工具有效性检查:
- 检查
imageFileTool是否为null,确保工具组至少有一个图像文件工具。 - 检查
imageFileTool.Operator.Count,确保工具有可处理的图像文件。 - 检查
imageFileTool.ImageIndexIncrement,确保图像索引增量非零。
- 检查
-
重置数据分析工具的参数:
foreach (var item in toolGroup.Tools) {if (item is CogDataAnalysisTool dataAnalysisTool){dataAnalysisTool.RunParams.ResetBufferedValues();dataAnalysisTool.RunParams.ResetRunningStatistics();} }- 遍历工具组中的所有工具,重置数据分析工具的缓冲值和运行统计信息。
-
开始测试:
button1.Text = "停止运行"; mTestInProgress = true;- 更新按钮文本为“停止运行”,并将
mTestInProgress设置为true。
- 更新按钮文本为“停止运行”,并将
-
处理图像:
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中,并更新统计信息。
- 使用
-
结束测试:
button1.Text = "运行"; mTestInProgress = false; this.Text = TItle;- 更新按钮文本为“运行”,将
mTestInProgress设置为false,并重置窗口标题。
- 更新按钮文本为“运行”,将
-
异常处理:
catch (CogException ex) {MessageBox.Show(ex.Message); } catch (Exception gex) {MessageBox.Show(gex.Message); }- 捕捉
CogException和一般的Exception,并显示相应的错误消息。
- 捕捉
5. ListView事件处理
这段代码包含三个事件处理程序,主要用于处理 ListView 控件中的特定用户交互。下面是对每个方法的详细解释:
listView1_BeforeLabelEdit
private void listView1_BeforeLabelEdit(object sender, LabelEditEventArgs e)
{e.CancelEdit = true;
}
- 目的:此方法在用户尝试编辑
ListView控件中的标签(即项目名称)之前触发。 - 参数:
sender:触发事件的对象,通常是listView1。e:包含事件数据的LabelEditEventArgs对象。
- 逻辑:
- 通过设置
e.CancelEdit = true;,此方法阻止用户编辑ListView项目的名称。这意味着用户无法更改ListView中项目的标签。
- 通过设置
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)。
- 如果当前排序为升序(
- 这种实现允许用户通过单击列标题来快速切换排序方式。
- 检查当前的排序状态:
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工具,并连线

- 图片选择C:\Program Files\Cognex\VisionPro\Images\barcode.cdb使用.
- 运行图片文件可知,至少2个条码,最多4个.因此CogDataAnalysisTool工具设置拒绝下限为0,警告下限为1.
7. 界面效果
运行项目,发现所有条码均已检测到,listView和计数器均正常显示结果.



到这里,使用C#和CogToolGroup控件进行二次开发进行图像检测就完成了.
相关文章:
VisionPro二次开发学习笔记12-使用CogToolGroup控件进行图像检测
本示例演示了如何通过图像数据库使用 CogImageFileTool,并将其放入 CogToolGroup 中,对于数据库中的每个图像运行一次检测. 当用户按下 RunTest 按钮时,程序执行以下操作: 如果工具组中没有 CogImageFileTools,它将显…...
mfc140u.dll丢失的科学修复手段,简单又方便的mfc140u.dll修复
遇到 "缺失 mfc140u.dll 文件" 的提示时可能会让你疑惑,但不用担心。这个文件是 Microsoft Visual C 2015 的重要组成部分,对运行特定程序非常关键。幸运的是,解决这一问题并不难。本文将简单指导你如何恢复或修复丢失的 mfc140u.d…...
RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别
文章目录 一、kafka和rabbitmq全面对比分析1.1 简介1.2 kafka和rabbitmq全面对比分析1.3 影响因素 二、RabbitMQ、Kafka主要区别2.1 详解/主要区别2.1.1 设计目标和适用场景2.1.2 架构模型方面2.1.3 吞吐量和性能2.1.4 消息存储和持久化2.1.5 消息传递保证2.1.6 集群负载均衡方…...
【案例35】销售订单公式问题导致系统宕机
问题现象 经过顾问反馈,发现系统现在出现卡顿,NCC一直在转圈。 问题分析 远程排查,发现在服务器从机上defalut-7发生了内存溢出,宕机。 生成了宕机日志。分析结果如下: 销售订单相关操作,vo太多了导致…...
编程-设计模式 4:建造者模式
设计模式 4:建造者模式 定义与目的 定义:建造者模式将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。目的:该模式主要用于创建复杂对象时,这些对象的创建过程可能涉及多个步骤,…...
百度文心一言API调用,千帆大模型获取API Key和API Secret图解
百度文心一言大模型调用教程,获取文心一言API Key和API Secret的方法,码笔记mabiji.com告诉大家在百度智能云的千帆大模型平台创建应用,即可获取文心一言的API Key和API Secret,详细流程如下: 1、在百度智能云的千帆大…...
kafka下载|安装
1、下载kafka https://kafka.apache.org/downloads 2、安装kafka 解压下载的kafka安装包即可 tar -xvf kafka_2.13-3.7.0.tgz -C /usr/local/3、查看kafka目录 bin目录:存放了脚本 config目录:主要存放了配置文件...
贪心算法part03
134 加油站 在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 如果你可以绕环路行…...
以树莓集团的视角:探索AI技术如何重塑数字媒体产业发展
在科技日新月异的今天,AI技术如同一股不可阻挡的潮流,正深刻改变着我们的世界,尤其是数字媒体产业发展。作为数字产业生态链的杰出建设者,树莓集团始终站在时代前沿,积极探索AI技术如何为数字媒体产业注入新活力。 在树…...
package.json的 和 的区别,以及|| 和 | 的区别
在 package.json 文件中的 scripts 字段里,&& 和 & 用于连接不同的命令,它们的区别在于命令执行的方式和效果: &&: 用于串联两个命令,第一个命令成功(退出码为 0)后&#x…...
Wireshark_DNS_v7.0
Wireshark_DNS_v7.0 一、 nslookup 前置 nslookup 是一个网络命令行工具,用于查询域名系统(DNS)中的域名解析记录。通过使用 nslookup,你可以获取某个域名的IP地址,或者获取与某个IP地址关联的域名信息。 查看域名…...
阿里云的CentOS系统上安装Docker
在阿里云的CentOS系统上安装Docker的详细步骤如下: 一、前置条件 确保系统内核版本:Docker要求CentOS系统的内核版本高于3.10。你可以通过执行uname -r命令来查看当前系统的内核版本。卸载旧版本的Docker(如果已安装)࿱…...
力扣面试经典100题
进阶,其他解法 数组 88. 合并两个有序数组 - 力扣(LeetCode) 1、按非递减顺序合并两个数组 从末尾开始,用while分没到两个数组头,到第一个数组头,到第二个数组头三种情况 class Solution { public:voi…...
python打怪练习
1. 求一个数的幂值 def mi(a, b):c afor i in range(b-1):a a * creturn aprint(mi(2, 4))2. 输出斐波那契数列 def feibonaqi(n):l []a 1b 1for i in range(n):l.append(a)l.append(b)a b ab a bprint(l)feibonaqi(5)3. 输出特定字典数据 keys [name, old, score…...
excel下载模板,0KB或者乱码问题
Sptingboot项目 — maven打包,云效,docker,k8s 场景 — 导出excel模板 问题 1.乱码 2.下载为0KB,打开没有数据 模板内容 测试代码 测试方法 方法过程结果问题原因将文件直接放到服务器使用接口下载数据正常,排除文件问题排…...
JDBC连接Mysql数据库超详细讲解
JDBC连接Mysql数据库 如何导入驱动jar包 进入mysql官网 – https://www.mysql.com/ 点击下载找到方框内选项 点击 在项目文件夹创建lib文件 , 将下载好的驱动器导入 , 再添加到项目即可 步骤一:注册JDBC驱动 在Java中,要与数据库进行交互&…...
ArcGIS基础:自定义创建点线面等样式符号以方便使用
有时,使用ArcGIS自带的符号样式库无法满足我们使用要求,还需要进行调整,可能会浪费一些时间,那么自己新建一些样式符号备用, 需要的时候直接使用,会节省很多时间,大家学会之后,对学…...
蔚来2025届全球校招笔试/测评通关攻略北森测评题库更新了!
蔚来2025届全球校园招聘笔试/测评攻略 尊敬的各位考生,蔚来汽车2025届全球校园招聘笔试/测评环节即将开启。为了帮助您更好地准备并顺利通过这一环节,我们特此提供以下详细攻略。 一、考前准备 确认考试时间:请务必在截止日期前完成考试&am…...
如何在linux系统上部署Redis
<1>简介 Redis 全称 Remote Dictionary Server(远程字典服务器),是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务…...
操作系统开发行业的市场需求分析
操作系统作为计算机软件生态的核心,其开发不仅关乎技术的深度与广度,更与市场需求紧密相连。随着技术的不断进步和各行各业对数字化转型的迫切需求,操作系统开发行业面临着日益复杂且多样化的市场需求。以下从基础功能需求、技术创新需求、行…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
C++中string流知识详解和示例
一、概览与类体系 C 提供三种基于内存字符串的流,定义在 <sstream> 中: std::istringstream:输入流,从已有字符串中读取并解析。std::ostringstream:输出流,向内部缓冲区写入内容,最终取…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
