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列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

springboot项目中常用的工具类和api详解

《springboot项目中常用的工具类和api详解》在SpringBoot项目中,开发者通常会依赖一些工具类和API来简化开发、提高效率,以下是一些常用的工具类及其典型应用场景,涵盖Spring原生... 目录1. Spring Framework 自带工具类(1) StringUtils(2) Coll

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读