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

保姆级-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。注意的是 灰度识别中的阈值分割,图片用灰度图更好。
第五步:运行程序
  1. 构建并运行项目。
  2. 点击“读取图像”按钮,选择图像文件。
  3. 在文本框中输入阈值范围的最小和最大灰度值(代码里面自动设置了范围的,若要更改请阈值范围,在点击读取图像前更改)。

  1. 点击“阈值分割”按钮,查看分割后的图像。

总结

     通过此次保姆级教程,你已经创建了一个基本的 C# Windows 窗体应用程序,它能够读取图像并在界面中展示原始图像和阈值分割后的图像。这是机器视觉应用中的一个重要基础,未来你可以基于此扩展更多功能,比如对象检测、边缘检测等。

上图是博主,C#与Halcon的梦幻联动成功的截图,需要源代码或文件的,可以主页找博主,分享给一路学习,一路奋进的你们。

我相信,你们的点赞、关注和评论是支持我前进的最大动力,我会在这里更新我的学习之路,希望我的学习路程会对你们有一定帮助。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 献给正在挣扎中的技术人!
  • Linux设置内网时间同步
  • C语言offsetof宏
  • Sublime Text 配置 Terminal (CMD)
  • 查看和访问信号记录数据
  • 【C语言】循环
  • 安装webman/admin记录
  • 采用ELK搭建日志平台,安装elasticsearch-head
  • Vue学习--- vue3 集成遇到的部分问题与解决
  • 小白之 FastGPT Windows 本地化部署
  • 案例:LVS-DR模式
  • 大模型备案全网最详细流程解读(附附件+重点解读)
  • 使用 Python 和 PyQt5 构建多线程图片下载器
  • 单HTML文件集成vue3+ElementPlus的使用
  • 构建高效NLP管道:PydanticOutputParser与Langchain的结合
  • 【Leetcode】101. 对称二叉树
  • Docker: 容器互访的三种方式
  • Golang-长连接-状态推送
  • Iterator 和 for...of 循环
  • leetcode-27. Remove Element
  • Lucene解析 - 基本概念
  • QQ浏览器x5内核的兼容性问题
  • Redis中的lru算法实现
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 扑朔迷离的属性和特性【彻底弄清】
  • 使用 @font-face
  • 思考 CSS 架构
  • 微信小程序实战练习(仿五洲到家微信版)
  • raise 与 raise ... from 的区别
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • (1)SpringCloud 整合Python
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)STL算法之元素计数
  • (42)STM32——LCD显示屏实验笔记
  • (第二周)效能测试
  • (二)JAVA使用POI操作excel
  • (回溯) LeetCode 40. 组合总和II
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (六)软件测试分工
  • (七)Activiti-modeler中文支持
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (三)docker:Dockerfile构建容器运行jar包
  • (十七)Flink 容错机制
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)N皇后问题
  • ../depcomp: line 571: exec: g++: not found
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .NET Core中的去虚
  • .Net MVC4 上传大文件,并保存表单
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递
  • .NET是什么