命名空间: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
版权声明:本文为博主原创文章,转载请附上博文链接!

