当前位置: 首页 > news >正文

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. 运行按钮事件处理

  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控件进行二次开发进行图像检测就完成了.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 五. TensorRT API的基本使用-custom-trt-plugin
  • js入门经典学习小结
  • 【Python】PyWebIO 初体验:用 Python 写网页
  • 006 | 资本资产定价模型 (CAPM)
  • MySQL学习(20):InnoDB引擎逻辑架构、物理架构
  • Unity入门2——编辑器常用功能
  • 投资 - 什么叫有资金托底
  • 当node节点kubectl 命令无法连接到 Kubernetes API 服务器
  • k8s创建secret并在container中获取secret
  • Spring框架面试总结
  • java最强本地缓存-Caffeine
  • 「数组」随机快速选择 / LeetCode LCR 076(C++)
  • VMWare虚拟机磁盘扩容
  • 【langchain学习】使用LangChain创建具有上下文感知的问答系统
  • 微服务-分布式事务-seata
  • 《剑指offer》分解让复杂问题更简单
  • 【347天】每日项目总结系列085(2018.01.18)
  • 【译】理解JavaScript:new 关键字
  • CODING 缺陷管理功能正式开始公测
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Laravel 中的一个后期静态绑定
  • 关于Flux,Vuex,Redux的思考
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 浅谈web中前端模板引擎的使用
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #QT项目实战(天气预报)
  • #单片机(TB6600驱动42步进电机)
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • $forceUpdate()函数
  • (1)SpringCloud 整合Python
  • (1)svelte 教程:hello world
  • (4)Elastix图像配准:3D图像
  • (java)关于Thread的挂起和恢复
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (十三)MipMap
  • (十一)c52学习之旅-动态数码管
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .NET 的程序集加载上下文
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .Net 知识杂记
  • .NET/C# 的字符串暂存池
  • .NET技术成长路线架构图
  • .net中调用windows performance记录性能信息
  • /3GB和/USERVA开关
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • @RequestBody的使用
  • []常用AT命令解释()
  • [2]十道算法题【Java实现】