WPF+Halcon 培训项目实战(8):WPF+Halcon初次开发

前言

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

相关链接

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

Halcon开发 CSDN博客专栏

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

项目专栏

WPF+Halcon实战项目

运行环境

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

匹配图片

在这里插入图片描述

WPF Halcon组件

WPF的 Halcon组件我之前使用过,有兴趣的可以去看我的专栏里面找Halcon WPF 开发学习笔记

Halcon开发 CSDN博客专栏

HSmartWindowControlWPF绑定

我们这里基于ViewModel的形式开发。所以我们需要将HSmartWindowControlWPF(后面简称HS组件) 绑定到我们的DataContext中。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

读取图片

我们在Resources文件夹中添加一张图片
在这里插入图片描述
确保自己已经完成了Resources文件夹的设置,不清楚的可以看上一章的WPF项目初始化

WPF+Halcon 培训项目实战(7):目标匹配助手

在这里插入图片描述

运行代码

            ReadImgBtn = new RelayCommand(() =>{try{MsgHelper.Info("读取图片");var Image = new HImage();Image.ReadImage("Resources/1.png");HalconWindow.HalconWindow.DispObj(Image);}catch(Exception ex) {MsgHelper.Error("HS组件加载图片失败!:" +ex.Message);}});

运行结果

在这里插入图片描述

抖动问题解决

Halcon WPF 开发学习笔记:HSmartWindowControlWPF正常加载

代码修改为

            ReadImgBtn = new RelayCommand(() =>{try{MsgHelper.Info("读取图片");var Image = new HImage();Image.ReadImage("Resources/1.png");HalconWindow.HalconWindow.DispObj(Image);//读取后将图片居中HalconWindow.SetFullImagePart();//读取后将图片完全拉伸充满整个屏幕//HalconWindow.SetFullImagePart(Image);}catch (Exception ex) {MsgHelper.Error("HS组件加载图片失败!:" +ex.Message);}});

运行结果

在这里插入图片描述

绘制矩形

这个图片读取成功之后,说明我们的Halcon组件已经加载成功了。现在我们代码添加以下别的功能。

InitRectangleBtn = new RelayCommand(() =>
{MsgHelper.Info("生成矩形");var drawObj = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);HalconWindow.HalconWindow.AttachDrawingObjectToWindow(drawObj);
});

绘制图像会消失

在这里插入图片描述
因为我们没有声明一个公有变量,所以每次运行完代码他就默认把矩形窗口释放掉了。所以我们需要重新生成矩形窗口。

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

在这里插入图片描述

绘制对象绑定事件

在这里插入图片描述
一共有5种事件:

  • OnAttach:附加
  • OnDetach:分离
  • OnDrag:拖动
  • OnResize:缩放
  • OnSelect:选中

我们添加以下打印函数看看结果:

 InitRectangleBtn = new RelayCommand(() =>{MsgHelper.Info("生成矩形");rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);HalconWindow.HalconWindow.AttachDrawingObjectToWindow(rect);rect.OnAttach(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>{NLogHelper.Debug("附加事件");}));rect.OnDrag(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>{NLogHelper.Debug("拖动事件");}));rect.OnResize(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>{NLogHelper.Debug("缩放事件");}));rect.OnSelect(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>{NLogHelper.Debug("选中事件");}));rect.OnDetach(new HDrawingObject.HDrawingObjectCallback((id, window, type) =>{NLogHelper.Debug("分离事件");}));});

在这里插入图片描述
根据我的测试,主要是拖动和缩放事件。选中很难触发。附加和分离应该是有个触发的方式,现在不了解。

拖动事件

InitRectangleBtn = new RelayCommand(() =>
{MsgHelper.Info("生成矩形");rect = HDrawingObject.CreateDrawingObject(HDrawingObject.HDrawingObjectType.RECTANGLE1, 100,200,300,400);HalconWindow.HalconWindow.AttachDrawingObjectToWindow(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} ");}));
});

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MAC运行Windows专用软件 CrossOver v23.7.1中文版 macOS

CrossOver v23.7.1中文版是一款系统兼容软件,让您可以在 Mac 和 Linux 系统上运行 Windows 应用,不必购买 Windows 授权,不必重启系统,不必使用虚拟机。通过 CrossOver, 您可以从 dock 直接启动 Windows 应用&#xff…

Android笔记(二十三):Paging3分页加载库结合Compose的实现分层数据源访问

在Android笔记(二十二):Paging3分页加载库结合Compose的实现网络单一数据源访问一文中,实现了单一数据源的访问。在实际运行中,往往希望不是单纯地访问网络数据,更希望将访问的网络数据保存到移动终端的SQL…

pytest pytest-emoji通过表情包展示执行状态

pytest-emoji 是一个用于在 Pytest 测试运行期间显示 emoji 表情的插件。它可以为测试结果添加一些有趣的表情符号,以增加测试报告的可读性和趣味性。 使用 pytest-emoji 插件非常简单,只需按照以下步骤进行操作: 首先,确保已经安…

【数据结构】快速排序(4种方式实现)

前言:前面我们学习了几种相对比较简单的排序,今天我们要一起学习的是快速排序,我们将通过四种方式来模拟实现快排。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:数据结构 👈 &#x1f4a…

K-means 聚类算法分析

算法简述 K-means 算法原理 我们假定给定数据样本 X ,包含了 n 个对象 ,其中每一个对象都具有 m 个维度的属性。而 K-means 算法的目标就是将 n 个对象依据对象间的相似性聚集到指定的 k 个类簇中,每个对象属于且仅属于一个其到类簇中心距离…

基于MINIST的手写数字体识别

一、算法简述 网络结构设计 通过创建MnistNet类,定义了包含两个卷积层和两个全连接层的深度神经网络。这个网络的设计灵感来自于经典的CNN结构,其中卷积层用于提取图像特征,而全连接层则用于将这些特征映射到最终的类别。 卷积与池化 卷…

js对象方法大全(开发必会)

目录 前言 assgin(对象合并) 参数 功能 返回值 测试 结果 结论 create(以源对象为原型创建新对象) 参数 功能 返回值 测试 结果 结论 defineProperties(对属性进行具体定义) 参数 功能 返回值 测试 结果 结论 defineProperty(重写或定义新属性) 参数 功…

【Hive_04】分区分桶表以及文件格式

1、分区表1.1 分区表基本语法(1)创建分区表(2)分区表读写数据(3)分区表基本操作 1.2 二级分区1.3 动态分区 2、分桶表2.1 分桶表的基本语法2.2 分桶排序表 3、文件格式与压缩3.1 Hadoop压缩概述3.2 Hive文件…

用轻量级ORM--Dapper实现泛型仓储

阅读本文你的收获 了解Dapper的适用场景了解Dapper的本质其实是一些扩展方法学会使用Dapper的扩展Domel来实现泛型仓储 一、什么是Dapper? Dapper是一个轻量级的ORM(对象关系映射)工具,用于简化数据库操作。它和Entity Framewor…

Java 类加载与字节码技术

3 类加载与字节码技术 3.1 类文件结构 类文件结构字节码指令编译期处理类加载阶段类加载器运行期优化 根据 JVM 规范,类文件结构如下 ClassFile {u4 magic;u2 minor_version; // 小版本号u2 major_version; // 主版本号u2 constant_pool_count; // 常量池cp_info…

web前端开发网页制作html/css结课作业

效果图展示: 注意事项: 引用JQuery文件地址和图片地址要更换一下。 百度网盘链接: http://链接:https://pan.baidu.com/s/1wYkmLr7csjBwQY6GmlYm4Q?pwd4332 提取码:4332 html界面展示: main.css代码部…

前端 -- 基础 常用标签 ( 文本格式化标签,<div>,<span>标签)

目录 文本格式化标签 &#xff1a; 加粗 倾斜 删除线 下划线 < div > 和 < span > 标签 < div > 标签 < span > 标签 文本格式化标签 &#xff1a; 在网页中&#xff0c;有时需要为文字设置 粗体&#xff0c; 斜体 或下划线 等效果&a…