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数据库之一,也被人们称为数据结构服务…...

操作系统开发行业的市场需求分析
操作系统作为计算机软件生态的核心,其开发不仅关乎技术的深度与广度,更与市场需求紧密相连。随着技术的不断进步和各行各业对数字化转型的迫切需求,操作系统开发行业面临着日益复杂且多样化的市场需求。以下从基础功能需求、技术创新需求、行…...

SpringMVC 的 拦截器
Spring MVC 提供了一套拦截器(Interceptor)机制,主要用于处理 Web 请求到达控制器之前或响应离开控制器之后执行一些操作。拦截器可以用于执行预处理(如验证用户身份)和后处理(如清理资源或修改响应&#x…...

Redisson可重入锁原理(基于黑马视频总结,保姆级)
上一篇文章我们基于redis的set nx ex 命令以及Lua脚本实现了基本的分布式锁,但是还存在一下几点问题。于是又引出了redisson。 为什么基于SETNX的分布式锁无法实现可重入 先在method1中获取锁,获取成功后又调用method2,而method2内部也会获取…...

Ubuntu 安装 Watt-Toolkit
一、下载 Watt-Toolkit 下载Watt-Toolkithttps://steampp.net/download 二、设置 Watt-Toolkit 打开 Watt-Toolkit,点击 “网络加速→加速设置,打开证书文件夹” ,当前证书路径为:/home/yammie/.local/share/Steam/Plugins/Acc…...

python中的省略号(...)
下面对python学习中遇到的省略号做个总结 # 1. 前言 在Python中,一切皆对象,...也是对象,它和对象Ellipsis是等价的。对象...和Ellipsis的类型都是ellipsis,代码示例如下。 print(Ellipsis) # 输出:Ellipsis print(…...

第129天:内网安全-横向移动WmiSmbCrackMapExecProxyChainsImpacket
这里这个环境继续上一篇文章搭建的环境 案例一: 域横向移动-WMI-自带&命令&套件&插件 首先上线win2008 首先提权到system权限 wmic是windows自带的命令,可以通过135端口进行连接利用,只支持明文方式,优点是不用上传别…...

ChatGPT教我将MySQL中where find_in_set改成PostgreSQL支持的写法
问题 之前使用Mybatis,在MySQL中使用如下SQL语句没有问题: SELECT * FROM dept WHERE find_in_set(5,dept_parent);现在切换到PostgreSQL,发现find_in_set函数不能使用。 解决 SELECT * FROM dept WHERE 5 ANY(string_to_array(dept_parent, ,));总…...

Python命令模式:掌控你的代码指令
Python命令模式:掌控你的代码指令 在软件工程的浩瀚海洋中,命令模式(Command Pattern)是一盏指引航向的明灯,它将请求或操作封装成对象,从而让代码更加灵活、可扩展。本文将深入探讨Python中的命令模式&am…...

【物联网】(防水篇)电子产品 IPX7 防水级别测试的具体流程
电子产品 IPX7 防水级别测试的具体流程 1. 准备工作: - 准备一个足够大的浸水箱,确保水深至少为 1 米,以满足 IPX7 测试的标准要求。 - 将水温控制在标准温度范围内,通常在 15-35 摄氏度之间,以模拟正常使用环境。 2…...

Redis 实现消息队列
Redis 实现消息队列 文章目录 Redis 实现消息队列导引1. 基于List结构的消息队列2. 基于PubSub的消息队列3. 基于Stream的消息队列(推荐)3.1 XADD3.2 XREAD3.3 XGROUP 导引 消息队列(Message Queue),从概念上来理解就是用来存放消息的队列,最简单的消息…...

模板初阶(详解)
一、泛型编程 为了引出模板,我们来看下面代码,比如要实现不同类型的交换函数,如下: void Swap(int& a, int& b) {int c a;a b;b c; } void Swap(char& a, char& b) {char c a;a b;b c; } void Swap(doubl…...