Qt 与Halcon联合开发九:算法类设计与实现讲解(附源码)

发布于:2025-07-09 ⋅ 阅读:(14) ⋅ 点赞:(0)

一、设计背景

在机器视觉系统中,算法是系统的核心。不同产品、不同项目对图像处理的要求不尽相同,因此算法需要具备:

  • 灵活拓展:方便添加新算法
  • 统一调用:界面或上层逻辑不关心算法细节
  • 结构清晰:便于维护与团队协作
  • 可视化调试:与 Halcon 窗口联动,便于结果展示

为此,我们设计了一个基于 Qt 和 Halcon 的算法类架构,采用 C++ 面向对象思想,抽象出一个通用算法基类,再由各类检测算法子类继承,实现统一接口和结构。

工程代码

通过网盘分享的文件:Qt 与Halcon联合开发九:算法类设计与实现讲解
链接: https://pan.baidu.com/s/1Bwx51nXuUepDqGz2DTyHeQ?pwd=jkcf 提取码: jkcf

二、总体架构设计

✅ 设计核心:

  • 抽象出一个算法基类 HalconAlgorithmBase

    • 管理通用资源(参数、窗口)
    • 定义统一接口 Run(HObject)
  • 各类检测算法作为子类继承:

    • 实现具体检测逻辑(如边缘检测、定位检测、字符识别等)

📦 类图结构如下:

HalconAlgorithmBase(抽象类)
     ↑
 ┌───────────────┐
 │               │
ConcreteAlgorithm1(子类1)
ConcreteAlgorithm2(子类2)
……

三、算法基类 HalconAlgorithmBase

3.1 职责说明

HalconAlgorithmBase 是一个抽象类,定义了算法运行框架,主要功能:

功能项 描述
参数管理 使用 std::map 存储算法运行所需的可配置参数
窗口绑定 存储 Halcon 显示窗口,统一显示结果
核心接口 提供纯虚函数 Run(const HObject& input) 供子类实现

3.2 接口定义(.h)

#pragma once
#include "HalconCpp.h"
#include <string>
#include <map>

class HalconAlgorithmBase {
public:
    using ParamMap = std::map<std::string, std::string>;

    HalconAlgorithmBase();
    virtual ~HalconAlgorithmBase();

    void SetParams(const ParamMap& params);               // 设置参数
    const ParamMap& GetParams() const;                    // 获取参数

    void SetWindow(const HalconCpp::HTuple& window);      // 设置显示窗口
    const HalconCpp::HTuple& GetWindow() const;           // 获取窗口

    virtual void Run(const HalconCpp::HObject& inputImage) = 0; // 核心算法入口(子类实现)

protected:
    ParamMap parameters_;
    HalconCpp::HTuple windowHandle_;
};

3.3 实现逻辑(.cpp)

#include "HalconAlgorithmBase.h"

HalconAlgorithmBase::HalconAlgorithmBase() {}

HalconAlgorithmBase::~HalconAlgorithmBase() {}

void HalconAlgorithmBase::SetParams(const ParamMap& params) {
    parameters_ = params;
}

const HalconAlgorithmBase::ParamMap& HalconAlgorithmBase::GetParams() const {
    return parameters_;
}

void HalconAlgorithmBase::SetWindow(const HalconCpp::HTuple& window) {
    windowHandle_ = window;
}

const HalconCpp::HTuple& HalconAlgorithmBase::GetWindow() const {
    return windowHandle_;
}

四、子类结构说明(检测类)

🎯 设计原则

每个检测子类都继承自 HalconAlgorithmBase只需实现具体的检测函数。不关心窗口、参数机制,这些都由基类统一管理。

示例(说明性代码)

#pragma once
#include "HalconAlgorithmBase.h"

// 示例子类:用于任意具体检测任务
class ExampleDetectionAlgorithm : public HalconAlgorithmBase {
public:
    void Run(const HalconCpp::HObject& inputImage) override;
};
#include "ExampleDetectionAlgorithm.h"
#include "HalconCpp.h"

using namespace HalconCpp;

void ExampleDetectionAlgorithm::Run(const HObject& inputImage) {
    // 这里只是示例检测流程(可替换为任何实际检测逻辑)

    std::cout << "----- Algorithm Parameters -----" << std::endl;
    for (const auto& [key, value] : parameters_) {
        std::cout << key << " = " << value << std::endl;
    }
    std::cout << "--------------------------------" << std::endl;


    HalconCpp::HTuple hv_width,hv_height;
    HalconCpp::GetImageSize(inputImage,&hv_width,&hv_height);

    qDebug()<<hv_width.ToString().Text()<<hv_height.ToString().Text();

}


五、与 Qt 的结合方式

### 📌 设置算法参数并运行

```cpp
#include "exampledetectionalgorithm.h"
#include "HalconCpp.h"

using namespace HalconCpp;

int main() {
    HObject image;
    ReadImage(&image, "1.bmp");

    auto algorithm = new ExampleDetectionAlgorithm();

    HalconAlgorithmBase::ParamMap params;
    params["threshold"] = "128";  // 示例参数

    algorithm->SetParams(params);

    algorithm->Run(image);  // image 为 Halcon 的 HObject 输入图像

    return 0;
}


六、设计优点总结

特性 优势说明
🎯 高复用性 同一套界面可调用多个算法
🧩 解耦清晰 算法逻辑与界面、参数解耦
📦 易于维护 新算法实现不影响其他代码
🔍 调试方便 可在 Halcon 窗口显示中间过程
🚀 快速迭代 支持参数动态配置、热更新


网站公告

今日签到

点亮在社区的每一天
去签到