WPF+Halcon 培训项目实战(11):HS组件封装

news2024/11/20 0:28:25

文章目录

  • 前言
  • 相关链接
  • 项目专栏
  • 运行环境
  • 匹配图片
  • 封装组件
    • 新增类库项目
    • 选择依赖顺序并添加Nuget
    • 修改原本矩形方法
    • 运行结果:
  • 对矩形进行抽象封装
    • 抽象基类
    • 矩形抽象改造
  • 圆形抽象封装
    • 代码
    • 运行结果

前言

为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。

相关链接

微软系列技术教程 WPF 年度公益课程

Halcon开发 CSDN博客专栏

个人学习的Gitee 项目地址仓库

项目专栏

WPF+Halcon实战项目

运行环境

  • .net core 8.0
  • visual studio 2022
  • halcon HDevelop 20.11
  • windows 11

匹配图片

在这里插入图片描述

封装组件

Halcon官方的代码很多都是基于String的类型判断,我们要对Halcon的代码进行一步简单的封装。

新增类库项目

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

选择依赖顺序并添加Nuget

让我们的WPF主程序依赖于HalconExtension类库

在这里插入图片描述

添加Nuget

在这里插入图片描述

修改原本矩形方法

原来的方法

             // 显示绘制图案
             HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
             // 去除绘制图案
             //HalconWindow.HalconWindow.DetachDrawingObjectFromWindow(rect);

             rect.OnDrag(new HDrawingObject.HDrawingObjectCallbackClass((id, window, type) =>
             {
                 var hv_type = id.GetDrawingObjectParams("type");
                 var row1 = id.GetDrawingObjectParams("row1");
                 var row2 = id.GetDrawingObjectParams("row2");
                 var column1 = id.GetDrawingObjectParams("column1");
                 var column2 = id.GetDrawingObjectParams("column2");
                 //打印坐标
                 NLogHelper.Debug($"拖动事件: {hv_type}:{row1} {column1} {row2} {column2} ");
             }));

现在的方法:

using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    /// <summary>
    /// 矩形封装
    /// </summary>
    public class HRectangleObj
    {
        public HTuple HType { get; private set; }
        public HTuple Row1 { get; private set; }
        public HTuple Row2 { get; private set; }
        public HTuple Column1 { get; private set; }
        public HTuple Column2 { get; private set; }
        public HDrawingObject DrawingObject { get; set; }
        /// <summary>
        /// HS组件主题
        /// </summary>
        public HSmartWindowControlWPF WindowControlWPF { get; set; }


        public Action<HRectangleObj> RefleshCallBack { get; set; }

        /// <summary>
        /// 初始化构造函数
        /// </summary>
        /// <param name="windowControlWPF"></param>
        /// <param name="row1"></param>
        /// <param name="column1"></param>
        /// <param name="row2"></param>
        /// <param name="column2"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControlWPF,HTuple row1,HTuple column1,HTuple row2,HTuple column2)
        {
            WindowControlWPF = windowControlWPF;
            Row1 = row1;
            Column1 = column1;
            Row2 = row2;
            Column2 = column2;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1,Row1,Column1,Row2,Column2);
        }

        /// <summary>
        /// 默认构造函数
        /// </summary>
        /// <param name="windowControl"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControl)
        {
            WindowControlWPF = windowControl;
            Row1 = 0;
            Column1 = 0;
            Row2 = 100;
            Column2 = 100;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, Row1, Column1, Row2, Column2);
            
            //添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }


        /// <summary>
        /// 显示图像
        /// </summary>
        public void Show()
        {
            WindowControlWPF.HalconWindow.AttachDrawingObjectToWindow(DrawingObject);
        }


        /// <summary>
        /// 分离图像
        /// </summary>
        public void Close()
        {
            WindowControlWPF.HalconWindow.DetachDrawingObjectFromWindow(DrawingObject);
        }

        /// <summary>
        /// 序列化输出
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {

            return JsonConvert.SerializeObject(new
            {
                type = HType.ToString(),
                row1 = TwoDecimalPlaces(Row1),
                column1 = TwoDecimalPlaces(Column1),
                row2 = TwoDecimalPlaces(Row2),
                column2 = TwoDecimalPlaces(Column2)
            });
        }

        public void Reflash(HDrawingObject drawid, HWindow window, string type)
        {
            HType = drawid.GetDrawingObjectParams("type");
            Row1 = drawid.GetDrawingObjectParams("row1");
            Row2 = drawid.GetDrawingObjectParams("row2");
            Column1 = drawid.GetDrawingObjectParams("column1");
            Column2 = drawid.GetDrawingObjectParams("column2");

            //将本身回调
            RefleshCallBack(this);
        }

        /// <summary>
        /// 保留两位小数
        /// </summary>
        /// <returns></returns>
        private string TwoDecimalPlaces(HTuple value)
        {
            return decimal.Round(decimal.Parse(value.ToString()), 2).ToString();
        }

    }
}

运行代码

            InitRectangleBtn = new RelayCommand(() =>
            {
                MsgHelper.Info("生成矩形");
                //rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100, 200, 300, 400);


                 显示绘制图案
                //HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);
                 去除绘制图案
                HalconWindow.HalconWindow.DetachDrawingObjectFromWindow(rect);

                //rect.OnDrag(new HDrawingObject.HDrawingObjectCallbackClass((id, window, type) =>
                //{
                //    var hv_type = id.GetDrawingObjectParams("type");
                //    var row1 = id.GetDrawingObjectParams("row1");
                //    var row2 = id.GetDrawingObjectParams("row2");
                //    var column1 = id.GetDrawingObjectParams("column1");
                //    var column2 = id.GetDrawingObjectParams("column2");
                //    //打印坐标
                //    NLogHelper.Debug($"拖动事件: {hv_type}:{row1} {column1} {row2} {column2} ");
                //}));
                //初始化对象
                RectangleObj = new HRectangleObj(HalconWindow);
                //刷新回调里面进行打印
                RectangleObj.RefleshCallBack = (obj) =>
                {
                    NLogHelper.Debug(obj.ToString());
                };
                //显示对象
                RectangleObj.Show();
            });

运行结果:

在这里插入图片描述

对矩形进行抽象封装

抽象就是abstract,简单来说就是认为所有的基类都有相同的函数,比如ToString,Show,Close等。抽象更利于我们的代码的规划。

其实很多语法是程序自己给自己加限制,就是强迫自己按照某个逻辑进行代码开发。典型的例子就是JS转TS。这里不展开说明

抽象基类

using HalconDotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    public abstract class HObjBase
    {
        /// <summary>
        /// HS组件主题
        /// </summary>
        public HSmartWindowControlWPF WindowControlWPF { get; set; }



        public HDrawingObject DrawingObject { get; set; }

        public HTuple HType { get; private set; }
        public HObjBase(HSmartWindowControlWPF windowControlWPF)
        {
            WindowControlWPF = windowControlWPF;

        }

        /// <summary>
        /// 显示图像
        /// </summary>
        public void Show()
        {
            WindowControlWPF.HalconWindow.AttachDrawingObjectToWindow(DrawingObject);
        }


        /// <summary>
        /// 分离图像
        /// </summary>
        public void Close()
        {
            WindowControlWPF.HalconWindow.DetachDrawingObjectFromWindow(DrawingObject);
        }

        /// <summary>
        /// 保留两位小数
        /// </summary>
        /// <returns></returns>
        public string TwoDecimalPlaces(HTuple value)
        {
            return decimal.Round(decimal.Parse(value.ToString()), 2).ToString();
        }

        /// <summary>
        /// 序列化
        /// </summary>
        /// <returns></returns>
        public abstract override string ToString();

        /// <summary>
        /// 刷新事件
        /// </summary>
        public abstract void Reflash(HDrawingObject drawid, HWindow window, string type);
    }
}

矩形抽象改造

using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    /// <summary>
    /// 矩形封装
    /// </summary>
    public class HRectangleObj : HObjBase
    {
        public HTuple HType { get; private set; }
        public HTuple Row1 { get; private set; }
        public HTuple Row2 { get; private set; }
        public HTuple Column1 { get; private set; }
        public HTuple Column2 { get; private set; }

        /// <summary>
        /// 刷新回调
        /// </summary>
        public Action<HRectangleObj> RefleshCallBack { get; set; }

        /// <summary>
        /// 初始化构造函数
        /// </summary>
        /// <param name="windowControlWPF"></param>
        /// <param name="row1"></param>
        /// <param name="column1"></param>
        /// <param name="row2"></param>
        /// <param name="column2"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControlWPF, HTuple row1, HTuple column1, HTuple row2, HTuple column2) : base(windowControlWPF)
        {
            //WindowControlWPF = windowControlWPF;
            Row1 = row1;
            Column1 = column1;
            Row2 = row2;
            Column2 = column2;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, Row1, Column1, Row2, Column2);

			//添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }

        /// <summary>
        /// 默认构造函数
        /// </summary>
        /// <param name="windowControl"></param>
        public HRectangleObj(HSmartWindowControlWPF windowControl) : base(windowControl)
        {

            Row1 = 0;
            Column1 = 0;
            Row2 = 100;
            Column2 = 100;
            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, Row1, Column1, Row2, Column2);

            //添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }



        /// <summary>
        /// 序列化输出
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {

            return JsonConvert.SerializeObject(new
            {
                type = HType.ToString(),
                row1 = TwoDecimalPlaces(Row1),
                column1 = TwoDecimalPlaces(Column1),
                row2 = TwoDecimalPlaces(Row2),
                column2 = TwoDecimalPlaces(Column2)
            });
        }

        public override void Reflash(HDrawingObject drawid, HWindow window, string type)
        {
            HType = drawid.GetDrawingObjectParams("type");
            Row1 = drawid.GetDrawingObjectParams("row1");
            Row2 = drawid.GetDrawingObjectParams("row2");
            Column1 = drawid.GetDrawingObjectParams("column1");
            Column2 = drawid.GetDrawingObjectParams("column2");

            //将本身回调
            RefleshCallBack(this);
        }



    }
}

圆形抽象封装

如果集成抽象的对象只有一个,那么抽象就没有意义了。抽象一定是多个类继承才有使用的实际意义。

代码

using HalconDotNet;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HalconExtension.Models
{
    public class HCircleObj : HObjBase
    {
        public HTuple Row { get; set; }

        public HTuple Column { get; set; }

        public HTuple Radius { get; set; }

        public HTuple HType { get; private set; }

        /// <summary>
        /// 刷新回调
        /// </summary>
        public Action<HCircleObj> RefleshCallBack { get; set; }

        public HCircleObj(HSmartWindowControlWPF windowControlWPF, HTuple row, HTuple col, HTuple radius):base(windowControlWPF)
        {
            Row = row;
            Column = col;
            Radius = radius;

            DrawingObject = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.CIRCLE, Row, Column, Radius);

            //添加更新事件
            DrawingObject.OnDrag(Reflash);
            DrawingObject.OnResize(Reflash);
        }

        public HCircleObj(HSmartWindowControlWPF windowControlWPF) : this(windowControlWPF,64,64,64)
        {
        }

        public override void Reflash(HDrawingObject drawid, HWindow window, string type)
        {
            HType = drawid.GetDrawingObjectParams("type");
            Row = drawid.GetDrawingObjectParams("row");
            Column = drawid.GetDrawingObjectParams("column");
            Radius = drawid.GetDrawingObjectParams("radius");

            //将本身回调
            RefleshCallBack(this);
        }

        public override string ToString()
        {
            return JsonConvert.SerializeObject(new
            {
                type = HType.ToString(),
                row = TwoDecimalPlaces(Row),
                column = TwoDecimalPlaces(Column),
                radius = TwoDecimalPlaces(Radius),
            });
        }
    }
}

运行结果

HCircleObj(windowControlWPF, 64, 64, 64);

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

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

相关文章

leetcode2487.从链表中移除节点

文章目录 题目思路复杂度Code 题目 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &#xff0…

1.2作业

温湿度数据通过中断处理显示到数码管中 main.c #include "spi.h"#include"si7006.h"int main(){int i0,j0,m0,n0;int num[10] {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0x3E,0xE0,0xFE,0xF6};SPI_init();unsigned short hum;short tem;//进行si7006的初始化si700…

关于我花费六千多组了台window+Linux主机

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 写在前面 我在2023年12月组了一台“洋垃圾”的主机&#xff0c;一边当做台式机使用&#xff0c;一边当做服务器使用。这个方案算是相对比较划算的方案。我开始是打算直接单做服务器使用的&#xff0c;以及内存…

【react-taro-canvas】用canvas手写一个数字、字母混合的行为验证码

用canvas手写一个数字、字母混合的行为验证码 实现效果源码 实现效果 源码 import Taro from "tarojs/taro"; import { View, Canvas, Input, Button } from "tarojs/components"; import { useState, useEffect } from "react"; // 画随机线函…

Android14之禁掉Selinux的两种方式(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

安装elasticsearch、kibana、IK分词器、扩展IK词典

安装elasticsearch、kibana、IK分词器、扩展IK词典 后面还会安装kibana&#xff0c;这个会提供可视化界面方面学习。 需要注意的是elasticsearch和kibana版本一定要一样&#xff01;&#xff01;&#xff01; 否则就像这样 elasticsearch 1、创建网络 因为我们还需要部署k…

cJSON代码解读

1、背景 cJSON用了很久&#xff0c;但是对它一直不太了解。这次向添加对long long类型的支持&#xff0c;一直出问题。因为有以前添加两位小数float的经历&#xff0c;我觉得会很轻松&#xff0c;没想到翻车了。于是有了这边文档&#xff0c;阅读了部分博主对cJSON的解析&…

安装VS Code到AWS EC2 Linux 2

文章目录 小结问题及解决参考 小结 本文记录了安装VS Code到AWS EC2 Linux 2。 问题及解决 安装VS Code到AWS EC2 Linux 2采取了以下步骤&#xff1a; 更新VS Code的YUM源&#xff1a; [ec2-userip-100-92-28-119 ~]$ sudo rpm --import https://packages.microsoft.com/k…

LOG滤波器原理探究---计算机视觉和特征检测

先来看几个滤波器公式&#xff1a; 高斯滤波器&#xff1a; G ( x , y ; σ ) 1 2 π σ 2 e − x 2 y 2 2 σ 2 G(x,y;\sigma) \frac{1}{2 \pi \sigma^2} e^{-\frac{x^2 y^2}{2\sigma^2}} G(x,y;σ)2πσ21​e−2σ2x2y2​ 图像的二阶导数&#xff1a; ∇ 2 f ∂ 2 f ∂…

案例086:基于微信小程序的影院选座系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

CTF流量分析经典例题详解

目录 入门题型 题目&#xff1a;Cephalopod(图片提取) 题目&#xff1a;特殊后门(icmp协议信息传输) 题目&#xff1a;手机热点(蓝牙传输协议obex,数据提取) 题目&#xff1a;想蹭网先解开密码(无线密码破解) 进阶题型 题目&#xff1a;抓到一只苍蝇(数据包筛选,数据提…

JAVAEE初阶相关内容第二十弹--HTTP协议

写在前&#xff1a;2024年啦&#xff01;新的一年要努力学习啦 本篇博客围绕HTTP协议&#xff0c;对HTTP协议进行了解&#xff0c;需要理解其工作过程&#xff0c;对HTTP协议格式要清楚&#xff0c;通过抓包工具进行协议分析&#xff0c;认识“方法”、“请求报头”&#xff0c…

什么是安全信息和事件管理(SIEM),有什么用处

安全信息和事件管理&#xff08;SIEM&#xff09;对于企业主动识别、管理和消除安全威胁至关重要。SIEM 解决方案采用事件关联、AI 驱动的异常检测以及机器学习驱动的用户和实体行为分析 &#xff08;UEBA&#xff09; 等机制来检测、审查和应对网络安全威胁。这些功能使 SIEM …

OpenCV图像处理——C++实现亚像素尺寸标定板边缘轮廓提取

前言 标定模板&#xff08;Calibration Target&#xff09;在机器视觉、图像测量、摄影测量以及三维重建等应用中起着重要的作用。它被用于校正相机的畸变&#xff0c;确定物理尺寸和像素之间的换算关系&#xff0c;并建立相机成像的几何模型。通过使用相机拍摄带有固定间距图…

基于simiulink的flyback反激型电路建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 Flyback反激型电路的基本原理 4.2 Flyback反激型电路的数学建模 4.3 Flyback反激型电路的仿真方法 5.完整工程文件 1.课题概述 flyback反激型电路建模与仿真。反激变换器在开关管导通时电源将电能…

IDEA2023 最新版详细图文安装教程(安装+运行测试+汉化+背景图设置)

IDEA2023 最新版详细图文安装教程 名人说&#xff1a;工欲善其事&#xff0c;必先利其器。——《论语》 作者&#xff1a;Code_流苏(CSDN) o(‐&#xff3e;▽&#xff3e;‐)o很高兴你打开了这篇博客&#xff0c;跟着教程去一步步尝试安装吧。 目录 IDEA2023 最新版详细图文安…

LiveGBS流媒体平台GB/T28181常见问题-如何配置快照目录快照存储默认目录目录如何配置

LiveGBS流媒体平台GB/T28181常见问题-如何配置快照目录快照存储默认目录目录如何配置 1、快照目录2、指定快照目录3、搭建GB28181视频直播平台 1、快照目录 部署LiveGBS后&#xff0c; 再查看通道播放后 或是 获取通道快照后&#xff0c;就会在LiveSMS部署的服务器里面存储对应…

大文件断点下载Range下载zip包显示文件损坏

问题&#xff1a;大文件下载&#xff0c;其它格式的文件及rar格式的压缩包正常下载但是 之后zip包下载后解压失败 原因分析: 1. 查看上传文件的属性值 如图&#xff0c;10.4kb是已经约去小数点的值&#xff0c;准确的大小应该是10663字节10.4130859375KB&#xff0c;所以用10.…

C#使用纯OpenCvSharp部署yolov8-pose姿态识别

【源码地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8-Pose算法是一种基于深度神经网络的目标检测算法&#xff0c;用于对人体姿势进行准确检测。该算法在Yolov8的基础上引入了姿势估计模块&#xff0c;通过联合检测和姿势…

解决Android Studio The path ‘X:\XXX‘ does not belong to a directory.

目录 前言 一、问题描述 二、解决方法 前言 在移动应用开发领域&#xff0c;Android Studio作为一款功能强大的集成开发环境&#xff0c;为开发人员提供了丰富的工具和功能。然而&#xff0c;在使用Android Studio的过程中&#xff0c;有时也会遇到各种各样的问题和错误。 &…