?
機器視覺檢測halcon與C#混合編程之環(huán)境配置
halcon源程序:
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'C:/Users/BadGuy/Desktop/貓.jpg')
dev_display(Image)
get_image_size(Image, Width, Height)
rgb3_to_gray(Image, Image, Image, ImageGray)
dev_display(ImageGray)
注意:寫halcon程序時,如果過程中的圖片需要顯示出來,則需要在每個過程中都添加dev_display(**)
第一步:導(dǎo)出C#-halcon./net 程序;(halcon11.0)
?
?
第二步:
新建C#窗體程序
?
第三步:
添加halcondotnet.DLL文件到引用中,并將halconwindow添加至工具箱;
步驟如下:
引用-添加引用-(找到halcon中的halcondotnet.DLL進行添加)
?
第四步:
在工具箱中添加halconWindow控件
打開工具箱,在空白處右鍵-選擇項-瀏覽,選擇下邊文件
?
第五步:
在Form1窗口添加一個button和halconWindow控件(工具箱中找halcon圖標)
?第五步:
將導(dǎo)出的程序添加至現(xiàn)有程序的類中(其中就包含using halcondotnet;);
點擊項目-添加-現(xiàn)有項-把剛才導(dǎo)出來的類添加進來
第六步:
在Form1.cs中,實例化剛才導(dǎo)進來的類:HDevelopExport HD = new HDevelopExport();
第七步:
在button_click中調(diào)用此類的方法:HD.RunHalcon(hWindowControl1.HalconWindow);
C#程序:
namespace Test_cat
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
HDevelopExport HD = new HDevelopExport();
private void button1_Click(object sender, EventArgs e)
{
HD.RunHalcon(hWindowControl1.HalconWindow);
?
}
}
}
?
注意:如果在win64 系統(tǒng)下,則需要將平臺更改為X64或者AnyCPU
?
halcon與C#混合編程之Halcon代碼調(diào)用
?
寫在前面
完成halcon與C#混合編程的環(huán)境配置后,進行界面布局設(shè)計構(gòu)思每一個按鈕所需要實現(xiàn)的功能,將Halcon導(dǎo)出的代碼復(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(**)
第一步:導(dǎo)出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控件;
?
第三步:將導(dǎo)出的類進行框架分解
?
如果想在程序中添加不同的按鍵,比如一個用來打開圖片,一個用來處理圖片,則就需要將halcon導(dǎo)出的類進行分解;
框架如下:
//定義變量
//初始化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)可以將圖片顯示出來,并進行處理,但由于窗口與圖片的大小不一致,導(dǎo)致在顯示窗口中不能適應(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);
? ? ? ? ? ? }
? ? ? ? }
試試運行程序吧。
?
?