Halcon引擎呼叫一一C#呼叫Halcon外部函式
阿新 • • 發佈:2021-02-06
技術標籤:halcon影象處理
1.首先先引用這兩樣東西,它在Halcon安裝目錄下。例如:E:\Halcon12\bin\dotnet35
using HalconDotNet;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows. Forms;
namespace Halcon外部函式的引擎呼叫
{
public partial class Form1 : Form
{
private HDevEngine MyEngine = new HDevEngine();
//private HDevOpMultiWindowImpl MyHDevOperatorImpl;
HDevOpFixedWindowImpl MyHDevOperatorImpl;
private HWindow Window;
string ProgramPathString;
string ProcedurePath;
private HDevProgramCall ProgramCall;
private HDevProcedureCall ProcCall1;
private HDevProcedureCall ProcCall2;
Timer myTimer = new Timer();
public Form1()
{
InitializeComponent();
//var ProcedurePath = AppDomain.CurrentDomain.BaseDirectory;//設定路徑為Debug下
//MyEngine.SetProcedurePath(ProcedurePath);
ProcedurePath = @"C:\Users\shang\Desktop\C#\Halcon外部函式的引擎呼叫\procedures\";
//ProgramPathString = @"C:\Users\shang\Desktop\Halcon外部函式的引擎呼叫\procedures\主函式.hdev";
MyEngine.SetProcedurePath(ProcedurePath);
Window = hWindowControl1.HalconWindow;
Window.SetDraw("margin");
Window.SetLineWidth(3);
Window.SetColor("red");
CreateTimer();
}
private void button1_Click(object sender, EventArgs e)
{
MyHDevOperatorImpl = new HDevOpFixedWindowImpl(hWindowControl1.HalconWindow);
MyEngine.SetHDevOperators(MyHDevOperatorImpl);
try
{
//var Program = new HDevProgram(ProgramPathString);
//ProgramCall = new HDevProgramCall(Program);
//MyEngine.SetProcedurePath(ProcedurePath);
//var Program1 = new HDevProcedure("CreateShapeModel");
//var Program2 = new HDevProcedure("FindShapeModel");
MyEngine.SetProcedurePath(ProcedurePath);
ProcCall1 = new HDevProcedureCall(new HDevProcedure("CreateShapeModel"));
ProcCall2 = new HDevProcedureCall(new HDevProcedure("FindShapeModel"));
MessageBox.Show("ok");
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
return;
}
catch
{
return;
}
}
HTuple ModelId1;
HObject Image1;
private void button2_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
if (dlg.ShowDialog() == DialogResult.OK)
{
HOperatorSet.ReadImage(out Image1, dlg.FileName);
}
try
{
//HObject Image1;
//HOperatorSet.GenEmptyObj(out Image1);
//Image1.Dispose();
//HOperatorSet.ReadImage(out Image1, "C:/Users/shang/Desktop/圖示&影象/影象/影象/LOK/5.png");
ProcCall1.SetInputIconicParamObject("Image", Image1);
ProcCall1.SetInputCtrlParamTuple("WindowHandle", Window);
ProcCall1.Execute();
ModelId1 = ProcCall1.GetOutputCtrlParamTuple("ModelId");
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
}
}
private void button3_Click(object sender, EventArgs e)
{
myTimer.Start();
}
private void CreateTimer()
{
myTimer.Tick += new EventHandler(OnTimer);
myTimer.Interval = 500;
}
int _index = 0;
string[] _fileNames;
HTuple ModelScore;
private void OnTimer(object sender, EventArgs e)
{
myTimer.Stop();
if (_index == 0)
{
OpenFileDialog openDlg = new OpenFileDialog();
openDlg.Multiselect = true;
if (openDlg.ShowDialog() == DialogResult.OK)
{
_fileNames = openDlg.FileNames;
}
}
string fileName = _fileNames[_index];
HObject Image2;
HOperatorSet.GenEmptyObj(out Image2);
Image2.Dispose();
HOperatorSet.ReadImage(out Image2, fileName);
try
{
ProcCall2.SetInputIconicParamObject("Image", Image2);
ProcCall2.SetInputCtrlParamTuple("WindowHandle", Window);
ProcCall2.SetInputCtrlParamTuple("ModelId", ModelId1);
ProcCall2.Execute();
ModelScore = ProcCall2.GetOutputCtrlParamTuple("ModelScore");
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
return;
}
if (ModelScore.Length > 0)
{
label1.Text = "OK";
label1.ForeColor = Color.Green;
}
else
{
label1.Text = "NG";
label1.ForeColor = Color.Red;
}
_index++;
if (_index >= _fileNames.GetLength(0))
{
DialogResult dlgRes = MessageBox.Show("是否繼續檢測?", "詢問", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (dlgRes == DialogResult.No)
{
myTimer.Stop();
return;
}
_index = 0;
}
else
myTimer.Start();
}
}
}