一、设计背景
在机器视觉系统中,算法是系统的核心。不同产品、不同项目对图像处理的要求不尽相同,因此算法需要具备:
- 灵活拓展:方便添加新算法
- 统一调用:界面或上层逻辑不关心算法细节
- 结构清晰:便于维护与团队协作
- 可视化调试:与 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 窗口显示中间过程 |
🚀 快速迭代 | 支持参数动态配置、热更新 |