halcon与C#混合编程进阶版

时间:2022-01-24 20:24:50
这篇主要是C#和Halcon的混合编程,在此基础上对按键不同功能的划分,以及图片适应窗口和从本地打开图片。
新手来这里:http://www.cnblogs.com/badguy518/p/5515054.html
halcon源程序:
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'C:/Users/Administrator/Desktop/猫.jpg')
dev_display(Image)
get_image_size(Image, Width, Height)
rgb3_to_gray(Image, Image, Image, ImageGray)
dev_display(ImageGray)
注意:写halcon程序时,如果过程中的图片需要显示出来,则需要在每个过程中都添加dev_display(**)

第一步:导出C#程序,建立项目,并添加此类

//
//  File generated by HDevelop for HALCON/DOTNET (C#) Version 10.0
//
//  This file is intended to be used with the HDevelopTemplate or
//  HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c#
using System;
using HalconDotNet;
public partial class HDevelopExport
{
  public HTuple hv_ExpDefaultWinHandle;
  // Main procedure 
  private void action()
  {
    // Local iconic variables 
    HObject ho_Image, ho_ImageGray;
    // Local control variables 
    HTuple hv_Width, hv_Height;
    // Initialize local and output iconic variables 
    HOperatorSet.GenEmptyObj(out ho_Image);
    HOperatorSet.GenEmptyObj(out ho_ImageGray);
    //dev_open_window(...);
    ho_Image.Dispose();
    HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");
    HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
    HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
    ho_ImageGray.Dispose();
    HOperatorSet.Rgb3ToGray(ho_Image, ho_Image, ho_Image, out ho_ImageGray);
    HOperatorSet.DispObj(ho_ImageGray, hv_ExpDefaultWinHandle);
    ho_Image.Dispose();
    ho_ImageGray.Dispose();
  }
  public void InitHalcon()
  {
    // Default settings used in HDevelop 
    HOperatorSet.SetSystem("do_low_error", "false");
  }
  public void RunHalcon(HTuple Window)
  {
    hv_ExpDefaultWinHandle = Window;
    action();
  }
}

第二步:布局设计

本程序需要显示图片的halconWindow控件和读图以及处理图片的两个button控件;如下图:
halcon与C#混合编程进阶版

第三步:将导出的类进行框架分解

如果想在程序中添加不同的按键,比如一个用来打开图片,一个用来处理图片,则就需要将halcon导出的类进行分解;
框架如下:
//定义变量
//初始化halcon
 public void InitHalcon()
  {
   //初始化halcon程序
  }
//读取图片
public void ReadPicture(HTuple Window)
{
//读图程序

}
//处理图片
 public void Process()
{

//处理程序
}

第四步:填补框架

将对应框架下得程序进行填补操作(下边程序可以代替public partial class HDevelopExport下的所有程序):
//定义变量
public HTuple hv_ExpDefaultWinHandle;
HObject ho_Image, ho_ImageGray;
HTuple hv_Width, hv_Height;
//初始化halcon
public void InitHalcon()
  {
    // Default settings used in HDevelop 
    HOperatorSet.SetSystem("do_low_error", "false");
  }
public void ReadPicture(HTuple Window)
{
    //读图并显示
   hv_ExpDefaultWinHandle = Window;
   HOperatorSet.GenEmptyObj(out ho_Image);
    ho_Image.Dispose();
    HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");
    HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
    HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);

}
 public void Process()
{
    //处理程序
   HOperatorSet.GenEmptyObj(out ho_ImageGray);
    ho_ImageGray.Dispose();
    HOperatorSet.Rgb3ToGray(ho_Image, ho_Image, ho_Image, out ho_ImageGray);
    HOperatorSet.DispObj(ho_ImageGray, hv_ExpDefaultWinHandle);
    ho_Image.Dispose();
    ho_ImageGray.Dispose();
}

第五步:在主程序Form1.cs中添加程序:

①在主程序Form1的类下对刚才添加的类进行实例化:
HDevelopExport hd = new HDevelopExport();
②在按键下添加相应程序
 private void button1_Click(object sender, EventArgs e)
 {
       hd.ReadPicture(hWindowControl1.HalconWindow);
  }
 private void button2_Click(object sender, EventArgs e)
{
      hd.Process();
 }
此步骤完成之后,程序可以运行。

附加步骤1:

在以上程序中,已经可以将图片显示出来,并进行处理,但由于窗口与图片的大小不一致,导致在显示窗口中不能适应程序窗口的大小,下面是解决此类问题的方法:
在读图程序中,将获取图片的大小的程序HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);放在显示图片之前,并在显示图片程序之前加入下面程序:
HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height - 1, hv_Width - 1);然后图片就可以适应窗口大小。
此步骤也可以在halcon中更改。

附加步骤2:

如果想在程序中能够打开本地文件夹的图片进行处理,则需要改以下程序:
注意:①②是添加的类中③④是主程序中
①将public void ReadPicture(HTuple Window)的括号中加入参数,改为public void  ReadPicture(HTuple Window, string ImagePath)
②将 ReadPicture下的程序 HOperatorSet.ReadImage(out ho_Image, "C:/Users/Administrator/Desktop/猫¨.jpg");改为HOperatorSet.ReadImage(out ho_Image, ImagePath);
③主程序中定义变量string ImagePath
④将button1的程序改成如下:
     private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog1 = new OpenFileDialog();
            openFileDialog1.Filter ="JPEG文件|*.jpg*|BMP文件|*.bmp*";
            openFileDialog1.RestoreDirectory = true;
            openFileDialog1.FilterIndex = 1;
            if (openFileDialog1.ShowDialog() == DialogResult.OK)
            {
                ImagePath = openFileDialog1.FileName;
                hd.ReadPicture(hWindowControl1.HalconWindow, ImagePath);
            }
        }
接下来可以试试运行程序。
参考地址:http://www.cnblogs.com/badguy518/p/5515054.html