C#与Halcon联合编程之利用Halcon引擎调用函数

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引擎来调用,方便快捷。

猜你喜欢

转载自blog.csdn.net/Kevin_Sun777/article/details/113692922