一、設計背景
在機器視覺系統中,算法是系統的核心。不同產品、不同項目對圖像處理的要求不盡相同,因此算法需要具備:
- 靈活拓展:方便添加新算法
- 統一調用:界面或上層邏輯不關心算法細節
- 結構清晰:便于維護與團隊協作
- 可視化調試:與 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 窗口顯示中間過程 |
🚀 快速迭代 | 支持參數動態配置、熱更新 |