命名空间:netMarketing.vision.halcon.HalconEngine
功能:halcon引擎封装类
功能详细说明:
halcon引擎的作用是直接运行halcon的程序,包括如下:
单个hdev的程序,不含外部函数和用户自定义函数。调用函数RunHdevProgram()
hdvp格式的外部函数,它保存于磁盘上。调用函数RunHdvp()
即有hdev程序,又包含外部函数或者用户自定义函数。调用函数RunHdvpOrUserFunWithMain()
用引擎直接运行halcon程序的好处很多,包括:
简化C#端的代码
调试视觉逻辑方便(直接用halcon调试,不用修改C#端的任何代码)
避免内存溢出的bug
唯一担心的是:会不会相对于halcon的dll调用,引擎运行halcon程序速度不够快?
这个问题勇哥暂时查不到资料,因此会做一系列的实验,有了结果后会在此处续贴。
常用函数列表:
//构造函数,传入halcon窗体。异常:ArgumentNullException,ArgumentException,HDevEngineException,Exception public HalconEngine( Dictionary<string,HWindow> halconwin) /// 设置工作窗口 public void SetWorkWindow(string halconWinName) /// 取指定的名字的工作窗口 public HWindow GetWorkWindow(string halconWinName) /// 载入用户自定义函数或者外部函数。异常:ArgumentException,HDevEngineException,Exception public void LoadUserOrHdvpFunction(string[] mainFuncNamePath,string[] userFuncName) /// 取全部hdvp外部函数名列表 public string[] getHdvpProgramList() public string[] getUserProgramList() /// 取全部hdev主程序(文件加全路径串) 异常:ArgumentNullException public string[] getHdevProgramList() /// 取得外部函数名称列表 public List<string> GetProceduresNames() /// 取得内部函数(用户自定义函数)名称列表 public List<string> GetUserFunctionNames() /// 运行hdev主程序。 异常:HDevEngineException public List<object> RunHdevProgram(string hdevProgramName, params mainOutVarStruc[] outVar) /// 运行无hdev主程序的外部函数(hdvp格式) public List<object> RunHdvp(string hdvpProgramName, hdvpInputOutputParam inoutParam) /// 运行带主函数的外部函数或者自定义函数 public List<object> RunHdvpOrUserFunWithMain(string ProgramName, hdvpInputOutputParam inoutParam)
示例 :

本类的两个路径参数参考如下:
hdev主程序路径: C:\Users\Public\Documents\MVTec\HALCON-19.11-Progress\examples\hdevengine\hdevelop\fin_detection.hdev
hdvp外部函数路径:
C:\Users\Public\Documents\MVTec\HALCON-19.11-Progress\examples\hdevengine\procedures
它们是系统提供的示例程序。
初始化引擎的代码:
/// <summary>
/// 初始化halcon引擎
/// </summary>
private void initHalconEngine()
{
try
{
Dictionary<string, HWindow> dic = new Dictionary<string, HWindow>();
dic.Add("hwin1", hwin1.HalconWindow);
dic.Add("hwin2", hwin2.HalconWindow);
halconEng = new HalconEngine(dic);
pgridSetting.SelectedObject = null;
pgridSetting.SelectedObject = halconEng;
}
catch (ArgumentNullException ex)
{
MessageBox.Show(ex.Message);
}
catch (ArgumentException ex)
{
MessageBox.Show(ex.Message);
}
catch (HDevEngineException ex)
{
MessageBox.Show(ex.Message);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}(1)运行hdev程序
private void button14_Click(object sender, EventArgs e)
{
if (lbxHdevList.SelectedIndex >= 0)
{
var pname =DirFileHelper.GetFileName( lbxHdevList.SelectedItem.ToString());
var res = new List<object>();
if(pname.Length>5)
{
halconEng.SetWorkWindow("hwin1");
res =halconEng.RunHdevProgram(pname,
new HalconEngine.mainOutVarStruc()
{
varName = "FinArea",
varType = HalconEngine.mainOutputParamEnum.GetCtrlVarTuple
});
if(null!=res && res.Count>0)
{
double FinArea;
FinArea = (res[0] as HTuple).D;
var win = halconEng.GetWorkWindow("hwin1");
win.SetTposition(150, 20);
win.WriteString("Fin Area: " + FinArea);
}
}
}
}(2) 运行单个hdvp外部函数
private void button15_Click(object sender, EventArgs e)
{
if (lbxHdvpList.SelectedIndex >= 0)
{
var seltxt = lbxHdvpList.SelectedItem.ToString();
if (!seltxt.Equals("detect_fin")) { MessageBox.Show("在这个例子里,你只能选择外部函数detect_fin"); return; }
var pname = DirFileHelper.GetFileName(seltxt);
var res = new List<object>();
if (pname.Length > 0)
{
halconEng.SetWorkWindow("hwin2");
var Framegrabber = new HFramegrabber();
Framegrabber.OpenFramegrabber("File", 1, 1, 0, 0, 0, 0, "default", -1, "default", -1, "default", "fin.seq", "default", -1, -1);
HImage Image = new HImage();
for (int i = 0; i <= 2; i++)
{
Image.GrabImage(Framegrabber);
HalconEngine.hdvpInputVarStruc[] input = new HalconEngine.hdvpInputVarStruc[]
{
new HalconEngine.hdvpInputVarStruc()
{
varType = HalconEngine.hdvpInputParamEnum.SetInputIconicParamObject, varName="Image", varValue=Image
}
};
HalconEngine.hdvpOutParamStruct[] output = new HalconEngine.hdvpOutParamStruct[]
{
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputIconicParamRegion, varName="FinRegion"
},
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputCtrlParamTuple, varName="FinArea"
}
};
res = halconEng.RunHdvp(pname, new HalconEngine.hdvpInputOutputParam()
{
inputParam = input,
outputParam = output
});
if (null != res && res.Count > 0)
{
var Window = halconEng.GetWorkWindow("hwin2");
Image.DispObj(Window);
Window.SetColor("red");
var FinRegion = res[0] as HRegion;
var FinArea = res[1] as HTuple;
Window.DispObj(FinRegion);
Window.SetColor("white");
Window.SetTposition(150, 20);
Window.WriteString("FinArea: " + FinArea.D);
MessageBox.Show("continue...");
}
}
}
}
}(3)运行包含主程序、外部函数或者用户自定义函数的程序
private void button17_Click(object sender, EventArgs e)
{
try
{
halconEng.SetWorkWindow("hwin2");
try
{
halconEng.LoadUserOrHdvpFunction(
new string[] { halconEng.getHdevProgramList()[0], halconEng.getHdevProgramList()[0], halconEng.getHdevProgramList()[0] },
new string[] { "init_acquisition", "detect_fin", "display_zoomed_region" }
);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
//运行init_acquisition
MessageBox.Show("运行init_acquisition...");
HalconEngine.hdvpInputVarStruc[] input = new HalconEngine.hdvpInputVarStruc[]
{
};
HalconEngine.hdvpOutParamStruct[] output = new HalconEngine.hdvpOutParamStruct[]
{
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputCtrlParamTuple, varName="AcqHandle"
},
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputCtrlParamTuple, varName="Width"
},
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputCtrlParamTuple, varName="Height"
}
};
var res=halconEng.RunHdvpOrUserFunWithMain("init_acquisition", new HalconEngine.hdvpInputOutputParam()
{
inputParam = input,
outputParam = output
});
var v = (res[0] as HTuple);
var w= (res[1] as HTuple);
var h= (res[2] as HTuple);
var img = new HImage();
if (v.TupleIsHandle())
{
//HFramegrabber的构造参数是一个IntPtr,这里不会隐式把int转IntPtr的
//需要把用HTuple的属性来转为handle
var s1 = v.H.Handle;
var Framegrabber = new HFramegrabber(s1);
img = Framegrabber.GrabImage();
HOperatorSet.WriteImage(img, "tiff", 0, "e:/t1.tiff");
var Window = halconEng.GetWorkWindow("hwin2");
Window.DispImage(img);
MessageBox.Show(string.Format("ok,width:{0} height{1}", w.I, h.I));
}
//运行detect_fin
MessageBox.Show("运行detect_fin...");
input = new HalconEngine.hdvpInputVarStruc[]
{
new HalconEngine.hdvpInputVarStruc(){ varType=
HalconEngine.hdvpInputParamEnum.SetInputIconicParamObject, varName="Image", varValue=img}
};
output = new HalconEngine.hdvpOutParamStruct[]
{
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputIconicParamRegion, varName="FinRegion"
},
new HalconEngine.hdvpOutParamStruct()
{
varType=HalconEngine.hdvpOutputParamEnum.GetOutputCtrlParamTuple, varName="FinArea"
},
};
res = halconEng.RunHdvpOrUserFunWithMain("detect_fin", new HalconEngine.hdvpInputOutputParam()
{
inputParam = input,
outputParam = output
});
var FinRegion = res[0] as HRegion;
var FinArea = res[1] as HTuple;
halconEng.GetWorkWindow("hwin2").SetColor("green");
HOperatorSet.DispObj(img, halconEng.GetWorkWindow("hwin2"));
HOperatorSet.DispObj(FinRegion, halconEng.GetWorkWindow("hwin2"));
MessageBox.Show(string.Format("FinArea:{0}", FinArea.D));
//运行display_zoomed_region
MessageBox.Show("运行display_zoomed_region...");
input = new HalconEngine.hdvpInputVarStruc[]
{
new HalconEngine.hdvpInputVarStruc(){
varType= HalconEngine.hdvpInputParamEnum.SetInputIconicParamObject, varName="Image", varValue=img},
new HalconEngine.hdvpInputVarStruc(){
varType= HalconEngine.hdvpInputParamEnum.SetInputIconicParamObject, varName="Region", varValue=FinRegion},
new HalconEngine.hdvpInputVarStruc(){
varType= HalconEngine.hdvpInputParamEnum.SetInputCtrlParamTuple, varName="ZoomScale", varValue=3},
new HalconEngine.hdvpInputVarStruc(){
varType= HalconEngine.hdvpInputParamEnum.SetInputCtrlParamTuple, varName="Margin", varValue=5}
};
output = new HalconEngine.hdvpOutParamStruct[]
{
};
res = halconEng.RunHdvpOrUserFunWithMain("display_zoomed_region", new HalconEngine.hdvpInputOutputParam()
{
inputParam = input,
outputParam = output
});
}
catch(ArgumentException ex)
{
MessageBox.Show(ex.Message);
}
catch(HDevEngineException ex)
{
MessageBox.Show(ex.Message);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















