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数据库之一,也被人们称为数据结构服务…...
操作系统开发行业的市场需求分析
操作系统作为计算机软件生态的核心,其开发不仅关乎技术的深度与广度,更与市场需求紧密相连。随着技术的不断进步和各行各业对数字化转型的迫切需求,操作系统开发行业面临着日益复杂且多样化的市场需求。以下从基础功能需求、技术创新需求、行…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...