[netMarketing类库] HalconEngine类:halcon引擎封装类

命名空间: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)


示例 :


image.png

本类的两个路径参数参考如下:

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


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:
  • 评论列表:
  •  wowowowo
     发布于 2022-01-05 10:31:37  回复该评论
  • 勇哥,为啥在nuget上面找不到HalconEngine的命名空间的,这是把这个命名空间删除了吗?

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864