WPF+Halcon 培训项目实战(12):WPF导出匹配模板
文章目录
- 前言
- 相关链接
- 项目专栏
- 运行环境
- 匹配图片
- WPF导出匹配模板
- 如何了解Halcon和C#代码的对应关系
- 逻辑分析:
- 添加截取ROI功能
- 基类
- 矩形
- 圆形
- 生成导出模板
- 运行结果:
- 可能的报错
- 你的文件路径不存在
- 你选择的区域的内容有效信息过少
前言
为了更好地去学习WPF+Halcon,我决定去报个班学一下。原因无非是想换个工作。相关的教学视频来源于下方的Up主的提供的教程。这里只做笔记分享,想要源码或者教学视频可以和他联系一下。
相关链接
微软系列技术教程 WPF 年度公益课程
Halcon开发 CSDN博客专栏
个人学习的Gitee 项目地址仓库
项目专栏
WPF+Halcon实战项目
运行环境
- .net core 8.0
- visual studio 2022
- halcon HDevelop 20.11
- windows 11
匹配图片

WPF导出匹配模板
如何了解Halcon和C#代码的对应关系
我之前的博客上面说过,Halcon是可以进行C# 文档导出的功能的

如果我们对其添加注释,其导出的文件也有添加对应的注释的功能。


所以我们只需要将对应的代码超过了,进行对应的转化即可。
逻辑分析:
添加截取ROI功能
我们之前的抽象封装,还缺少截取ROI的功能,这里我们将ROI截取功能添加上去。
截取ROI对应代码
//截取ROIhv_Row1.Dispose();hv_Column1.Dispose();hv_Row2.Dispose();hv_Column2.Dispose();HOperatorSet.DrawRectangle1(hv_WindowHandle, out hv_Row1, out hv_Column1, out hv_Row2, out hv_Column2);ho_Rectangle.Dispose();HOperatorSet.GenRectangle1(out ho_Rectangle, hv_Row1, hv_Column1, hv_Row2, hv_Column2);ho_ImageReduced.Dispose();HOperatorSet.ReduceDomain(ho_Image, ho_Rectangle, out ho_ImageReduced);
基类
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; }/// <summary>/// 资源路径/// </summary>public string ResourcesPath { get => AppDomain.CurrentDomain.BaseDirectory + "Resources"; }/// <summary>/// 导出路径/// </summary>public string OutputPath{get{var path = AppDomain.CurrentDomain.BaseDirectory + "Output";//如果不存在就创建if (!Directory.Exists(path)){Directory.CreateDirectory(path);}return path;}}public HDrawingObject DrawingObject { get; set; }public HImage Image { get; set; }public HObject ROI = new HObject();public HObjBase(HSmartWindowControlWPF windowControlWPF, HImage image){WindowControlWPF = windowControlWPF;Image = image;}......其它代码/// <summary>/// 截取图片/// </summary>public abstract HObject Reduce();}
}
矩形
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,HImage hImage, HTuple row1, HTuple column1, HTuple row2, HTuple column2) : base(windowControlWPF, hImage){//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,HImage hImage) : this(windowControl,hImage,100,200,300,400){}......其它代码/// <summary>/// 截取图片/// </summary>public override HObject Reduce(){HObject res = new HObject();HOperatorSet.GenRectangle1(out ROI, Row1, Column1, Row2, Column2);HOperatorSet.ReduceDomain(Image, ROI, out res);return res;}}
}
圆形
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,HImage hImage, HTuple row, HTuple col, HTuple radius):base(windowControlWPF,hImage){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,HImage hImage) : this(windowControlWPF,hImage,64,64,64){}......其它代码/// <summary>/// 截取图片/// </summary>public override HObject Reduce(){HObject res = new HObject();HOperatorSet.GenCircle(out ROI, Row, Column,Radius);HOperatorSet.ReduceDomain(Image, ROI, out res);return res;}}
}
生成导出模板
/// <summary>/// 生成匹配模板/// </summary>private void InitTemplate(){HTuple modelId = new HTuple();var ho_ImageReduced = RectangleObj.Reduce();HOperatorSet.CreateShapeModel(ho_ImageReduced, "auto", -0.39, 0.79, "auto", "auto","use_polarity", "auto", "auto", out modelId);//导出匹配模板HOperatorSet.WriteShapeModel(modelId, RectangleObj.OutputPath+"/output.shm");MsgHelper.Success($"生成模板成功!路径为:{RectangleObj.OutputPath + "/output.shm"}");}
运行结果:

可能的报错
你的文件路径不存在
Halcon组件无法自动生成文件路径,如果保存的文件夹不存在会抛出异常

你选择的区域的内容有效信息过少

相关文章:
WPF+Halcon 培训项目实战(12):WPF导出匹配模板
文章目录 前言相关链接项目专栏运行环境匹配图片WPF导出匹配模板如何了解Halcon和C#代码的对应关系逻辑分析:添加截取ROI功能基类矩形圆形 生成导出模板运行结果:可能的报错你的文件路径不存在你选择的区域的内容有效信息过少 前言 为了更好地去学习WPF…...
uniapp中uview组件库的丰富Upload 上传上午用法
目录 基础用法 #上传视频 #文件预览 #隐藏上传按钮 #限制上传数量 #自定义上传样式 API #Props #Methods #Slot #Events 基础用法 可以通过设置fileList参数(数组,元素为对象),显示预置的图片。其中元素的url属性为图片路径 <template>…...
Unity关于动画混合树(Blend Tree)的使用
在动画与动画的切换过程中,常因为两个动画之间的差距过大,而显得动画的切换很不自然。 这时候就需要动画混合树Blend Tree这个功能。使用混合树可以将多个动画混合在一起,例如在处理角色的移动中,走动画与跑动画切换的时候&#x…...
怎么下载landsat 8影像并在ArcGIS Pro中进行波段组合
Landsat 8(前身为Landsat数据连续性任务,或 LDCM)于2013年2月11日由 Atlas-V火箭从加利福尼亚州范登堡空军基地发射升空,这里为大家介绍一下该数据的下载的方法,希望能对你有所帮助。 注册账号 如果之前已经注册过的…...
编程新手IDE
身为一个前端开发者,我深知一个好的开发环境对于编程体验的重要性。对于新手来说,选择一个合适的IDE(集成开发环境)更是至关重要。一个好的IDE可以提高编程效率,减少错误,让新手更专注于学习编程本身。 今…...
如何将一个JSON字符串解析为JavaScript对象或值
JSON.parse(JSON.stringify(data)) 将后端传入的JSON数据data放入该方法的参数中,返回的结果就是JavaScript对象 比如将后端传入的对象key作为对象,而不是字符串双引号格式 {"path": "/home","name": "home",…...
idea配置docker推送本地镜像到远程私有仓库
目录 1,搭建远程Docker 私有仓库 Docker registry 2,Windows10/11系统上安装Docker Desktop 3,idea 配置远程私有仓库地址 4,idea 配置Docker 5,idea在本地构建镜像 6,推送本地Docker镜像到远程 Dock…...
Spring Boot学习随笔- 集成MyBatis-Plus(二)条件查询QueryWrapper、聚合函数的使用、Lambda条件查询
学习视频:【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 查询方法详解 普通查询 // 根据主键id去查询单个结果的。 Test public void selectById() {User user userMapper.selectById(1739970502337392641L);System.out.print…...
十二、K8S之污点和容忍
污点和容忍 一、概念 k8s 集群中可能管理着非常庞大的服务器,这些服务器可能是各种各样不同类型的,比如机房、地理位置、配置等,有些是计算型节点,有些是存储型节点,此时我们希望能更好的将 pod 调度到与之需求更匹配…...
llvm后端之指令选择源码分析
llvm后端之指令选择源码分析 引言1 主要流程1.1 参数降级1.2 构建DAG1.3 类型合法化1.4 向量合法化1.5 DAG合法化1.6 DAG合并 2 目标实现2.1 TargetLowering2.2 SelectionDAGISel 引言 llvm后端指令选择主要是class SelectionDAGISel的子类实现。整个过程将llvm IR转为有向无环…...
【消息中间件】Rabbitmq消息可靠性、持久化机制、各种消费
原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、常见用法1.消息可靠性2.持久化机制3.消息积压批量消费:增加 prefetch 的数量,提高单次连接的消息数并发消费:…...
aws-sdk-cpp通过bazel构建的S3_client轮子
感觉时间过得很快,又是很久没有更新了 哎,主要原因还是很久都没有学什么东西了,进入社会后不知不觉间倦怠了许多 没什么办法,上班了之后做的很多东西都是调用api,越来越像一个工具人了,虽然说本身也大差不…...
关于WPF MVVM 的详细使用过程以及注意的问题
WPF MVVM 是一种常用的设计模式,在 WPF 应用程序中使用它可以更好地分离界面逻辑和业务逻辑,并且更容易进行单元测试和重构。下面是深入理解 WPF MVVM 的详细使用过程以及注意的问题。 一、MVVM 的基本概念 MVVM 是 Model-View-ViewModel 的缩写&#…...
计算机视觉 全教程目录
1、OpenCV 图像处理框架 实战系列 总目录 OpenCV 图像处理框架 实战系列 总目录 2、现代卷积网络实战系列 总目录 现代卷积网络实战系列 总目录 3、YOLO 物体检测 系列教程 总目录 YOLO 物体检测 系列教程 总目录 4、图像分割实战-系列教程 总目录 图像分割实战-系列教程 总目录…...
油猴脚本开发,之如何添加html和css
简介 油猴是一个脚本管理器,让我们能够方便的使用js脚本,以实现对页面内容的修改、功能增强或其他定制化操作。 常见脚本管理器 Tampermonkey 应该是各位见得最多的也是最知名的,好用又稳定,多浏览器支持Greasemonkey 用户脚本始祖&#x…...
【MATLAB】BiGRU神经网络时序预测算法
有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 BiGRU神经网络时序预测算法是一种基于双向门控循环单元(GRU)的多变量时间序列预测方法。该方法结合了双向模型和门控机制,旨在有效地捕捉时间序列数据中…...
57.0/初识 PhotoShopCS4(详细版)
目录 57.1 PhotoShop 概要 57.2.1 像素和分辨率 57.2.2 色彩模式 57.2.3 位图和矢量图 57.3 PhotoShop 基本操作 57.3.1 PhotoShop 界面的认识 57.3.2 PhotoShop 基本界面工具 57.3.3 移动选择工具(V) 57.3.4 选框工具(M)编辑 编辑57.3.5 套索工具(L) 57.3…...
[C#]opencvsharp进行图像拼接普通拼接stitch算法拼接
介绍: opencvsharp进行图像拼一般有2种方式:一种是传统方法将2个图片上下或者左右拼接,还有一个方法就是融合拼接,stitch拼接就是一种非常好的算法。opencv里面已经有stitch拼接算法因此我们很容易进行拼接。 效果: …...
《妙趣横生的算法》(C语言实现)-第10章算法设计与数据结构面试题精粹
【10-1】输入一个字符串并将它输出,以ctrlz组合键表示输入完毕,要求将输入的字符串中多于1个的连续空格符合并为1个。 //10-1 2023年12月30日17点11分-17点18分 # include <stdio.h> int main() {char c;c getchar();//scanf("%c", &a…...
(JAVA)-(网络编程)-初始网络编程
网络编程就是在通信协议下,不同的计算机上运行的程序,进行的数据传输。 讲的通俗一点,就是以前我们写的代码是单机版的,网络编程就是联机版的。 应用场景:即时通信,网游对战,金融证券…...
基于springboot的旅游景点门票信息系统设计与实现-vue
目录 技术栈选择系统模块划分数据库设计接口设计规范前端实现要点安全措施部署方案开发流程测试计划扩展功能预留 项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术栈选择 后端采用Spring Boot框架,提供RESTful…...
LVGL字体扩展避坑指南:freetype缓存管理导致的内存泄漏问题排查实录
LVGL字体扩展深度解析:如何规避freetype缓存管理中的内存泄漏陷阱 在嵌入式GUI开发中,LVGL结合freetype的动态字体加载功能为多语言支持提供了强大支持,但这也带来了内存管理的复杂性。本文将深入探讨一个典型场景:当项目需要频繁…...
STM32标准库项目如何用VSCode一键编译下载?详解tasks.json与Makefile的联动配置
STM32标准库项目在VSCode中实现一键编译下载的终极指南 1. 为什么选择VSCode进行STM32开发? 传统嵌入式开发往往依赖于Keil、IAR等商业IDE,但这些工具存在几个明显痛点: 高昂的授权费用:商业IDE的许可证价格让个人开发者和小团队望…...
如何快速为Obsidian插件添加状态栏功能:完整指南与实用示例
如何快速为Obsidian插件添加状态栏功能:完整指南与实用示例 【免费下载链接】obsidian-sample-plugin 项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-sample-plugin Obsidian Sample Plugin是一个官方提供的插件开发示例,展示了如…...
OpenClaw调用百川2-13B量化模型实测:Token消耗降低30%的3个技巧
OpenClaw调用百川2-13B量化模型实测:Token消耗降低30%的3个技巧 1. 为什么选择量化模型 当我第一次在本地部署OpenClaw时,最让我头疼的就是显存问题。我的RTX 3090显卡在运行百川2-13B原版模型时,显存占用经常突破20GB,导致其他…...
物理海洋学入门:从海浪到海流,一文搞懂海水运动的7种形式
物理海洋学入门:从海浪到海流,一文搞懂海水运动的7种形式 海洋覆盖了地球71%的表面积,这片蔚蓝的水域从未停止过运动。当我们站在海边,看着潮起潮落、浪花拍岸,或许会好奇:这些看似简单的海水运动背后&…...
ROS2 Humble下,如何用一份Xacro文件同时搞定MoveIt2配置与Gazebo仿真(附完整Launch文件)
ROS2 Humble统一建模实战:Xacro文件在MoveIt2与Gazebo中的协同设计 当机械臂的URDF文件需要同时满足MoveIt2的运动规划需求和Gazebo的物理仿真要求时,开发者往往陷入两难境地。传统方案需要维护两份模型文件——一份精简版用于MoveIt,另一份增…...
[FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通
[FFXIVChnTextPatch]:国际服中文补丁解决方案——从入门到精通 【免费下载链接】FFXIVChnTextPatch 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIVChnTextPatch 一、问题引入:当语言成为游戏体验的隐形壁垒 你是否曾在探索艾欧泽亚大陆时…...
OpenPPL之二,优化器里面的算子融合
算子融合的执行时机 完整的时间线 模型加载阶段(一次) 运行时阶段(多次推理)↓ ↓ ┌─────────────────────┐ ┌─────────────┐ │ 1. 解析ON…...
从GOPATH到Go Mod:老项目迁移必知的5个文件结构陷阱
从GOPATH到Go Mod:老项目迁移必知的5个文件结构陷阱 当Golang社区在2018年推出Go Modules时,很少有人预料到这个看似简单的包管理工具会成为Go语言发展史上的分水岭。四年后的今天,仍有大量遗留项目困在GOPATH的泥潭中,而迁移过程…...
