halcon引擎的使用

本文介绍了在C++项目中使用Halcon引擎的优点,包括将C++代码与图像处理分离,减少内存泄漏,以及如何通过HDevEngine类加载和执行.hdev和.hdvp格式脚本及封装函数。还展示了如何在QT中调用Halcon封装函数和创建.hdev中的封装函数的步骤。
使用halcon引擎的优点:

1、C++代码与HALCON图像处理分离,不需要将HALCON图像处理部分导出成C++代码,否则每一次修改HALCON 时,C++相应部分就需要跟着更改,便捷性不足。

2、脚本方式执行算法可降低内存泄漏。

下面介绍使用HALCON引擎执行脚本基础部分:使用的是VS2017和HALCON20.11学习版。

在项目中添加下面两个库文件:

主要用得到的类:

HDevEngine类是管理全局设置。如设置或获取全局变量的值、设置脚本路径、启动停止调试模式等。

HDevProgram类加载.hdev格式文件以及获取文件内部参数一般信息。

HDevProgramCall类执行.hdev文件格式脚本,并获取变量的值。

HDevProcedure类加载.hdvp格式外部函数以及内部函数。

HDevProcedureCall类执行.hdvp外部函数和内部函数。并且可以设置或获取外部函数、内部函数参数。

HDevOpMultiWindowImpl类主要是与显示结果相关,在脚本中执行的结果可以显示在C#中。

HDevEngineException类是引擎相关的异常类。

基本使用方式:

方式一:执行.hdev格式。无任何封装函数,该种方式重用性差,无法设置参数。

方式二:路径+.hdvp格式。该方式比较推荐使用,可设置输入参数,获取输出参数,重用性好。

方式三:调用.hdev中的封装函数(外部函数、内部函数)。该方式优点在于方便在HALCON中读图调试。

本系列所有关于C++和halcon的例子都采用 方式三 调用。

QT调用halcon封装函数的流程代码:
QString appPath = QApplication::applicationDirPath();
        QString algPath = appPath + "/HalconAlg";
        HEngine.SetProcedurePath(algPath.toStdString().c_str()); //设置算法程序所在的文件夹路径
        QDir dir(algPath);
        QStringList filters;
        filters << "*.hdvp";
        QFileInfoList fileList = dir.entryInfoList(filters, QDir::Files | QDir::Readable, QDir::Name);
        try
        {
            for each (auto var in fileList) // fileList存储的是所有,.hdvp函数的文件命
            {
                QString algName = var.baseName();
                HDevProcedure procedure;
                procedure.LoadProcedure(algName.toStdString().data()); // 加载算法
                HDevProcedureCall procedureCall = HDevProcedureCall(procedure); 
                m_algProcedureMap.insert(algName, procedureCall);
            }
        }
        catch (HException &HDevExpDefaultException)
        {
            QString strError;
            HTuple hv_Exception;
            HDevExpDefaultException.ToHTuple(&hv_Exception);
            strError = hv_Exception.ToString();
            QMessageBox::warning(NULL, "warning", "算法加载失败!");
            LOG(ERROR) << strError;
        }

开发 halcon 的 .hdev中的封装函数(此处只展示外部函数)步骤:

点击函数创建函数,进入如下窗口,先择.hdvp文件,参数可设置输入和输出参数

<think>嗯,用户想了解Halcon引擎的功能和使用方法。从引用内容来看,Halcon引擎是用于将Halcon图像处理功能集成到C#等外部应用程序中的技术方案。用户可能是计算机视觉开发者,正在尝试将Halcon算法嵌入到自己的C#项目中。 用户提供的引用材料很专业,特别是引用[2]详细说明了Halcon引擎的架构设计。这让我想到用户可能遇到了传统导出代码方式的痛点:每次修改Halcon脚本都需要重新导出C#代码,导致开发效率低下。Halcon引擎的核心价值就在于解决这个问题。 关于功能部分,需要强调三个关键能力:一是脚本热加载,二是参数传递机制,三是内存管理优化。特别是引用[2]提到的HDevProcedureCall类,这是实现动态调用的核心技术组件。用户可能最关心如何通过C#控制Halcon脚本的输入输出参数。 使用方法上要区分基础流程和高级技巧。基础部分包括引擎初始化、路径设置和脚本执行,这在引用[3]的Form1_Load事件里有典型示例。但用户作为开发者,可能更需要知道像多线程调用、异常处理这样的进阶内容,比如引用[2]提到的HDevEngineException类的应用场景。 注意到引用[1]展示了传统调用方式,正好可以与引擎方式形成对比。在回答时需要突出引擎方案的优势:当展示Threshold和AreaCenter算子调用时,要说明引擎如何避免这种硬编码带来的维护成本。 最后考虑用户可能的后续需求。既然ta在查集成方案,可能会遇到调试困难或性能问题,所以相关问题要覆盖开发全生命周期,从部署调试到优化都应涉及。特别是引用[2]提到的调试服务器功能,这可能是很多开发者忽略的实用特性。</think>Halcon引擎是MVTec HALCON机器视觉库提供的**脚本执行框架**,允许在外部应用程序(如C#)中**动态加载和执行HALCON脚本**(.hdev或.hdvp格式),实现算法逻辑与主程序的分离。其核心功能与使用方法如下: --- ### **一、核心功能** 1. **脚本动态执行** - 无需将HALCON代码导出为C#代码,直接加载并执行.hdev(主程序)或.hdvp(外部函数)脚本文件。 - 修改HALCON算法后,只需替换脚本文件,无需重新编译C#项目。 2. **参数双向传递** - 通过 `SetInputCtrlParamTuple()` 向脚本传递输入参数(如阈值、路径)。 - 通过 `GetOutputCtrlParamTuple()` 获取脚本的输出结果(如坐标、面积)。 3. **内存管理优化** - 引擎自动管理HALCON对象(如图像、区域)的内存,减少手动释放导致的泄漏风险。 4. **调试支持** - 支持启动调试服务器(`StartDebugServer()`),可在HDevelop中实时调试C#调用的脚本。 5. **结果显示集成** - 通过 `HDevOpMultiWindowImpl` 类将脚本中的图像、区域结果显示在C#的HalconWindow控件中。 --- ### **二、C#调用流程(基础步骤)** #### 1. **初始化引擎与路径** ```csharp HDevEngine MyEngine = new HDevEngine(); // 设置HALCON脚本搜索路径(包含.hdev/.hdvp文件) MyEngine.SetProcedurePath("D:/Halcon_Scripts"); // 可选:启动调试 MyEngine.StartDebugServer(); ``` #### 2. **加载并执行脚本** **方式一:执行.hdev主程序** ```csharp HDevProgram program = new HDevProgram("detect_defects.hdev"); HDevProgramCall programCall = new HDevProgramCall(program); programCall.Execute(); // 执行脚本 ``` **方式二:调用.hdvp外部函数** ```csharp HDevProcedure procedure = new HDevProcedure("calculate_area"); HDevProcedureCall procedureCall = new HDevProcedureCall(procedure); // 设置输入参数(例如图像) procedureCall.SetInputIconicParamObject("InputImage", halconImage); // 执行并获取输出结果(例如区域面积) procedureCall.Execute(); HTuple area = procedureCall.GetOutputCtrlParamTuple("Area"); ``` #### 3. **处理结果显示** ```csharp // 关联Halcon窗口控件(例如hWindowControl) HDevOpMultiWindowImpl display = new HDevOpMultiWindowImpl(hWindowControl1.HalconWindow); display.SetWindowParam("width", 640); display.SetWindowParam("height", 480); // 脚本中显示命令的结果将自动输出到该窗口 ``` --- ### **三、关键类说明** | **类名** | **作用** | |------------------------|--------------------------------------------------------------------------| | `HDevEngine` | 全局引擎管理(路径设置、调试模式) | | `HDevProgram` | 加载.hdev主程序文件 | | `HDevProgramCall` | 执行.hdev脚本并控制流程 | | `HDevProcedure` | 加载.hdvp外部函数 | | `HDevProcedureCall` | **核心**:执行函数,设置输入/获取输出参数 | | `HDevOpMultiWindowImpl`| 将脚本中的图形输出重定向到C#的Halcon窗口 | --- ### **四、优势 vs 传统导出代码** | **特性** | **Halcon引擎** | **传统导出C#代码** | |------------------|-----------------------------------|----------------------------------| | 算法更新 | 替换脚本文件即可 | 需重新导出并编译C#项目 | | 代码维护 | 算法与业务逻辑分离 | HALCON与C#代码混合 | | 内存泄漏风险 | 引擎自动管理对象生命周期 | 需手动释放`HObject` | | 参数灵活性 | 动态传递输入/输出参数 | 参数硬编码在导出的C#代码中 | > 引用[2]明确提到:引擎方式显著提升开发效率,并降低因手动释放资源导致的内存泄漏风险[^2]。 --- ### **五、典型应用场景** 1. **算法频繁迭代**:视觉算法需多次调整参数或逻辑时,避免重复导出代码。 2. **多项目复用**:同一套HALCON脚本被多个C#项目调用。 3. **快速原型验证**:在C#界面中实时调用不同脚本测试效果。 4. **降低耦合**:视觉团队维护HALCON脚本,开发团队专注C#业务逻辑。 --- ### **六、注意事项** 1. **路径规范** - 脚本路径避免中文或空格,否则可能加载失败。 2. **异常处理** - 使用 `try-catch` 捕获 `HDevEngineException`: ```csharp try { procedureCall.Execute(); } catch (HDevEngineException ex) { MessageBox.Show(ex.Message); } ``` 3. **资源释放** - 虽然引擎管理HALCON对象,但C#侧的 `HDevProcedureCall` 等实例需显式调用 `Dispose()`。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值