完成halcon與C#混合編程的環(huán)境配置后,進行界面布局設(shè)計構(gòu)思每一個按鈕所需要實現(xiàn)的功能,將Halcon導出的代碼復(fù)制至相應(yīng)的C#模塊下即可。
?
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();
? }
}
第二步:布局設(shè)計
?
本程序需要顯示圖片的halconWindow控件和讀圖以及處理圖片的兩個button控件;
?
第三步:將導出的類進行框架分解
?
如果想在程序中添加不同的按鍵,比如一個用來打開圖片,一個用來處理圖片,則就需要將halcon導出的類進行分解;
框架如下:
//定義變量
//初始化halcon
?public void InitHalcon()
? {
? ?//初始化halcon程序
? }
//讀取圖片
public void ReadPicture(HTuple Window)
{
//讀圖程序
?
}
//處理圖片
?public void Process()
{
?
//處理程序
}
第四步:填補框架
?
將對應(yīng)框架下得程序進行填補操作(下邊程序可以代替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();
②在按鍵下添加相應(yīng)程序
?private void button1_Click(object sender, EventArgs e)
?{
? ? ? ?hd.ReadPicture(hWindowControl1.HalconWindow);
? }
?private void button2_Click(object sender, EventArgs e)
{
? ? ? hd.Process();
?}
此步驟完成之后,程序可以運行。
附加步驟1:
?
在以上程序中,已經(jīng)可以將圖片顯示出來,并進行處理,但由于窗口與圖片的大小不一致,導致在顯示窗口中不能適應(yīng)程序窗口的大小,下面是解決此類問題的方法:
在讀圖程序中,將獲取圖片的大小的程序HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);放在顯示圖片之前,并在顯示圖片程序之前加入下面程序:
HOperatorSet.SetPart(hv_ExpDefaultWinHandle, 0, 0, hv_Height - 1, hv_Width - 1);然后圖片就可以適應(yīng)窗口大小。
此步驟也可以在halcon中更改。
附加步驟2:
?
如果想在程序中能夠打開本地文件夾的圖片進行處理,則需要改以下程序:
注意:①②是添加的類中③④是主程序中
①將public void ReadPicture(HTuple Window)的括號中加入?yún)?shù),改為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);
? ? ? ? ? ? }
? ? ? ? }
接下來可以試試運行程序。
?