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

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

文章目录

  • 前言
  • 相关链接
  • 项目专栏
  • 运行环境
  • 匹配图片
  • WPF Halcon组件
    • HSmartWindowControlWPF绑定
    • 读取图片
      • 运行代码
      • 运行结果
    • 抖动问题解决
      • 运行结果
    • 绘制矩形
      • 绘制图像会消失
    • 绘制对象绑定事件
    • 拖动事件

前言

为了更好地去学习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} ");}));
});

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 词法语法语义分析程序设计及实现,包含出错提示和错误恢复
  • UDP信号多个电脑的信息传输测试、配置指南
  • 【c/c++】指针例图基础详解
  • H3CIE面试项目
  • Zookeeper之手写一个分布式锁
  • JavaScript二
  • js for和forEach 跳出循环 替代方案
  • AI又进化了,AI 写代码工具
  • 使用Jenkins和单个模板部署多个Kubernetes组件
  • openpose+smplx
  • 轮廓检测与处理
  • wpf-动态设置组件【按钮为例】样式
  • Ubuntu 18.04搭建RISCV和QEMU环境
  • 磁盘阵列raid
  • 【机器学习】深度学习概论(二)
  • ----------
  • AHK 中 = 和 == 等比较运算符的用法
  • android图片蒙层
  • ECMAScript入门(七)--Module语法
  • java多线程
  • OSS Web直传 (文件图片)
  • Spring声明式事务管理之一:五大属性分析
  • Xmanager 远程桌面 CentOS 7
  • 坑!为什么View.startAnimation不起作用?
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 移动端解决方案学习记录
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ​Benvista PhotoZoom Pro 9.0.4新功能介绍
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #mysql 8.0 踩坑日记
  • #pragma once与条件编译
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (30)数组元素和与数字和的绝对差
  • (4.10~4.16)
  • (rabbitmq的高级特性)消息可靠性
  • (补充):java各种进制、原码、反码、补码和文本、图像、音频在计算机中的存储方式
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (学习总结16)C++模版2
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .java 9 找不到符号_java找不到符号
  • .NET Standard 的管理策略
  • .NET企业级应用架构设计系列之开场白
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .Net中的设计模式——Factory Method模式
  • [17]JAVAEE-HTTP协议
  • [30期] 我的学习方法
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Android] Amazon 的 android 音视频开发文档
  • [Armbian] 部署Docker版Home Assistent,安装HACS并连接米家设备