WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形

2024-01-02 12:04

本文主要是介绍WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 相关链接
  • 项目专栏
  • 运行环境
  • 匹配图片
  • 矩形鼠标绘制
    • Halcon添加右键事件
    • Task封装
    • 运行结果
    • 个人引用问题
      • 原因推测
  • 圆形鼠标绘制
    • 代码
    • 运行结果
  • 课程完结:

前言

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

相关链接

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

Halcon开发 CSDN博客专栏

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

项目专栏

WPF+Halcon实战项目

运行环境

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

匹配图片

在这里插入图片描述

矩形鼠标绘制

在Halcon中绘制分为三种方式:

  • 直接绘制
  • 生成之后拖动缩放
  • 鼠标直接框选

前两种方式之前的博客已经讲解过了,这次我们讲解第三种方式。

Halcon添加右键事件

Halcon DrawRegion()后会阻塞直到右键按下,请问如何主动取消绘制区域

我们需要右键的时候取消Halcon绘制事件

在这里插入图片描述

Task封装

在Halcon中,绘制图案是会导致UI线程锁死的。这里我们需要用到Task任务

C# Task任务详解

添加Halcon任务

  /// <summary>/// 绘制图片,返回回调函数/// </summary>/// <param name="callback"></param>/// <returns></returns>public override Task Draw(Action callback){//防止出现多个鼠标绘制任务。强制前一个任务放开HalconAPI.CancelDraw();HTuple row1 = new HTuple();HTuple row2 = new HTuple();HTuple column1 = new HTuple();HTuple column2 = new HTuple();//double row1,row2,column1,column2;HOperatorSet.DrawRectangle1(WindowControlWPF.HalconWindow, out row1, out column1, out row2, out column2);//WindowControlWPF.HalconWindow.DrawRectangle1(out row1, out column1, out row2, out column2);Row1 = row1;Row2 = row2;Column1 = column1;Column2 = column2;//获取接触的ROI区域Reduce();callback();return Task.CompletedTask;}

按钮点击事件

private void DrawRectByMouse(){HRectangleObjByMouse = new HRectangleObj(HalconWindow, hImage);//新建异步,防止阻塞UITask.Run(() => HRectangleObjByMouse.Draw(() =>{//打印绘制结果MsgHelper.Success("鼠标绘图绘制成功!" + HRectangleObjByMouse.ToString());}));}

运行结果

在这里插入图片描述

个人引用问题

我写代码的时候出现了一个空值的异常,非常的奇怪

C#怎么判断2个对象引用的是同一个地址

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

按理来说的添加的HalconWindow是引用类型,引用类型存的相对应用的空间应该是一样的。

原因推测

初始HS
Rect.HS赋值
初始HS指向新的HS,是开辟了一个新的空间
Rect.HS和初始的HS赋值不同

内存地址简称n,person1的内存地址简称n1


//p1 = n1Person person1 = new Person();//p2 = n2Person person2 = new Person();//p3 = n3Person person3 = new Person();//p3= n1person3 = person1;
// p1 = n2person1 = person2;//比较p1和p3,因为p1和p3的内存指向发生了变化,p1=n2,p3=n1,所以内存地址不同,不是同一个对象Console.WriteLine(object.ReferenceEquals(person1,person3)); //False

圆形鼠标绘制

代码

圆形绘制代码

     public override Task Draw(Action callback){//防止出现多个鼠标绘制任务。强制前一个任务放开HalconAPI.CancelDraw();HTuple row = new HTuple();HTuple column = new HTuple();HTuple radius = new HTuple();//double row1,row2,column1,column2;HOperatorSet.DrawCircle(WindowControlWPF.HalconWindow, out row, out column, out radius);//WindowControlWPF.HalconWindow.DrawRectangle1(out row1, out column1, out row2, out column2);Row = row;Column = column;Radius = radius;//获取接触的ROI区域Reduce();callback();return Task.CompletedTask;}

圆形鼠标绘制按钮

        private void DrawCircleByMouse(){HCircleObjByMouse = new HCircleObj(HalconWindow, hImage);MsgHelper.Info("请添加鼠标绘制任务!");//新建异步,防止阻塞UITask.Run(() => HCircleObjByMouse.Draw(() =>{//打印绘制结果MsgHelper.Success("鼠标绘图绘制成功!" + HCircleObjByMouse.ToString());}));}

运行结果

在这里插入图片描述

课程完结:

我们的Halcon部分代码已经全部结束了。后面主要就是讲解偏WPF的相关开发。我这个记录只是做一个思路,就是跑通WPF和Halcon对接的一些功能。后面的往上做就是把WPF部分或者Halcon部分往上做了。这里就不做更多的说明了。

个人目前的安排就是去了解一些OpenCV。了解就是OpenCV是怎么跑的,怎么用的,环境怎么配置。Python也顺便了解一下。

目前个人的打算是明年3月份左右开始找工作,顺利的话大概4月份就能入职了。再干个一两年看看,实在不行就回家摆烂了。

这篇关于WPF+Halcon 培训项目实战 完结(13):HS 鼠标绘制图形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

Ubuntu 24.04启用root图形登录的操作流程

《Ubuntu24.04启用root图形登录的操作流程》Ubuntu默认禁用root账户的图形与SSH登录,这是为了安全,但在某些场景你可能需要直接用root登录GNOME桌面,本文以Ubuntu2... 目录一、前言二、准备工作三、设置 root 密码四、启用图形界面 root 登录1. 修改 GDM 配

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien