Qt 與Halcon聯合開發九:算法類設計與實現講解(附源碼)

一、設計背景

在機器視覺系統中,算法是系統的核心。不同產品、不同項目對圖像處理的要求不盡相同,因此算法需要具備:

  • 靈活拓展:方便添加新算法
  • 統一調用:界面或上層邏輯不關心算法細節
  • 結構清晰:便于維護與團隊協作
  • 可視化調試:與 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 窗口顯示中間過程
🚀 快速迭代支持參數動態配置、熱更新

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/88104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/88104.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/88104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

npu-driver 23.0.3驅動安裝

宿主機器上安裝npu-driver/ npu-firmware這兩個東西 wget -O Ascend-hdk-910b-npu-driver_23.0.3_linux-aarch64.run https://bj.bcebos.com/v1/aipe-easyedge-public/cann/eb_speed/Ascend-hdk-910b-npu-driver_23.0.3_linux-aarch64.run?authorizationbce-auth-v1%2F50c8bb…

LeetCode題解---<三數之和>

文章目錄題目<三數之和>--Python解法題解題目<三數之和>–Python解法 給你一個整數數組 nums &#xff0c;判斷是否存在三元組 [nums[i], nums[j], nums[k]] 滿足 i ! j、i ! k 且 j ! k &#xff0c;同時還滿足 nums[i] nums[j] nums[k] 0 。請你返回所有和為…

探索Insplorion氫氣傳感器:高靈敏度與快速響應的創新解決方案

在追求更清潔、更安全能源的過程中&#xff0c;氫氣作為一種理想的清潔能源載體&#xff0c;正日益受到全球的重視。然而&#xff0c;氫氣的廣泛應用也帶來了新的挑戰——如何確保其儲存、運輸和使用的安全性&#xff1f;Insplorion通過其獨特的納米等離子體傳感&#xff08;NP…

【QT】事件(鼠標、按鍵、定時器、窗口)

文章目錄1. 事件1.1 事件的介紹1.2 事件的處理2. 按鍵事件3. 鼠標事件4. 定時器5. 窗口事件1. 事件 1.1 事件的介紹 事件是應用程序內部或者外部產生的事情或者動作的統稱。 在 Qt 中使用?個對象來表示?個事件。所有的 Qt 事件均繼承于抽象類 QEvent。事件是由系統或者 Qt …

STM32固件升級設計——串口IAP升級(基于YMODEM協議)

目錄 一、功能描述 1、BootLoader部分&#xff1a; 2、APP部分&#xff1a; 二、BootLoader程序制作 1、分區定義 2、 主函數 3、YMODEM協議的實現 4、程序跳轉 三、APP程序制作 四、工程配置&#xff08;默認KEIL5&#xff09; 五、運行測試 結束語 概述 IAP&…

Cookie(搭配domain)/Session(搭配HttpServletRequest+HttpSession)

各位看官&#xff0c;大家早安午安晚安呀~~~如果您覺得這篇文章對您有幫助的話歡迎您一鍵三連&#xff0c;小編盡全力做到更好 歡迎您分享給更多人哦今天我們來學習&#xff1a;Cookie/Session1.Cookie/Session的簡述我們在講解HTTP協議的時候已經講解過Cookie了HTTP 協議自身是…

240.搜索二維矩陣Ⅱ

純暴力有點太唐了&#xff0c;不過竟然能過&#xff1b;還有行和列的表示我一直搞反了。。。class Solution {public boolean searchMatrix(int[][] matrix, int target) {for(int i 0 ;i<matrix.length;i){for(int j 0 ;j<matrix[0].length;j){if(matrix[i][j]target)…

【計算機組成原理】-CPU章節學習篇—筆記隨筆

計算機組成原理 CPU 章節知識點總結&#xff08;適用于 408 考研&#xff09;? 一、CPU 的功能與基本結構? 1.1 CPU 的功能? CPU&#xff08;中央處理器&#xff09;是計算機的核心部件&#xff0c;主要功能包括&#xff1a;? 指令控制&#xff1a;程序的順序執行&#xff…

公用測控裝置的功能

公用測控裝置在電力系統中廣泛應用于變電站的高壓開關單元、變壓器本體及低壓側等對象。它集測量、控制、保護于一體&#xff0c;確保電網的安全、穩定運行。公用測控裝置采用高性能硬件架構&#xff0c;如32位微控制器和獨立AD采樣技術&#xff0c;結合軟件算法&#xff0c;實…

數據庫|達夢DM數據庫配置實例步驟

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 最近因為一個信創項目&#xff0c;要使用達夢DM數據庫&#xff0c; 因此安裝了達夢DM數據庫來學習使用&#xff0c; 上一節中記錄了安裝Windows版本達夢DM數據庫的過程步驟&#xff0c; 這一節緊接著上一節《數據庫…

三十一、【高級特性篇】接口用例參數化與關聯:實現上下文數據傳遞

三十一、【高級特性篇】接口用例參數化與關聯:實現上下文數據傳遞 前言準備工作第一部分:后端數據模型調整1. 升級 `TestCase` 模型2. 生成并應用數據庫遷移3. 更新 `TestCaseSerializer`第二部分:后端測試執行器強化1. 修改 `execute_api_test_case` 函數2. 修改 Celery 任…

PCA通過“找最大方差方向”實現降維,本質是用更少的變量捕捉原始數據的主要模式

什么事 PCA(主成分分析) PCA(主成分分析)的原理與通俗舉例 PCA 是什么? PCA(Principal Component Analysis)是一種常用的降維算法,核心目標是將高維數據映射到低維空間,同時盡可能保留原始數據的關鍵信息(方差最大的方向)。 核心原理:找“最能代表數據的方向”…

JAVA synchronized關鍵字涉及的Monitor對象中 EntryList和WaitSet工作機制

在Java的synchronized同步機制中&#xff0c;Monitor對象的EntryList和WaitSet是兩個關鍵隊列&#xff0c;它們分別管理不同狀態的線程。下面我將詳細解釋它們的工作原理&#xff0c;并提供代碼示例說明。 EntryList&#xff08;鎖競爭隊列&#xff09; 作用機制 EntryList保…

js-day10

JS學習之旅-day101. 作用域1.1 局部作用域1.2 全局作用域1.3 作用域鏈1.4 JS垃圾回收機制&#xff08;GC&#xff09;1.5 閉包1.6 變量提升2. 函數進階2.1 函數提升2.2 函數參數2.3 箭頭函數3. 解構賦值3.1 數組解構3.2 對象解構4. 數組遍歷4.1 forEach4.2 filter1. 作用域 作…

智能數字式毫秒計在實際生活場景中的應用

在電力領域&#xff0c;SYN5307型數字毫秒表可精準監測特高壓變電站斷路器合閘時間差&#xff0c;定位繼電保護裝置信號延遲&#xff1b;工業自動化中&#xff0c;優化汽車焊裝線時序、提升半導體晶圓切割良率&#xff1b;科研計量上&#xff0c;助力量子通信同步校準&#xff…

Java面試基礎:概念

1. Java的特點跨平臺性&#xff1a;Java的 “編寫一次&#xff0c;運行無處不在” 是其最大的特點之一。Java編譯器將源代碼編譯成字節碼(bytecode)&#xff0c;該字節碼可以在任何安裝了Java虛擬機(JVM)的系統上運行。面向對象&#xff1a;Java是一門嚴格的面向對象編程語言&a…

PyQt5高級窗口控件詳解:停靠窗口、多文檔界面與滾動條

掌握PyQt5的高級窗口控件&#xff0c;讓你的GUI應用具備專業級的布局與交互體驗 在PyQt5應用開發中&#xff0c;高效管理窗口布局和實現復雜交互功能是提升用戶體驗的關鍵。本文將深入解析三個核心高級控件&#xff1a;停靠窗口&#xff08;QDockWidget&#xff09;、多文檔界面…

50天50個小項目 (Vue3 + Tailwindcss V4) ? | DrawingApp(畫板組件)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— DrawingApp組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ 使用 Vue 3 的 Composition API&#xff08;<script setup>…

Eureka、Nacos、LoadBalance、OpenFeign?之間的區別聯系和協作 (附代碼講解)

這篇文章聊聊微服務里的這幾個老伙計&#xff1a;Eureka、Nacos、LoadBalance、OpenFeign。咱們做微服務開發&#xff0c;總會跟這幾個組件打交道&#xff1a;Eureka、Nacos、Spring Cloud LoadBalancer、OpenFeign。它們各司其職又互相配合&#xff0c;今天就把它們的關系、用…

JavaSE-繼承

繼承&#xff08;inheritance&#xff09;繼承的意義我們首先來看下面兩個類&#xff1a;public class Dog {public String name;public int age;public void eat(){System.out.println(this.name"正在吃飯");}public void bark(){System.out.println(this.name"…