VisionPro二次开发学习笔记9-使用 CogRecordDisplay控件

news2024/11/15 20:26:33

使用 CogRecordDisplay控件

这个示例展示了如何使用 CogRecordDisplay 在表单上显示 Blob Tool 的 LastRunRecord 图形。
它还演示了如何通过 BlobTool 的 LastRunRecordEnable 属性有选择性地启用或禁用不同的图形特性。这个模式可以应用于所有 VisionPro 工具。

具体步骤如下:

1. 添加引用

using Cognex.VisionPro;
using Cognex.VisionPro.Blob;
using Cognex.VisionPro.Exceptions;
using Cognex.VisionPro.ImageFile;

2. 界面设计

1. 新建Windows窗体
2. 添加TabControl控件,增加3个Tabpage.
3. tab1添加CogRecordDisplay控件和2个Button按钮,用于显示图像,运行关闭程序,添加GroupBox,增加3个CheckBox.

在这里插入图片描述

4. tab2 添加CogImageFileEditV2控件

在这里插入图片描述

5. tab3 添加CogBlobEditV2控件

在这里插入图片描述

3. 加载图像和视觉工具图形选中状态

        private CogImageFileTool CogImageFileTool;
        private CogBlobTool BlobTool;
        private void InitializeDisplay()
        {
            string sImageFile = Environment.GetEnvironmentVariable("VPRO_ROOT");
            try
            {
                if (sImageFile == "")
                {
                    throw new Exception("环境变量VPRO_ROOT未配置");
                }
                sImageFile += @"\images\bracket_std.idb";

                CogImageFileTool = cogImageFileEditV21.Subject;
                CogImageFileTool.Operator.Open(sImageFile, CogImageFileModeConstants.Read);

                BlobTool = cogBlobEditV21.Subject;
                BlobTool.Changed += BlobTool_Changed;
                BlobTool.Ran += BlobTool_Ran;

                BlobTool.DataBindings.Add("InputImage", CogImageFileTool, "OutputImage");

                CogImageFileTool.Run();
                BlobTool.Run();

                SyncGraphicsControls();
            }
            catch (CogFileOpenException ex)
            {
                DisplayErrorAndExit(ex.GetType().ToString(), "Caught exception:" + ex.Message + Environment.NewLine + "File" + sImageFile + "is not found");
                this.Dispose(true);
            }
            catch (CogException ex)
            {
                DisplayErrorAndExit(ex.GetType().ToString(), "Caught Cognex exception:" + ex.Message);
                this.Dispose(true);
            }
            catch (Exception ex) {
                DisplayErrorAndExit(ex.GetType().ToString(),"Caught System exception:"+ex.Message);
                this.Dispose(true);
            }
        }

        private void DisplayErrorAndExit(string errorType, string message)
        {
            MessageBox.Show(message,"GraphicsRecord",MessageBoxButtons.OK);
            this.Close();
        }

        private void SyncGraphicsControls()
        {
            chkShowBoundingBox.Checked = (BlobTool.LastRunRecordEnable & CogBlobLastRunRecordConstants.ResultsBoundingBoxExtremaAngle) != 0;

            chkShowBoundary.Checked = (BlobTool.LastRunRecordEnable & CogBlobLastRunRecordConstants.ResultsBoundary) != 0;

            chkShowCOM.Checked = (BlobTool.LastRunRecordEnable & CogBlobLastRunRecordConstants.ResultsCenterOfMass) != 0;
        }

4. 订阅Blob工具Ran和Change事件

            //处理 Blob 工具运行后的事件。如果运行结果不是接受状态,则显示消息框
            private void BlobTool_Ran(object sender, EventArgs e)
            {
                if (BlobTool.RunStatus.Result!=CogToolResultConstants.Accept)
                {
                    MessageBox.Show(BlobTool.RunStatus.Message,"GraphicsRecord");
                }
            }
            //处理 Blob 工具状态变化的事件 检查是否更新了图形记录。如果更新了,创建最后一次运行记录并更新显示
            private void BlobTool_Changed(object sender, Cognex.VisionPro.CogChangedEventArgs e)
            {
                bool GraphicsRecordUpdated = false;

                if ((e.StateFlags & CogBlobTool.SfLastRunRecordEnable)!=0)
                {
                    SyncGraphicsControls();
                    GraphicsRecordUpdated = true;
                }

                if ((e.StateFlags & CogBlobTool.SfCreateLastRunRecord) != 0) {
                    GraphicsRecordUpdated = true;
                }

                if (GraphicsRecordUpdated)
                {
                    ICogRecord lastRunRecord = BlobTool.CreateLastRunRecord();

                    if (lastRunRecord!=null && lastRunRecord.SubRecords.ContainsKey("InputImage"))
                    {
                        cogRecordDisplay1.Record = lastRunRecord.SubRecords["InputImage"];
                        cogRecordDisplay1.Fit(true);
                    }
                    else
                    {
                        cogRecordDisplay1.Record = null;
                    }
                }
            }

5. 处理按钮点击事件

        private void button1_Click(object sender, EventArgs e)
            {
                if (CogImageFileTool!=null)
                {
                    CogImageFileTool.Run();
                }
                if (BlobTool!=null)
                {
                    BlobTool.Run();
                }
            }

            private void button2_Click(object sender, EventArgs e)
            {
                this.Close();
            }

6. 处理视觉工具图形选择改变事件

        private void chkShowBoundingBox_CheckedChanged(object sender, EventArgs e)
            {
                SetLastRunRecordEnableFlag(chkShowBoundingBox.Checked,CogBlobLastRunRecordConstants.ResultsBoundingBoxExtremaAngle);
            }

            

            private void chkShowBoundary_CheckedChanged(object sender, EventArgs e)
            {
                SetLastRunRecordEnableFlag(chkShowBoundary.Checked,CogBlobLastRunRecordConstants.ResultsBoundary);
            }

            private void chkShowCOM_CheckedChanged(object sender, EventArgs e)
            {
                SetLastRunRecordEnableFlag(chkShowCOM.Checked,CogBlobLastRunRecordConstants.ResultsCenterOfMass);
            }
            //当复选框的状态变化时,调用SetLastRunRecordEnableFlag方法更新 Blob 工具的图形记录启用标志。
            //SetLastRunRecordEnableFlag方法根据复选框的选中状态启用或禁用 Blob 工具的特定图形特性
            private void SetLastRunRecordEnableFlag(bool enabled, CogBlobLastRunRecordConstants flag)
            {
                if (enabled)
                {
                    BlobTool.LastRunRecordEnable |= flag;

                }
                else
                {
                    BlobTool.LastRunRecordEnable &= ~flag;
                }
            }

7. 界面效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

扩展

CogBlobLastRunRecordConstants 是 Cognex VisionPro 框架中定义的一组常量,用于指示 Blob 工具在运行时生成的图形记录的不同特性。这些常量可以用来启用或禁用特定的图形结果记录,以便在后续的分析或显示中使用。

常见常量

以下是一些可能的 CogBlobLastRunRecordConstants 常量及其说明(具体常量可能根据 Cognex 的版本有所不同):

  1. ResultsBoundingBoxExtremaAngle:

    • 表示生成的图形记录中包含边界框的极值角度信息。
    • 适用于需要显示对象的边界信息的场景。
  2. ResultsBoundary:

    • 表示生成的图形记录中包含边界的详细信息。
    • 可用于在图像上显示检测到的物体的边界轮廓。
  3. ResultsCenterOfMass:

    • 表示生成的图形记录中包含对象的质心位置。
    • 在需要分析物体位置或重心的应用中非常有用。

如何使用这些常量

CogBlobLastRunRecordConstants 常量通常在以下场景中使用:

  1. 启用或禁用图形特性:

    • 在用户界面中,可以通过复选框或其他控件让用户选择要显示的图形特性。
    • 根据用户的选择,更新 BlobTool.LastRunRecordEnable 属性。例如:
      if (enabled)
      {
          BlobTool.LastRunRecordEnable |= CogBlobLastRunRecordConstants.ResultsBoundingBoxExtremaAngle;
      }
      else
      {
          BlobTool.LastRunRecordEnable &= ~CogBlobLastRunRecordConstants.ResultsBoundingBoxExtremaAngle;
      }
      
    • 以上代码片段表示如果用户启用边界框特性,就将该常量添加到 LastRunRecordEnable 中;如果用户禁用,则将其移除。
  2. 在图形同步中使用:

    • 当运行 Blob 工具后,可以检查 LastRunRecordEnable 中的标志,以确定哪些图形特性已启用,并相应地更新用户界面的状态(如复选框的选中状态)。
    • 例如:
      chkShowBoundingBox.Checked = (BlobTool.LastRunRecordEnable & CogBlobLastRunRecordConstants.ResultsBoundingBoxExtremaAngle) != 0;
      
  3. 创建和显示图形记录:

    • 在 Blob 工具运行后,可以创建一个最后运行记录并根据启用的特性进行图形显示。
    • 例如:
      ICogRecord lastRunRecord = BlobTool.CreateLastRunRecord();
      // 根据不同的记录信息更新显示
      
    • 通过检查 lastRunRecord 中的特性,可以决定如何在用户界面中呈现结果。

总结

CogBlobLastRunRecordConstants 常量提供了一种灵活的方式来控制 Blob 工具生成的图形记录的特性。通过使用这些常量,可以根据用户的需求来动态调整图形的显示方式,从而增强应用程序的交互性和可用性。

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

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

相关文章

实验25.创建文件

已完成实验 已完成实验链接 简介 实验 25. 创建文件 总结 inode 就是文件 i_no 就是 inode 号i_sectors 是块地址数组,表示这个文件的内容是那些块构成的.如果是文件,那么块的内容是文件的内容如果是目录,那么这些块的内容是一个个目录项 dir_entry 目录项 是目录文件的…

思科CCIE最新考证流程

CCIE CCIE,全称Cisco Certified Internetwork Expert,是美国Cisco公司于1993年开始推出的专家级认证考试。被全球公认为IT业最权威的认证,是全球Internetworking领域中最顶级的认证证书。 CCIE方向 CCIE主要有六大方向:企业基础架构Enterp…

JDK源码——Atomic包(一)

包介绍 JDK的atomic包提供了一组原子类,用于多线程环境中的原子操作,确保线程安全和高性能。 Atomic包是Java在并发编程中的重要工具,它利用CAS(Compare-And-Swap)机制保证操作的原子性,同时避免了重量级…

3.Redis数据类型(二)

LIST List 是一个简单的双向链表,支持从两端进行插入和删除操作。 常用命令: lpush/rpush/lrange lpush 插入一个或多个元素到列表的左端。 rpush 插入一个或多个元素到列表的右端。 lrange key start stop 获取元素(前闭后闭&#xff0…

构建可刷卡手持终端,思路与必备元素剖析-SAAS 本地化及未来之窗行业应用跨平台架构

构建可刷卡手持终端,思路与必备元素剖析 一、终端开发必要性 1.终端携带方便,适合空间小,外出 2.可供电,外带设备比较方便 3.大多数终端可以不需要网络独立使用,适合特殊场景 二、终端软件爱基本功能 1.便捷的终端…

Java重修笔记 第三十天 异常

异常的分类 1. Error(错误):Java虚拟机无法解决的致命问题,例如StackOverflowError[栈溢出] 2. Exception(异常):其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性…

【iOS多线程(四)】线程安全+13种锁

线程安全13种锁 线程安全1. 为什么要线程安全出现线程安全的原理解决方法 2. 自旋锁和互斥锁自旋锁(Spin lock)互斥锁两种锁的加锁原理对比两种锁的应用 3. 13种锁1. OSSpinLock (已弃用)2. os_unfair_lock3.pthread_mutex 4. NSLock5. NSRecursiveLock6. NSConditi…

C++ IOStream

IOStream 类流特性 不可赋值和复制缓冲重载了<< >> 状态位 示例 状态位操作函数coutcin getget(s,n)/get(s,n,d):getline otherif(!fs)/while(cin) operator void*()与 operator!()代码示例 File Stream open 函数 文件打开方式 文件读写 读写接口 一次读一个字符…

SpringBoot学习之EasyExcel解析合并单元格(三十九)

本解析主要采用反射来修改EasyExcel 返回的默认数据结构实现。 一、待解析表格 二、依赖 全部pom.xml文件如下,仅作参考: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLo…

LLM - 使用 HuggingFace + Ollama 部署最新大模型 (GGUF 格式 与 Llama 3.1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/141028040 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ollama…

创建一个自己的列表窗口

文章目录 背景&#xff1a;在QT的设计中&#xff0c;对于控件库提供的控件满足不了项目的需求&#xff0c;就像自定义一些控件&#xff0c;本文是自定义一个列表窗口。效果展示 一、创建基本的QT模板&#xff1a;1.创建mainwindow2.创建VerticalTextDelegate 二&#xff1a; 插…

零拷贝的发展历程

零拷贝 零拷贝是指计算机执行 IO 操作时&#xff0c;CPU 不需要将数据从一个存储区域复制到另一个存储区域&#xff0c;从而可以减少上下文切换以及 CPU的拷贝时间。它是一种I/O 操作优化技术。 传统IO的执行流程&#xff1a;传统的 IO 流程&#xff0c;包括 read 读 和 write…

2024.8.08(python)

一、搭建python环境 1、检查是否安装python [rootpython ~]# yum list installed | grep python [rootpython ~]# yum list | grep python3 2、安装python3 [rootpython ~]# yum -y install python3 安装3.12可以使用源码安装 3、查看版本信息 [rootpython ~]# python3 --vers…

C++(类和对象.下)

类型转换 先给出以下代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; class B { private:int _a1; public:B(int a){_a1 a;}void Print() {cout << _a1<< endl;} }; int main() {//实例化对象1B b(1);b.Pri…

video-retalking部署安装,在服务器Ubuntu22.04系统下

video-retalking部署安装&#xff0c;在服务器Ubuntu22.04系统下 一、ubuntu基本环境配置1.更新包列表&#xff1a;2. 安装英伟达显卡驱动2.1 使用wget在命令行下载驱动包2.2 更新软件列表和安装必要软件、依赖2.2 卸载原有驱动2.3 安装驱动2.4 安装CUDA2.5 环境变量配置 二、安…

基于YOLOv10深度学习的交通信号灯检测识别系统【python源码+Pyqt5界面+数据集+训练代码】红绿灯检测、目标检测、人工智能

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

易语言窗口1以及其它子窗口在任务栏显示的方法以及源代码

大家都知道在启动子程序中载入窗口里&#xff0c;窗口就不在任务栏中显示了 用什么办法可以解决这个问题呢 本例程教源码教你如何解决

零拷贝:原理与实现

1. 简介 I/O 或输入/输出通常意味着中央处理器 (CPU) 与外部设备&#xff08;如磁盘、鼠标、键盘等&#xff09;之间的读写。在深入研究零拷贝之前&#xff0c;有必要指出磁盘 I/O&#xff08;包括磁盘设备和其他块导向设备&#xff09;和网络 I/O 之间的区别。 磁盘 I/O 的常…

Vue3简单介绍和快速体验

目录 前言 1. Vue3介绍 1.1 Vue的两个核心功能&#xff1a; 1.2 Vue作者介绍 2. Vue3快速体验(非工程化方式) 2.1 所有代码 2.2 导入js 2.3 一些基本指令 2.4 app对象的创建和挂载 ​ 前言 在学习Vue3之前,自己已经学习过的vue2了,在学习Vue3后还是能感觉到2和3在使用…

媒体资讯视频数据采集-yt-dlp-python实际使用-下载视频

对于视频二创等一些业务场景&#xff0c;可能要采集youtube等的相关媒体视频资源&#xff0c;使用[yt-dlp](https://github.com/yt-dlp/yt-dlp)是一个不错的选择&#xff0c;提供的命令比较丰富&#xff0c;场景比较全面yt-dlp 是一个用 Python 编写的命令行工具&#xff0c;主…