保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)
经历上一篇《零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功》的发布已经过去三天啦,
零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功_添加halcondotnet.dll-CSDN博客
在友友的催更下,我将用我花2W以及四个月时间的所学,后面将全无保留的为大家更新C#与Halcon的学习之路,也是记录我的学习之路,记录后面大四上学期培训生活(望有CSDN机器视觉圈的有成之士,能做下我的伯乐)。
我时常在想有没有必要去做这么一件事。我想的是学完再更新,但是看到网上资料较少,鱼龙混杂,课程也不规范,你们对于这些资料也无从下手,学着难,学着深奥,学不会、等等问题。
我看到这些情况真的于心不忍,痛下心后面慢慢更新,我希望我的保姆教程(胎儿级教程)、热情和热血会点亮一些人,让你们在这段学习中有所帮助,更加清晰的了解到这个机器视觉的行业。所有文章将以保姆级或者胎儿级教程来更新。 你的点赞、关注与支持是我更新下去的最大动力。
正文:
下面我将详细介绍关于保姆级-C#与Halcon的窗体界面展示阈值分割图像教程,将一步步指导你如何使用 C# 和 Halcon 库创建一个简单的 Windows 窗体应用程序,并在该界面中显示经过阈值分割处理的图像。当然,以下保姆级教程,相信每一个小白都能听懂,都能做出自己想要的阈值分割图像教程。
这个教程特别适合初学者,内容详细且易于理解。
先展示一下阈值分割结果展示图:
前期准备
安装 Visual Studio:确保你已经安装了 Visual Studio,并选择了适用于 C# 开发的组件。
安装 Halcon:下载并安装 Halcon。安装完成后,确保 Halcon 的库文件(如 HalconDotNet.dll)已正确配置到你的开发环境中。
安装网上教程很多,这里就不过多赘述,未配置Halcon 的库文件(如 HalconDotNet.dll)参考下面零基础小白实现C#调用halcon dll的过程的教程(也是胎儿级版本)
零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功-CSDN博客
第一步:创建 C# Windows Forms 项目
启动 Visual Studio,创建一个新的“Windows Forms 应用程序”项目。
2.命名项目,如 HalconThresholdDemo,(遵循C语言文件命名规范)并选择保存路径(尽量自己单独建一个文件夹,便于查看和后面理解)。
Form1 是类
Program.cs是程序入口,也是Main函数 ,界面就是这样
第二步:了解窗体界面
这个边框是工具箱和属性(如若没有:最上面的视图 ->工具箱即可)还没有则拉侧边 鼠标左键拉出来。工具箱(有窗体所需的工具,常用的有小黑窗体,按钮Button ,文字TextBox等)
第三步:设计窗体界面
1.在设计界面时,我们需要几个基本的控件:
- 两个
HWindowControl
控件,用于显示原始图像和分割后的图像。(没有这个控件需要将下图的halcondotnet.dll拖到工具箱中,随在拖哪里都可以),会自动生成HWindowControl
和HSmartWindowControl,点击工具箱中的HWindowControl
(箭头的里面),
点击工具箱中的HWindowControl
,将HWindowControl
控件(这里叫他小黑窗体)拖到Form2窗体中(建立两个HWindowControl
控件(这里叫他小黑窗体),一个用于显示原始图像,一个用于显示阈值分割后的图像)。
注意:两个窗体名字都要改;小黑窗体1的Name改为:hWindowControl_yuanshi
小黑窗体2的Name改为:hWindowControl_threson
- 一个按钮 (
Button
) 用于读取图像, 点击工具箱->点击Button->移动鼠标至拖到Form2窗体中,用于建立点击的按钮。设置框体按钮Name名字为:button_readImage 框中文字Text:读取图片
- ①两个文本信息 (Label) 用于解释后面文本框的最大和最小灰度值。
②两个文本框 (TextBox
) 用于输入最大和最小灰度值。最大灰度输入的Name命名为: textBox_Maxgunrun 最小灰度输入的Name命名为:textBox_Mingunrun
- 另一个按钮 (
Button
) 用于执行阈值分割。按钮 (Button
)的Name命名为:button_yuzhifenge 框中文字Text:阈值分割
2.注意:
就是你有可能会在上面的操作中,点到窗体的控件,进入代码了,不要慌,不要慌,莫紧张,下面来跟着操作,点击Form2.cs[设计] 即可重新返回白色窗体界面。
第四步:编写代码
当然你们有疑问?我们那如何进入代码呢?跟着来操作
我们点击这个框时,代码中会自动生成关于按钮点击事件,其他的也是一样的会生成事件。button_readImage_Click
: 处理读取图像的按钮点击事件。
在 Form1.cs
中,添加以下代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;namespace YJH1 //命名空间 包含这个程序所有代码
{public partial class Form1 : Form //class Form1 类继承了From ,代表Windows窗体。{public Form1() //类的构造函数{InitializeComponent(); //初始化窗体组件(按钮 文本等)}private void label1_Click(object sender, EventArgs e){}private void hWindowControl_yuanshi_HMouseMove(object sender, HalconDotNet.HMouseEventArgs e){}/// <summary>/// 图片的成员变量 // 程序里有两个私有成员变量ho_image 和 MinGray、 MaxGray,分别用来保存读取图像数据和灰度阈值的范围/// </summary>private HObject ho_image;//处理读取图像的按钮点击事件private void button_readImage_Click(object sender, EventArgs e){//从指定路径读取图像、并将图像数据保存在ho_image中HOperatorSet.ReadImage(out ho_image, "D:\\VisualStudio\\yujiahong1\\图片\\邓紫棋.png");HTuple width, height;//获取图像的宽度和高度,并将他们保存在width和height 变量中。HOperatorSet.GetImageSize(ho_image, out width, out height);//设置显示图像的区域,这里设置成显示整个图像HOperatorSet.SetPart(hWindowControl_yuanshi.HalconWindow,0, 0, height - 1, width - 1);//显示(将图像显示在窗体上的控件(即定义的hWindowControl_yuanshi)中)HOperatorSet.DispObj(ho_image, hWindowControl_yuanshi.HalconWindow);}// 这里提一下,HTuple是通用的数据容器,不同类型的数据皆可存储(如int、double、string 等)HTuple MinGray;HTuple MaxGray;//处理阈值分割的按钮点击事件private void button_yuzhifenge_Click(object sender, EventArgs e){//if(ho_image == null)检查是否已经读取了图像,如果没有读取到图像,就自动调用读取图像的按钮事件if (ho_image == null){button_readImage_Click(null, null);}//设置颜色//HOperatorSet.SetColorMaxGray = int.Parse(textBox_Maxgunrn.Text);MinGray = int.Parse(textBox_Mingunrun.Text);HObject Region;//对图像进行阈值分割,HOperatorSet.Threshold(ho_image, out Region, MinGray, MaxGray);HTuple width, height;HOperatorSet.GetImageSize(ho_image, out width, out height);//窗体句柄,设置显示范围HOperatorSet.SetPart(hWindowControl_threson.HalconWindow, 0, 0, height - 1, width - 1);//分割下来的图像显示在hWindowControl_threson控件中HOperatorSet.DispObj(Region,hWindowControl_threson.HalconWindow) ;}private void textBox_Mingunrun_TextChanged(object sender, EventArgs e){}private void Form1_Load(object sender, EventArgs e){}}
}
1.代码中注意的点就是:编写代码图片时,可能网上下载的图片不太支持,读取识别报错,这个是因为图片大小问题,选择你的图片,截屏发到微信或者QQ,保存到文件路径中即可,一般图片用.png,
2。注意的是 灰度识别中的阈值分割,图片用灰度图更好。
第五步:运行程序
- 构建并运行项目。
- 点击“读取图像”按钮,选择图像文件。
- 在文本框中输入阈值范围的最小和最大灰度值(代码里面自动设置了范围的,若要更改请阈值范围,在点击读取图像前更改)。
- 点击“阈值分割”按钮,查看分割后的图像。
总结
通过此次保姆级教程,你已经创建了一个基本的 C# Windows 窗体应用程序,它能够读取图像并在界面中展示原始图像和阈值分割后的图像。这是机器视觉应用中的一个重要基础,未来你可以基于此扩展更多功能,比如对象检测、边缘检测等。
上图是博主,C#与Halcon的梦幻联动成功的截图,需要源代码或文件的,可以主页找博主,分享给一路学习,一路奋进的你们。
我相信,你们的点赞、关注和评论是支持我前进的最大动力,我会在这里更新我的学习之路,希望我的学习路程会对你们有一定帮助。
相关文章:

保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)
经历上一篇《零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功》的发布已经过去三天啦, 零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功_添加halcondotnet.dll-CSDN博客 在友友的催更下…...

Kotlin学习-01创建kotlin学习环境
安装idea https://www.jetbrains.com/zh-cn/ 创建项目 选择kotlin 修改Main.kt fun main() {print("Hello World!") }运行...

NGINX 之 location 匹配优先级
章节 1 NGINX 的源码安装 2 NGINX 核心配置详解 3 NGINX 之 location 匹配优先级 4 NGINX 基础参数与功能 目录 1 location 基础语法 1.1 location 语法说明表 1.2 URI部分简单介绍 2 location 匹配优先级 2.1 URI匹配的规则与顺序 2.2 精确匹配(location /1.txt) 2.3 区…...

算法_字符串专题---持续更新
文章目录 前言最长公共前缀题目要求题目解析代码如下 最长回文子串题目要求题目解析代码如下 二进制求和题目要求题目解析 字符串相乘题目要求题目解析代码如下 前言 本文将会向你介绍有关字符串的相关题目:最长公共前缀、最长回文子串、二进制求和、字符串相乘。本…...

Anaconda与conda、pip与conda的区别
Anaconda与conda、pip与conda的区别 1. 引言1.1 背景介绍1.2 文章目的 2. 什么是Anaconda?2.1 Anaconda简介2.2 Anaconda的优势2.3 Anaconda的安装与配置 3. 什么是Conda?3.1 Conda简介3.2 Conda的功能和用途3.3 Conda与Anaconda的关系 4. 什么是Pip&…...

odoo Request Entity Too Large
在数据库恢复中,文件有256M大小,无法正常恢复下。显示如下: 解决办法: 修改http.py文件里面的 DEFAULT_MAX_CONTENT_LENGTH参数, odoo\http.py DEFAULT_MAX_CONTENT_LENGTH 128 * 1024 * 1024 # 128MiB 修改为300M,即…...

【C++ 面试 - 面向对象】每日 3 题(六)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...

基于tcp c/s的网络通信
TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数 据无误、数据无丢失、数据无失序、数据无重复到达的通信) tcp协议特点: 1. 面向连接 //类似打电话通话之前 ,必须先打通 2. 可靠传输 …...

论文翻译:Universal and Transferable Adversarial Attacks on Aligned Language Models
Universal and Transferable Adversarial Attacks on Aligned Language Models https://arxiv.org/pdf/2307.15043v2 通用且可转移的对抗性攻击对齐语言模型 文章目录 通用且可转移的对抗性攻击对齐语言模型摘要1 引言2 一个针对LLMs的通用攻击2.1 产生肯定回应2.2 贪婪坐标梯…...

Axure RP 9高手速成秘籍:解锁终极快捷键,设计效率飙升10倍!
Axure RP 9作为一款功能强大的原型设计工具,提供了丰富的快捷键来加速设计流程。以下是一份详尽的Axure RP 9快捷键大全,旨在帮助用户更高效地完成设计工作。 一、文件操作 新建:Ctrl N(Windows)/ Command N&#…...

Springcloud从零开始--Eureka(一)
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有…...

[数据集][目标检测]agvs仓储机器人检测数据集VOC+YOLO格式967张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):967 标注数量(xml文件个数):967 标注数量(txt文件个数):967 标注类别…...

(八)Flink Join 连接
在分布式数据处理中,JOIN 是一个非常重要的操作。Flink 的 JOIN 是用于将两个数据流按照一定的条件进行连接,生成新的数据流。Flink 双流 JOIN 主要分为两大类:一类是基于窗口的 JOIN 操作,另一类是基于原生 State 的 Connect 算子操作。其中基于窗口的 JOIN 可细分为 Wind…...

你也想转行成为一名程序员吗?作为过来人的我希望你想清楚这几个问题再做决定
1 有个朋友突然找我:“现在的工作不想干了,我现在转行搞IT能不能行?学哪个编程语言比较有前景?现在去搞网络安全应该没问题吧?”我相信,很多人出于各种原因都在考虑要不要进行职业转换,迷茫又焦…...

Linux文件属性和打包压缩详解
1、文件属性体系 1.1 文件系统概述 [rootyunwei /]# ls -lhi 总用量 72K3505 lrwxrwxrwx. 1 root root 7 3月 7 2019 bin -> usr/bin 262152 dr-xr-xr-x. 5 root root 4.0K 12月 19 16:00 boot 399635 drwxr-xr-x 2 root root 4.0K 11月 5 2019 data1026 drw…...

微服务注册到nacos时,注册失败报错解决
微服务注册到nacos时,注册失败报错解决 微服务注册nacos时报错nacos报错alipay-jraft.log日志报错原因排查 微服务注册nacos时报错 NacosException: failed to req API:/nacos/v1/ns/instance/list after all servers([127.0.0.1:28100]) tried: ErrCode:503, ErrM…...

基于Sringboot+Vue个人驾校预约管理系统--论文pf
TOC springboot503基于SringbootVue个人驾校预约管理系统--论文pf 第1章 绪论 1.1选题动因 当前的网络技术,软件技术等都具备成熟的理论基础,市场上也出现各种技术开发的软件,这些软件都被用于各个领域,包括生活和工作的领域。…...

python-逆序数(赛氪OJ)
[题目描述] 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。比如一个元素个数为 4 的数列,其元素为 2,4,3,1,则 (2,…...

PCIE-flit mode retry
下一个即将发送的seq num: 下一个即将发送的ack或者nak的seq num: Tx发送exp seq num的个数: Tx发送nak的个数 下一个期望收到的flit的seq num,注意是指下个期望收到的有效的、non-idle、non_duplictae的flit: 收到的flit的真实的seq num(implicit…...

使用Obsidian实现Anki快速制卡
文章目录 前言准备双双启用遇到问题查看是什么问题解决问题 开始使用使用前的一些设置快速制卡 前言 我现在使用 Anki 的同时也使用 Obsidian,正好可以通过插件来让这两个十分好用的软件实现联动。 在 Obsidian 中实现 Anki 的快速制卡。 准备 首先要在这两个软…...

Python编程:从入门到实践书籍介绍
对于Python入门的书籍推荐,以下是五本详细讲解的书籍,它们各自具有不同的特点和适用对象: 1. 《Python编程:从入门到实践》 作者:埃里克马瑟斯(Eric Matthes)《Python编程:从入门到实践》是一本经典的Pyth…...

Vue 3 的 emit 简单使用
在 Vue 3 中使用 emit,子组件可以将事件通知父组件,父组件可以在响应这些事件时执行特定的逻辑。 emit 是一种非常灵活的通信方式,允许组件之间以解耦的方式进行交互。 1. 基本用法 1、使用 defineEmits 子组件 <template><div…...

java在实际开发中反常识bug
目录 1.背景 2.案例 1.包装类型拆箱导致空指针异常 2.switch传入null,导致空指针异常 3.Arrays.asList添加异常 4.转BigDecimal类型时精度丢失 5.除以0不一定抛异常 6.Steam filter后集合修改,会修改原数据 3.完美&评论 1.背景 这篇博客,将列举本人在实际开发中看…...

java多线程(三)重排序与Happens-Before
一、重排序 1.1 指令重排定义和含义 定义:重排序是指编译器和处理器为了提高程序执行效率,在不改变单线程程序执行结果的前提下,对指令执行顺序进行重新排列的一种优化手段。 重排序可以发生在编译器优化阶段,也可以发生在处理…...

RUST知识框架与学习框架
RUST知识框架与学习框架 Rust是一门系统级编程语言,以其内存安全、高性能和并发性而著称,特别适用于开发低级系统、网络服务和并发应用,具有广泛应用前景。 一、Rust知识框架 基础语法与核心概念 变量与类型:包括基本数据类型、…...

git cherry-pick命令使用分享
在日常开发中,有时候会遇到一种情况,线上出了问题,但是现在的预生产环境(Pre-production Environment)或准生产环境(Stage Environment)有还未通过验收的内容,那么想进行修复可以选择…...

关闭Chrome快捷键
chrome是没办法改变快捷键以及屏蔽快捷键的,需要安装插件:shortkey 保证插件是开启的 不用做其他设置所有快捷键已被关闭...

常见DDoS攻击之零日漏洞Zero-day Attacks
目录 一、什么是零日漏洞Zero-day Attacks 二、零日漏洞是如何转化为零日攻击的 三、常见的零日攻击类型 四、为什么零日攻击很危险 五、著名的零日攻击事件 六、如何降低零日攻击的风险 七、DDoS攻击防御解决方案(定制化) 7.1 产品优势 7.2 产品…...

【字符串】Z函数 - 模板
z [ i ] z[i] z[i] 表示字符串 s s s 和 s [ i , n − 1 ] s[i,\ n - 1] s[i, n−1] 的最长前缀的长度,特别的, z [ 0 ] 0 z[0]0 z[0]0 // *********Z函数************** // - 时间复杂度 O(n) vector<int> z_function(string s) {int n (int…...

MySQL范围分区分区表
什么是范围分区分区表? 范围分区是一种根据某个列的范围值来分割表数据的分区方式。在范围分区中,每个分区都有自己的范围条件,当插入数据时,MySQL会根据指定的范围条件将数据分配到相应的分区中。这种分区方式可以使得表的数据按…...