C#调用Halcon程序三种方法

这篇博客详细介绍了如何在C#环境中使用Halcon引擎进行图像处理。首先展示了如何导出C#代码并调用Halcon算法,接着演示了直接运行Halcon主程序的方法。此外,还解释了如何在不运行主程序的情况下调用.hdev中的本地函数或.hdvp外部函数,同时提供了参数设置和结果获取的步骤。
摘要由CSDN通过智能技术生成

1.halcon导出C#文件,在C#里面调用
2.在C#里面使用Halcon引擎调用Halcon程序,直接运行主程序
3.在C#里面使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数

Halcon引擎手册:C:/Program Files/MVTec/HALCON-21.11-Progress/doc_en_US/html/manuals/programmers_guide/programmers_guide_0120.html
在这里插入图片描述
1.导出C#(代码我只给出类,需要调用)

using VIA.ImageProcessing;
using HalconDotNet;
using System.Runtime.InteropServices;
using Halcon_接口;

class Test
{
    /// <summary>
    /// C#调用接口
    /// </summary>
    /// <returns></returns>
    public bool Measure(Imagecustom Image_Light, Imagecustom Image_Gray, string LeftOrRight,out double[] Result_Distance,out double[] Result_Height,out HTuple Display_Handle)
    {
        HObject Display = new HObject();
        HTuple result_Distance=new HTuple();
        HTuple result_Height=new HTuple();
        try
        {
            int Len = Image_Light.Length;
            int Width = Image_Light.Width;
            ToHobject3D(Image_Gray.Data, Width, Len, out HObject Image_Gray_A);
            ToHobject3D(Image_Light.Data, Width, Len, out HObject Image_Light_A);
            HalconAlgo Measure = new HalconAlgo();
            
            Measure.Measure_Run(Image_Light_A, Image_Gray_A, out Display, LeftOrRight, out result_Height, out result_Distance, out Display_Handle);

            double[] dis = new double[4];
            double[] hei = new double[4];
            for (int i=0;i<4;i++)
            {
                hei[i] = result_Height[i].D;
                dis[i] = result_Distance[i].D;

            }
            Result_Distance = dis;
            Result_Height = hei;

            return true;

        }
        catch (Exception ex)
        {
            Result_Distance = new double[4] {0, 0, 0, 0 };
            Result_Height = new double[4] {0, 0, 0, 0 };
            Display_Handle = null;
            return false;
        }
    }
		
		//图像数据转object
    public void ToHobject3D(ushort[] RawValue, int Width, int Height, out HObject Image)
    {
        IntPtr Iptr = Marshal.AllocHGlobal(Width * Height * sizeof(int));
        int[] Data = Array.ConvertAll<ushort, int>(RawValue, Convert.ToInt32);
        try
        {
            Marshal.Copy(Data, 0, Iptr, Width * Height);
            HOperatorSet.GenImage1(out Image, "int4", Width, Height, (HTuple)Iptr);
            //最好回到Halcon里将int4转成uint2 convert_image_type()
        }
        catch (Exception e)
        {
            Image = null;
        }
        finally
        {
            Marshal.FreeHGlobal(Iptr);
        }
    }
}
struct Imagecustom 
{
    ushort[] Data;
    int Width;
    int Height;
}

在这里插入图片描述
2.在C#里面使用Halcon引擎调用Halcon程序

class Test
{
    public double[] Test_1()
    {
         // 程序路径
        string ProgramPathString = @"TEST.hdev";
        //打开主程序
        HDevProgram MyProgram = new HDevProgram(ProgramPathString);
        //主程序用HDevProgramCall 要是执行程序内本地函数或者外部函数使用HDevProcedure
        HDevProgramCall ProgramCall = new HDevProgramCall(MyProgram);
        //执行程序
        ProgramCall.Execute();

        double[] SaveData;
        SaveData = ProgramCall.GetCtrlVarTuple("Height_Left");//获取程序中的某个参数,变量名

        return SaveData;
    }
}

3.在C#里面使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数,不会运行主函数,相当于调用hdev里的本地函数或者是外部函数,需要输入控制变量

class Test
    {
    public double[] Test_1()
    {
        // 调用程序的引擎,***看起来没用到***
        HDevEngine MyEngine = new HDevEngine();
        // 程序路径
        string ProgramPathString = @"TEST.hdev";
        //图像路径
        string Image_Path_Light = "E:\\1.tif";
        string Image_Path_Gray = "E:\\2.tif";
        HObject Image_Light, Image_Gray;
        HOperatorSet.ReadImage(out Image_Light, Image_Path_Light);
        HOperatorSet.ReadImage(out Image_Gray, Image_Path_Gray);
        //程序
        HDevProgram Program = new HDevProgram(ProgramPathString);
        //主函数下图像处理函数,Measure本地函数名称
        HDevProcedure ProcessImageProc = new HDevProcedure(Program, "Measure");
        //回调主函数下图像处理函数
        HDevProcedureCall ProcessImageProcCall = new HDevProcedureCall(ProcessImageProc);

        //设置参数,设置Iconic 图形参数,Ctrl 控制参数
        ProcessImageProcCall.SetInputIconicParamObject("Image_Light", Image_Light);
        ProcessImageProcCall.SetInputIconicParamObject("Image_Gray", Image_Gray);
        ProcessImageProcCall.SetInputCtrlParamTuple("Left_Or_Right", "Left");
        //执行
        ProcessImageProcCall.Execute();

        //Data输出值本来是HTuple
        double[] Data;
        Data = ProcessImageProcCall.GetOutputCtrlParamTuple("Height");
        return Data;
    }
}
  • 4
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C#调用Halcon引擎可以通过添加引用halcondotnet.dll和hdevenginedonet.dll来实现。以下是两种调用Halcon引擎的方法: 1. 在C#中使用Halcon引擎调用Halcon程序 首先,需要在Halcon中导出C#文件,然后在C#调用。具体步骤如下: - 在Halcon中打开需要调用程序。 - 选择“文件”->“导出”->“导出C#文件”。 - 在C#中添加对halcondotnet.dll和hdevenginedonet.dll的引用。 - 在C#中创建Halcon引擎实例并调用Halcon程序。 以下是一个示例代码: ```csharp using HalconDotNet; class Program { static void Main(string[] args) { // 创建Halcon引擎实例 HDevEngine engine = new HDevEngine(); engine.SetScriptPath("path/to/halcon/program"); // 调用Halcon程序 engine.ExecuteScript("halcon_program.cs"); } } ``` 2. 在C#中使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数 在C#中使用Halcon引擎调用.hdev下本地函数或者.hdvp外部函数也是通过添加引用halcondotnet.dll和hdevenginedonet.dll来实现。具体步骤如下: - 在C#中添加对halcondotnet.dll和hdevenginedonet.dll的引用。 - 在C#中创建Halcon引擎实例并调用.hdev下本地函数或者.hdvp外部函数。 以下是一个示例代码: ```csharp using HalconDotNet; class Program { static void Main(string[] args) { // 创建Halcon引擎实例 HDevEngine engine = new HDevEngine(); // 调用.hdev下本地函数 engine.CallProcedure("local_procedure"); // 调用.hdvp外部函数 engine.CallExternalProcedure("external_procedure", "path/to/external/procedure.hdvp"); } } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值