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

【C# Winform】 Action事件驱动的多层数据传递

目录

一、概述

1.1原理

1.2 核心概念

1.3实现步骤

二、代码实现

2.1类函数

2.1.1 ImageProducer.cs

2.1.2 ImageRelay.cs

2.1.3 ImageConsumer.cs

2.2winform窗体函数

三、实现效果​编辑

四、项目资源下载


C# Winform实战案列(机器视觉)汇总地址:

【C# Winform】 机器视觉实战案例专栏汇总地址


一、概述

        近期需要用到c#及halcon算法的联合调用,在进行算法封装时,需要进行多个算法类的封装,需要将相机采集的图像通过Action事件将HImage数据在多个类里面进行传递。

1.1原理

        使用 Action 委托进行多次照片的传递,这可以统称为 事件驱动的多层数据传递(或事件驱动的消息传递)

        本次项目案列通过 Action 委托和事件机制,图像数据被从源(ImageProducer)传递到中继(ImageRelay)再到最终的消费者(ImageConsumer),形成一个 事件驱动的数据流。最后会将ImageProducer的图像,经过两次传递然后显示到Halcon的显示空间

1.2 核心概念

  1. 事件(Event):通过 Action<HObject> 事件定义,允许不同的对象订阅和响应事件。

  2. 委托(Delegate)Action 是一个委托,它指向处理方法,用来响应事件触发。

  3. 数据传递(Data Passing):图像数据(如 HObject)在各个环节之间通过事件进行传递,无需直接传递引用,保证了松耦合。

1.3实现步骤

  1. 图像生产者(ImageProducer)

    • 负责采集或生成图像。

    • 当图像生成时,触发 OnImageCaptured 事件,通过 Invoke 向订阅者传递图像。

  2. 中继(ImageRelay)

    1. 订阅图像生成事件,接收图像。

    2. 可以在此进行数据处理或日志记录。

    3. 将图像通过 OnImageRelayed 事件转发给下一个订阅者。

  3. 图像消费者(ImageConsumer)

    1. 订阅 OnImageRelayed 事件,接收并处理图像(如显示或保存图像)

二、代码实现

2.1类函数

2.1.1 ImageProducer.cs

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpStudy
{public class ImageProducer{public Action<HObject> OnImageCaptured;public void CaptureImage(){HObject ho_Image = new HObject();// 生成一个空图像HOperatorSet.GenImageConst(out ho_Image, "byte", 512, 512);// 创建一个有效区域(例如一个矩形区域)HObject ho_Region = new HObject();HOperatorSet.GenRectangle1(out ho_Region, 100, 100, 400, 400); // 生成一个矩形区域// 在图像中绘制区域(填充颜色)HOperatorSet.PaintRegion(ho_Region, ho_Image, out ho_Image, 255, "fill"); // 填充矩形区域OnImageCaptured?.Invoke(ho_Image);}}}

2.1.2 ImageRelay.cs

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CSharpStudy
{public class ImageRelay{public Action<HObject> OnImageRelayed;public void Subscribe(ImageProducer producer){producer.OnImageCaptured += HandleImage;}private void HandleImage(HObject image){Console.WriteLine("中继收到图像,准备转发...");OnImageRelayed?.Invoke(image);}}
}

2.1.3 ImageConsumer.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HalconDotNet;namespace CSharpStudy
{public class ImageConsumer{private HSmartWindowControl window;public ImageConsumer(HSmartWindowControl winControl){window = winControl;}public void Subscribe(ImageRelay relay){relay.OnImageRelayed += ShowImage;}private void ShowImage(HObject image){HImage hImage = new HImage(image);hImage.WriteImage("tiff", 0, "output_image.tiff");window.HalconWindow.ClearWindow();window.HalconWindow.DispObj(hImage);window.SetFullImagePart();}}}

2.2winform窗体函数

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using HalconDotNet;
namespace CSharpStudy
{public partial class Form1 : Form{private ImageProducer producer;private ImageRelay relay;private ImageConsumer consumer;public Form1(){InitializeComponent();hSmartWindowControl1.MouseWheel += hSmartWindowControl1.HSmartWindowControl_MouseWheel;producer = new ImageProducer();relay = new ImageRelay();consumer = new ImageConsumer(hSmartWindowControl1); // 控件名// 事件连接relay.Subscribe(producer);consumer.Subscribe(relay);}private void button1_Click(object sender, EventArgs e){producer.CaptureImage();}}
}

三、实现效果


四、项目资源下载

http://www.xdnf.cn/news/17019.html

相关文章:

  • 8.5PPT总结各种攻击
  • 37.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--增加Github Action
  • Linux NFS 服务部署、客户端配置及 autofs 自动挂载操作指南
  • 嵌入式硬件中运放内部底层分析
  • 区块链:重构信任的价值互联网革命​
  • CNN卷积神经网络之注意力机制CBAM(六)
  • 【android bluetooth 协议分析 01】【HCI 层介绍 30】【hci_event和le_meta_event如何上报到btu层】
  • uniapp Android App集成支付宝的扫码组件mPaaS
  • Linux 内存管理之 Rmap 反向映射(二)
  • Kafka-Eagle 安装
  • 江协科技STM32学习笔记1
  • AlexNet训练和测试FashionMNIST数据集
  • 什么是越权漏洞?如何验证。
  • c++介绍
  • cJSON库应用
  • Python高级编程与实践:Python装饰器深入解析与应用
  • 【数据结构初阶】--排序(三):冒泡排序,快速排序
  • BeeWorks私有化即时通讯,局域网办公安全可控
  • Python基础框架
  • 改进的BP神经网络算法用于预测温度值的变化
  • 剑指offer第2版:字符串
  • jenkins插件Active Choices的使用通过参数动态控制多选参数的选项
  • java web 未完成项目,本来想做个超市管理系统,前端技术还没学。前端是个简单的html。后端接口比较完善。
  • mq_timedsend系统调用及示例
  • 朴素贝叶斯(Naive Bayes)算法详解
  • 使用 ECharts 实现小区住户数量统计柱状图
  • 豆包新模型与 PromptPilot 实操体验测评,AI 辅助创作的新范式探索
  • 涨薪技术|Kubernetes(k8s)之Pod生命周期(上)
  • 山东省天地图API申请并加载到QGIS和ArcGIS Pro中
  • pyspark中的kafka的读和写案例操作