halcon與C#混合編程進階版


這篇主要是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導出的類進行分解;
框架如下:
//定義變量
//初始化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





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM