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

【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.dtcms.com/a/316934.html

相关文章:

  • 【运维部署篇】OpenShift:企业级容器应用平台全面解析
  • 跑yolov5的train.py时,ImportError: Failed to initialize: Bad git executable.
  • Android 之 Kotlin中的kapt
  • io_uring系统调用及示例
  • Houdini Pyro学习笔记
  • [数组]977.有序数组的平方;209.长度最小的子数组
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-邮箱重置密码
  • 数据结构——双向链表
  • 【学习嵌入式day-17-数据结构-单向链表/双向链表】
  • C语言:预处理、 库文件、 文件IO
  • Python深度学习:从入门到进阶
  • GPT-1、GPT-2、GPT-3 的区别和联系
  • C语言基础_IDE、进制转换、基本数据类型、输入输出函数、运算符
  • 一文搞定JavaServerPages基础,从0开始写一个登录与人数统计页面
  • 模拟面试总结
  • JSP相关Bug解决
  • Vue.js 教程
  • 市场与销售协同:CRM如何打破部门数据孤岛?
  • 思途Mybatis学习 0805
  • 一个小巧神奇的 USB数据线检测仪
  • LabVIEW 2025 安装攻略(附图文教程)适用于测试与自动控制领域
  • 亚马逊广告进阶指南:大词 VS 长尾词
  • 数据结构2.(双向链表,循环链表及内核链表)
  • 怎么在公司存活下去
  • SAP FI模块凭证增强逻辑的策略
  • 飞算 JavaAI:开启 Java 开发智能自动化新时代
  • open3d python 鞋底点云点胶路径识别
  • windows 系统装机入职版
  • Java 模版进阶
  • C#案例实战