這篇主要是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