保姆级-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 的快速制卡。 准备 首先要在这两个软…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...