C#与Halcon联合编程之利用Halcon引擎调用函数
第一种,调用后缀为.hdev的Halcon文件
我们通常创建的Halcon文件其后缀就是.hdev,也就是在Halcon程序编辑器main标签页下所写的程序即Halcon的主程序。在C#中利用Halcon引擎调用主程序,可以不用将其导出。
准备工作:
添加引用:
将Halcon文件放入项目文件夹的Debug目录下。
准备工作完成后,就进行窗体的搭建和程序的编写。下面以一个小的程序示例来展示调用方法:
示例:
界面搭建:
代码:
private HDevOpFixedWindowImpl myHDevOpFixedWindowImpl;
private HWindow Window;
string ProgramPathString;
private HDevEngine MyEngine = new HDevEngine();
private HDevProgramCall ProgramCall;
private void Form1_Load(object sender, EventArgs e)
{
var ProcedurePath = @"\hdevengine\procedures";
ProgramPathString = @"\标定优化算法.hdev";
MyEngine.SetProcedurePath(ProcedurePath);
Window = hWindowControl1.HalconWindow;
Window.SetDraw("margin");
Window.SetLineWidth(4);
}
//Load Program按钮事件
private void button1_Click(object sender, EventArgs e)
{
myHDevOpFixedWindowImpl = new HDevOpFixedWindowImpl (Window);
MyEngine.SetHDevOperators(myHDevOpFixedWindowImpl);
try
{
var Program = new HDevProgram(ProgramPathString);
ProgramCall = new HDevProgramCall(Program);
MessageBox.Show("ok");
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
return;
}
catch
{
return;
}
}
//Execute Program按钮事件
private void button2_Click(object sender, EventArgs e)
{
try
{
ProgramCall.Execute();//执行程序
double area;
area = ProgramCall.GetCtrlVarTuple("Area");//获取程序中的某个参数
Window.SetTposition(150, 20);
Window.WriteString("area: " + area);
}
catch (HDevEngineException Ex)
{
MessageBox.Show(Ex.Message, "HDevEngine Exception");
}
}
第二种,调用后缀为.hdvp的Halcon文件即外部函数
准备工作同上,.hdvp的Halcon外部函数创建可参考此篇博客:Halcon外部函数创建方法
示例:
自己写了一个灰度化的外部函数命名为“dev_gray_image”,输入图像以及图像类型(rgb1或者rgb3),输出灰度后的图像。
代码:
private HDevOpFixedWindowImpl myHDevOpFixedWindowImpl;
private HWindow hWind;
private HDevEngine myEngine = new HDevEngine();
private void Form1_Load(object sender, EventArgs e)
{
var procedurePath = AppDomain.CurrentDomain.BaseDirectory;//路径为项目文件下的Debug目录
myEngine.SetProcedurePath(procedurePath);
hWind = hWindowControl1.HalconWindow;
hWind.SetDraw("margin");
hWind.SetColor("red");
hWind.SetLineWidth(1);
myHDevOpFixedWindowImpl = new HDevOpFixedWindowImpl(hWind);
myEngine.SetHDevOperators(myHDevOpFixedWindowImpl);
}
private void button1_Click(object sender, EventArgs e)
{
string procedureName = "dev_gray_image";
var procedure = new HDevProcedure(procedureName);
var procedureCall = new HDevProcedureCall(procedure);
HObject img = new HObject();
HTuple imgModel = new HTuple("rgb3");
HOperatorSet.ReadImage(out img, @"D:\文件收纳\images\桌面壁纸.jpeg");
pro.SetInputIconicParamObject("Image", img);//输入图像
pro.SetInputCtrlParamTuple("ImageModel", imgModel);//输入图像类型rgb3
pro.Execute();//运行函数
HObject grayimg = pro.GetOutputIconicParamObject("GrayImage");//获取灰度后的图像
HOperatorSet.DispObj(grayimg, hWind);
}
总结:
两种方法比较,第二种调用方法显然更好,其不但可以获取参数,还可设置参数,而第一种方法只能获取主程序中的参数。所以,我们可将写好的Halcon程序保存成外部函数,然后通过Halcon引擎来调用,方便快捷。