C#halcon联合开发----普通阈值分割与自动阈值分割的封装

一、在成功创建Windows窗体应用(.NET framework)及成功调用halcondotnet.dll文件后

1.创建基础窗口及按键

2.创建两个个新类,一个用来封装,一个用来调用代码

3.首先在ImageHelper类中写入读取图片的方法

       这里是写一个静态方法,用于读取图像文件,并在窗口中显示图像。方法的参数包括输出参数hImage,用于存储读取的图像对象;字符串参数filename,用于指定要读取的图像文件的路径;HWindow类型的参数window,用于指定图像显示的窗口。

       (1).HOperatorSet.ReadImage方法读取filename路径中的图像文件,并将结果存储在hImage变量中。

      (2).HOperatorSet.GetImageSize方法获取图像的宽度和高度,存储在width和height变量中。

     ( 3).HOperatorSet.SetPart方法设置图像显示的范围,参数包括窗口、左上角和右下角的坐标。

      (4).HOperatorSet.DispObj方法在窗口中显示图像。

通过try {}   catch{}输出异常处理

异常处理部分,如果读取图像出现异常,会将hImage设为null,并返回false,表示读取失败。

public static bool ReadImage(out HObject hImage, string filename, HWindow window)
{
    try
    {//从路径中读取图片并输出
        HOperatorSet.ReadImage(out hImage, filename);
        //设置长宽
        HTuple width, height;               
        //从图片中输出并设置在后面图片显示的窗体中
        HOperatorSet.GetImageSize(hImage, out width, out height);                      
        HOperatorSet.SetPart(window, 0, 0, (height - 1), (width - 1));             
        HOperatorSet.DispObj(hImage, window);
        return true;

    }
    //查找错误并返回空值
    catch
    {
        hImage = null;
        return false;
    }
}

4.给读取图片的按键设置点击事件,并写入图片读取显示函数使其能够点击并显示图片

(1).首先设置HObject变量ho_image,HObject是Halcon图像库中的一个类,用来表示图像对象。

(2).定义了一个字符串变量filename,并给它赋值

(3).调用Algorithm.ImageHelper类中的ReadImage方法

  (4).判断result的值来确定ReadImage方法是否执行成功。如果result为true,则表示成功读取图像;否则,弹出一个对话框显示"Algorithm.ImageHelper.ReadImage 失败"

  private HObject ho_image;
  private void button1_Click(object sender, EventArgs e)
  {
      string filename = "E:\\cad\\模板匹配图片\\metal-parts-06.png";
      bool result = Algorithm.ImageHelper.ReadImage(out ho_image, filename, hWindowControl1.HalconWindow);
      if (result != true)
      {
          MessageBox.Show(" Algorithm.ImageHelper.ReadImage 失败");
      }
  }

5.阈值分割这里分为 普通阈值分割:HOperatorSet.Threshold(hImage, out Region, minGray, maxGray);

和自动阈值分割:HOperatorSet.BinaryThreshold(hImage, out Region, "max_separability", " dark",out s);

其中的主要参数有普通阈值分割的最大最小灰度值,自动阈值分割分割的方法max_separability,smooth_histo,还有采用的亮暗划分。

        因此ThreSholdDef类中写入三个枚举类型,并通过重载构造函数将两个分割方式的参数分别传入

namespace Algorithm
{
    public enum 阈值分割方式
    {
        Threshold = 0,
        BinaryThreshold = 1,
    }
    public enum 自动阈值分割方法
    {
        max_separability = 0,
        smooth_histo = 1,
    }
    public enum 亮或暗
    {
        dark = 0,
        light = 1
    }

 
    public class ThreSholdDef
    {
        public ThreSholdDef(int minGray, int maxGray)
        {
            _Segment = 阈值分割方式.Threshold;
            _MaxGray = maxGray;
            _MinGray = minGray;
        }
        public ThreSholdDef(自动阈值分割方法 segmentMothd, 亮或暗 lightOrDark)
        {
            _Segment = 阈值分割方式.BinaryThreshold;
            _SegmentMothd = segmentMothd;
            _LightOrDark = lightOrDark;
        }
       
        public 阈值分割方式 _Segment;
       
        public int _MaxGray;
        public int _MinGray;    
        public 自动阈值分割方法 _SegmentMothd;
        public 亮或暗 _LightOrDark;
    }
}

6.在将参数封装后,再在ImageHelper中调用并写入方法,通过ThreSholdDef Def调用

开始先给Region赋予空值,再根据阈值分割的方式分别进行操作

1,如果Def._Segment是Threshold,调用HOperatorSet.Threshold方法,使用参数Def._MinGray作为阈值进行图像分割。

2,如果Def._Segment是BinaryThreshold,调用HOperatorSet.BinaryThreshold方法,使用参数Def._SegmentMothd和Def._LightOrDark作为分割方法和光暗模式,并将结果保存在输出图像Region中。

3,如果Def._Segment不是上述两种方式,返回false。

注:因为参数封装在ThreSholdDef类中是枚举类型,而在ImageHelper中引用的“阈值分割方法”和“亮或暗”为字符串类型,因此需要ToString()去修饰改为字符输出。

  public static bool Threshold_all(HObject hImage, out HObject Region, ThreSholdDef Def)
  {
      Region = null;

      switch (Def._Segment)
      {
          case 阈值分割方式.Threshold:

              HOperatorSet.Threshold(hImage, out Region, Def._MinGray, Def._MinGray);
              break;
          case 阈值分割方式.BinaryThreshold:
              HTuple s;
              HOperatorSet.BinaryThreshold(hImage, out Region, Def._SegmentMothd.ToString(), Def._LightOrDark.ToString(),out s);
              break;
          default:
              return false ;
      }
      return true; ;
  }

7.最后再在阈值分割按键中创建点击事件,并且调用ThreSholdDef中的参数,再将参数引用至

ImageHelper类中的Threshold_all方法。

  private void button2_Click(object sender, EventArgs e)
  {
      string filename = "E:\\cad\\模板匹配图片\\metal-parts-06.png";
      bool result = Algorithm.ImageHelper.ReadImage(out ho_image, filename, hWindowControl1.HalconWindow);
      HObject Region;
      Algorithm.ThreSholdDef btd = new Algorithm.ThreSholdDef(自动阈值分割方法.max_separability, 亮或暗.dark);
      Algorithm.ImageHelper.Threshold_all(ho_image,out  Region,btd);
      HOperatorSet.DispObj(Region, hWindowControl1.HalconWindow);


  }

二、结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值