超级保姆级教程:零基础学习如何用 C# 和 Halcon 在 Windows 窗体中实现图像加载与特征选择-2

3 篇文章 0 订阅
2 篇文章 0 订阅

一、 前言:

         当我开始编写这篇教程的时候,内心充满了复杂的情感。首先是责任感,毕竟我曾经在学习 C# 和 Halcon 的过程中,也经历了很多迷茫与困惑。看着市面上零散的教程和复杂的技术资料,我深知初学者有多么不容易。那些艰涩的代码,那些不够详细的解释,让学习变得异常困难。我一直在思考,是否有必要把自己花费2万元和四个月时间所学的知识分享出来。最终,我决定不再犹豫,毅然提笔,开始记录我的学习之路。
        在接下来的更新中,我会尽量将每一个步骤、每一行代码都解释得清清楚楚,尽量做到没有一丝遗漏。希望我的保姆级教程(胎儿级教程)能够成为大家学习的好帮手,让你们在这段学习旅程中少走弯路。也希望我的努力和热情,能够点亮更多对机器视觉感兴趣的朋友们。
        虽然目前我还在学习的过程中,但我坚信,分享不仅仅是为了别人,更是对自己知识的一种巩固与检验。因此,我将毫无保留地更新我的学习心得与经验。(希望有一天,能在 CSDN 机器视觉圈遇到有成之士,做下我的伯乐),让我的努力不再孤独。
我会继续坚持更新,为大家提供最细致的教程和最真诚的分享。你的每一个点赞、每一个关注,都是我继续前行的动力。

经历上两篇《零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功》过去4天,昨天又发布了《保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)》的教程,感触颇多。望各位有志之士,能在这个上面学到一些经验吧。我们互相学习。

零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功-CSDN博客

保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)-CSDN博客

正文:

        在这篇教程中,我将带领大家从零开始,逐步实现一个使用 C# 与 Halcon 的 Windows 窗体应用程序。这个应用程序将能够加载图像,并根据用户选择的特征对图像进行阈值分割处理。无论你是初学者还是有一定基础的开发者,这篇保姆级教程都能帮助你轻松理解和实现这些功能。

二、为什么选择 C# 和 Halcon?
  1. 简单介绍什么是 C# 和 Halcon,为什么它们在机器视觉领域中广泛使用。

  2. 阐述本文的目标:手把手教你如何使用 C# 和 Halcon 创建一个简单的 Windows 窗体程序,实现图像加载和特征选择功能。
三、环境准备:从零开始搭建你的开发环境

  1. 下载与安装 Visual Studio
    • 详细步骤,包括从官网下载 Visual Studio,如何选择正确的组件,安装过程中可能遇到的问题及解决方法。
    • 安装 Halcon 并配置项目
      • 下载并安装 Halcon,确保你有 Halcon 的安装包,并逐步指导安装过程。
      • 配置 Halcon 在 C# 项目中的引用,如何找到 HalconDotNet.dll,并将其添加到项目中。
      • 确保 Halcon 的库文件和环境变量设置正确,以防止出现运行时错误。

这个上面的环境配置.dll 操纵方式都在《零基础小白实现C#调用halcon dll的过程,并测试程序证明C#halcon联合开发成功》文章中,(全是胎儿级版本)我这里就不过多去赘述。

下面来跟着博主来一起操作吧!搞起来!搞起来!搞起来!

这个教程特别适合初学者,内容详细且易于理解。

四、项目创建与界面设计:从界面到功能,一个不落
1. 创建页面
        第一步:创建 C# Windows Forms 项目(创建这部分看上一篇文章,博主就在上一篇的文章基础上加入一个Form2窗体即可,做出如何使用 C# 和 Halcon 创建一个简单的 Windows 窗体程序,实现图像加载和特征选择功能)

保姆级-C#与Halcon的窗体界面展示阈值分割图像教程(机器视觉保姆级教程)-CSDN博客

现在界面有Form1的样子。

1.创建Form2窗体,创建一个新的“Windows Forms 应用Form2窗体”项目。

  2.命名窗体,自行命名(遵循C语言文件命名规范),这里就命名为Form2

      

2.添加控件并设计界面

  • 添加控件并设计界面
    • 为每个控件命名,并解释它们的作用,如 button_readImage 用于加载图像,ComboBox_feature 用于选择图像特征。
  • 使用截图展示每一步界面设计,确保读者可以轻松跟随。
  • 详细指导如何在窗体上添加按钮 (Button)、文本框 (TextBox)、组合框 (ComboBox)、图像显示控件 (HWindowControl) 等。

          上面的设计操作参照上一篇文章

2. 初始化控件

在窗体的构造函数中,初始化 ComboBox_feature,并为其添加选项。这些选项代表我们可以选择的图像特征。

 public Form2()
 {
     InitializeComponent();
     ComboBox_feature.Items.Add("area");
     ComboBox_feature.Items.Add("circularity");
     ComboBox_feature.Items.Add("rectangularity");
     //选择首选项
     ComboBox_feature.SelectedIndex = 0;


 }

通过这种方式,用户可以从下拉菜单中选择他们感兴趣的图像特征。

就像这样:

3. 实现图像加载功能

接下来,我们将为按钮 (button1) 实现图像加载功能。当用户点击按钮时,程序将弹出一个文件选择对话框,让用户选择要加载的图像。选定图像后,程序会使用 Halcon 的 ReadImage 函数读取图像,并在 HWindowControl 中显示出来。

  //阈值分割颜色
  HOperatorSet.SetColor(hWindowControl_yuanshi.HalconWindow, "green");
  OpenFileDialog openFileDialog = new OpenFileDialog();

  if (openFileDialog.ShowDialog() == DialogResult.OK)
  {
      MessageBox.Show(openFileDialog.FileName);
  }

  HOperatorSet.ReadImage(out ho_image, "D:\\chongqi\\TUPIAN\\2024-7-31\\clip.png");

在这段代码中,当用户选择图像后,程序将该图像加载到 ho_image 变量中,并在 Halcon 窗口控件中显示。HTuple 用于存储图像的宽度和高度信息,并设置显示区域。

4. 实现特征选择与阈值分割

在加载图像后,我们还可以根据用户选择的特征对图像进行阈值分割处理。你可以进一步扩展程序,允许用户输入最大值和最小值,并使用 Threshold 函数对图像进行分割。

 HTuple width, height;
 HOperatorSet.GetImageSize(ho_image, out width, out height);

 HOperatorSet.SetPart(hWindowControl_yuanshi.HalconWindow, 0, 0, height - 1, width - 1);

 //阈值分割
 HObject Region;

 //显示
 HOperatorSet.DispObj(ho_image, hWindowControl_yuanshi.HalconWindow);

在这段代码中,用户输入的阈值范围将用于对图像进行分割处理,处理后的图像区域将显示在 Halcon 窗口中。

我代码里面做了防呆测试,防止用户误触,从而跳出运行。

            OpenFileDialog openFileDialog = new OpenFileDialog();
           
            if(openFileDialog.ShowDialog()==DialogResult.OK) 
            {
                MessageBox.Show(openFileDialog.FileName);
            }

完整代码:

using HalconDotNet;
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;

namespace 第一个联合项目
{

    public partial class BlobForm : Form
    {
        public BlobForm()
        {
            InitializeComponent();


            // comboBoxs--->一个个加了三个选项
            comboBox_feature.Items.Add("area");
            comboBox_feature.Items.Add("circularity");
            comboBox_feature.Items.Add("rectangularity");
            //选择首个选项
            comboBox_feature.SelectedIndex = 0;
        }

        HObject ho_image;
        private void button_readImage_Click(object sender, EventArgs e)
        {


            HOperatorSet.SetColor(hWindowControl_yuanshi.HalconWindow, "green");

            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                HOperatorSet.ReadImage(out ho_image, openFileDialog.FileName);

            }
            HTuple width, height;
            //获得图片的宽高
            HOperatorSet.GetImageSize(ho_image, out width, out height);

            //设置显示范围
            //HWindowControl.HalconWindow -->控件的句柄  设置显示范围
            HOperatorSet.SetPart(hWindowControl_yuanshi.HalconWindow, 0, 0, (height - 1), (width - 1));

            //阈值分割
            HObject Region;
            HOperatorSet.Threshold(ho_image,out Region,0,50);
            //打散
            HObject ConnectionRegion;
            HOperatorSet.Connection(Region, out ConnectionRegion);
            //特征筛选
            HObject SelectRegion;
            //HOperatorSet.SelectShape(ConnectionRegion,out SelectRegion, "area","and", 3227.85, 7897.33);
            HOperatorSet.SelectShape(ConnectionRegion, out SelectRegion, comboBox_feature.SelectedItem.ToString(), "and",Double.Parse(textBox_Min.Text), Double.Parse(textBox_Max.Text));
           
           //显示
           HOperatorSet.DispObj(ho_image, hWindowControl_yuanshi.HalconWindow);
            HOperatorSet.DispObj(SelectRegion, hWindowControl_yuanshi.HalconWindow);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //获得comboBox下拉选项
            MessageBox.Show(comboBox_feature.SelectedItem.ToString());
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
           
            if(openFileDialog.ShowDialog()==DialogResult.OK) 
            {
                MessageBox.Show(openFileDialog.FileName);
            }
        }
    }
}
5. 运行并测试

完成上述步骤后,运行程序,你将看到一个简单的界面,允许你选择图像、选择特征,并进行阈值分割操作。这个程序为进一步的图像处理和分析奠定了基础。

当我说注意时,你就要注意了哈,注意了哈,注意了哈 重要的事情说三遍

注意:

      1.测试图片用灰度图 (便于区分,其他图像也可以但是效果不明显)

        2.要有面积区分 有特征的图像 

        3.遇到调试问题时不要慌,慢慢来,网上下载图像可能用不起(报错显示图片过大),解决方案是:把图片截屏发到微信 保存到自己路径即可

        4.一般的灰度图下载就可以用()

测试图片:

测试结果:

我这里也测一哈,不是灰度图的图片,试试代码的通用性。(胜天半子祁同伟)

   未来,充满了未知,也许有风雨,也许有阳光。但我会带着真挚的心,继续走写CSDN的路上,踏实而坚定。这并非一场豪情万丈的征途,而是一次真实而深刻的人生体验。

      愿我们的明星在未来的岁月中继续闪耀,愿我的梦想在星辰之下熠熠生辉,愿我所种下的每一颗种子都能在波涛汹涌中茁壮成长,愿我们都能在独行的路上找到自己的光芒,自己的星光。

总结

         通过本篇保姆级教程,你已经学会了如何使用 C# 和 Halcon 在 Windows 窗体中实现图像加载与特征选择的基础功能。我们从创建项目开始,一步步实现了一个功能完整的小程序。希望你能够通过本教程打下扎实的基础,继续深入学习机器视觉技术。如果你有任何问题或建议,欢迎在评论区留言。你的点赞、关注支持是我继续分享知识的最大动力!

        

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值