一文了解如何在Qt中间集成Halcon窗口并在子线程显示(附工程源码下载链接)

在基于图像处理的开发中,Halcon作为功能强大的图像处理库,经常需要与Qt结合,以便通过Qt提供的UI功能更好地显示和交互。本文将讲解如何在Qt中集成Halcon窗口,并通过子线程实现Halcon图像的显示,保证主线程的流畅运行。


工程代码下载链接

通过网盘分享的文件:HALCON窗口依附Qt控件
链接: https://pan.baidu.com/s/1gNWCTpha9-vsYPHEX0R_vQ?pwd=jkcf 提取码: jkcf

在这里插入图片描述

一、Halcon窗口与Qt控件的结合原理

在Qt中,QGraphicsView等控件用于显示图像。而Halcon可以通过窗口句柄将其窗口嵌入到Qt控件中。通过将Halcon窗口与Qt控件绑定,我们既能使用Qt的交互功能,又能发挥Halcon的强大图像处理能力。为了提升程序性能,Halcon窗口的操作可以放到子线程中执行,避免阻塞主线程。


二、项目初始化与Halcon库的配置

在Qt中使用Halcon库时,首先需要配置.pro文件,添加Halcon库的路径:

1. 修改.pro文件

# 配置头文件路径
INCLUDEPATH += "./libary/hdevelop/include"
INCLUDEPATH += "./libary/hdevelop/include/halconcpp"# 配置库文件路径
LIBS += "./libary/hdevelop/lib/halconcpp.lib"

其中:

  • INCLUDEPATH 指定 Halcon 头文件的路径。
  • LIBS 指定 Halcon 动态库的路径。

2. 全局窗口句柄声明

为了管理Halcon窗口,声明一个全局变量:

#include "HalconCpp.h"HalconCpp::HTuple m_window; // 全局窗口句柄

三、分离线程逻辑:创建一个线程类

在复杂的程序中,将线程逻辑独立出来是一种更好的设计方式。我们通过创建一个专门的线程类,处理Halcon图像的显示逻辑。

1. 线程类定义

新建线程类 ThreadedWorker,继承自 QThread

ThreadedWorker.h
#ifndef THREADEDWORKER_H
#define THREADEDWORKER_H#include <QThread>
#include "HalconCpp.h"class ThreadedWorker : public QThread
{Q_OBJECTpublic:explicit ThreadedWorker(HalconCpp::HTuple window, QObject* parent = nullptr);~ThreadedWorker();protected:void run() override;private:HalconCpp::HTuple m_window; // Halcon窗口句柄
};#endif // THREADEDWORKER_H
ThreadedWorker.cpp
#include "ThreadedWorker.h"ThreadedWorker::ThreadedWorker(HalconCpp::HTuple window, QObject* parent): QThread(parent), m_window(window)
{
}ThreadedWorker::~ThreadedWorker()
{if (isRunning()) {quit();wait();}
}void ThreadedWorker::run()
{try {// 设置Halcon窗口的显示区域HalconCpp::SetPart(m_window, 0, 0, 1023, 1023);// 清空窗口并显示图像HalconCpp::ClearWindow(m_window);HalconCpp::HObject hv_Image;HalconCpp::GenImageConst(&hv_Image, "byte", 1024, 1024); // 生成测试图像HalconCpp::DispObj(hv_Image, m_window); // 在窗口中显示图像} catch (HalconCpp::HException& ex) {qWarning("Halcon exception: %s", ex.ErrorText().Text());}
}
  • run() 是线程的主函数,负责设置Halcon窗口并显示图像。
  • Halcon操作(如 SetPartClearWindowDispObj)都集中在此线程中,避免阻塞主线程。

四、主窗口中调用线程类

在主窗口类中,我们完成Halcon窗口的初始化,并创建和启动线程。

1. 主窗口类定义

MainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include "HalconCpp.h"
#include "ThreadedWorker.h"QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private:Ui::MainWindow *ui;HalconCpp::HTuple m_window; // Halcon窗口句柄ThreadedWorker* worker;    // 线程对象
};#endif // MAINWINDOW_H

2. 主窗口实现

MainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);// 初始化Halcon窗口HalconCpp::OpenWindow(0, 0, 500, 500, static_cast<Hlong>(ui->graphicsView->winId()), "", "", &m_window);HalconCpp::SetColored(m_window, 12); // 设置窗口颜色HalconCpp::SetHcppInterfaceStringEncodingIsUtf8(true); // 启用UTF-8编码// 创建线程对象worker = new ThreadedWorker(m_window, this);// 启动线程worker->start();
}MainWindow::~MainWindow()
{// 关闭线程if (worker) {worker->quit();worker->wait();delete worker;}delete ui;
}

五、运行效果

  1. 主线程的职责

    • 初始化Halcon窗口,将其与QGraphicsView控件绑定。
    • 创建并启动线程对象。
  2. 子线程的职责

    • 设置Halcon窗口的显示区域。
    • 在Halcon窗口中显示测试图像。

运行程序后,Halcon窗口会嵌入到Qt的GraphicsView控件中,显示测试图像,同时主线程保持流畅运行。


六、设计优点

  1. 解耦性
    将线程逻辑与主窗口分离,使代码结构清晰,易于维护和扩展。

  2. 性能优化
    通过子线程执行Halcon操作,避免阻塞主线程,提高UI的响应速度。

  3. 易于扩展
    若需增加其他图像处理功能,可直接在 ThreadedWorker 类中添加,不影响主窗口逻辑。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4999.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

深度学习-89-大语言模型LLM之AI应用开发的基本概念

文章目录 1 什么是智能体(Agent)2 什么是大语言模型(LLM)2.1 LLM的训练及使用2.2 Transformer架构2.3 基于LLM的Agent框架3 什么是检索增强生成(RAG)3.1 RAG是什么3.2 生成式AI应用开发3.3 RAG的整体流程3.4 RAG技术3.4.1 简单RAG(Simple RAG)3.4.2 校正RAG(Corrective RAG)3.4…

电子科大2024秋《大数据分析与智能计算》真题回忆

考试日期&#xff1a;2025-01-08 课程&#xff1a;成电信软学院-大数据分析与智能计算 形式&#xff1a;开卷 考试回忆版 简答题&#xff08;4*15&#xff09; 1. 简述大数据的四个特征。分析每个特征所带来的问题和可能的解决方案 2. HDFS的架构的主要组件有哪些&#xff0…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…

多监控m3u8视频流,怎么获取每个监控的封面图(纯前端)

文章目录 1.背景2.问题分析3.解决方案3.1解决思路3.2解决过程3.2.1 封装播放组件3.2.2 隐形的视频div3.2.3 截取封面图 3.3 结束 1.背景 有这样一个需求&#xff1a; 给你一个监控列表&#xff0c;每页展示多个监控&#xff08;至少12个&#xff0c;m3u8格式&#xff09;&…

VS Code AI开发之Copilot配置和使用详解

随着AI开发工具的迅速发展&#xff0c;GitHub Copilot在Cursor、Winsuf、V0等一众工具的冲击下&#xff0c;推出了免费版本。接下来&#xff0c;我将为大家介绍GitHub Copilot的配置和使用方法。GitHub Copilot基于OpenAI Codex模型&#xff0c;旨在为软件开发者提供智能化的代…

前端开发Web

Ajax 概念:Asynchronous JavaScriptAnd XML&#xff0c;异步的JavaScript和XML 作用: 数据交换:通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。 异步交互:可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的…

Oracle 深入学习 Part 14:Managing Password Security and Resources(管理密码安全性和资源)

Profiles Profile 是一个以名称标识的集合&#xff0c;用于管理 密码 和 资源限制。 每个用户都对应一个profiles&#xff0c;可以通过 CREATE USER 或 ALTER USER 命令分配给用户。 Profiles 可以启用或禁用。 Profiles 可以关联到默认的 DEFAULT Profile。 密码管理&…

ConvBERT:通过基于跨度的动态卷积改进BERT

摘要 像BERT及其变体这样的预训练语言模型最近在各种自然语言理解任务中取得了令人印象深刻的性能。然而&#xff0c;BERT严重依赖于全局自注意力机制&#xff0c;因此存在较大的内存占用和计算成本。尽管所有的注意力头都从全局角度查询整个输入序列以生成注意力图&#xff0…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设&#xff0c;原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中&#xff0c;使用的爱快路由器当作网关设备&#xff0c;所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构&#xff0c;但原有的SDWAN分支…

豆包升级了“眼睛”,看APP截图就能写代码了!超低价让多模态AI普惠

金磊 发自 上海量子位 | 公众号 QbitAI 豆包的“眼睛”升级了&#xff0c;现在让它看一眼APP截图&#xff0c;就能直接给你生成代码&#xff01; 话不多说&#xff0c;我们直接给它上一个难度。 例如我们先随机截取一张网站的图片&#xff1a; 再来到火山方舟的大模型广场&…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

vue3+ts+uniapp 微信小程序(第一篇)—— 微信小程序定位授权,位置信息权限授权

文章目录 简介一、先看效果1.1 授权定位前&#xff0c;先弹出隐私协议弹框1.2 上述弹框点击同意&#xff0c;得到如下弹框1.3 点击三个点&#xff0c;然后点设置 1.4 在1.2步骤下&#xff0c;无论同意或者拒绝 二、manifest.json 文件配置三、微信公众平台配置3.1 登录进入微信…

vue3使用音频audio标签

文章目录 一、背景二、页面三、标签介绍四、代码五、代码说明场景1&#xff1a;针对加载固定格式的比如MP3文件&#xff0c;可直接使用\<audio>标签场景2&#xff1a;针对播放告警内容&#xff0c;比如中文或者英文词条情况 一、背景 项目使用vue3&#xff0c;需求针对告…

工业制造离不开的BOM

在制造业的浩瀚星空中&#xff0c;物料清单&#xff08;BOM&#xff09;犹如“北极星”&#xff0c;牢牢指引着产品从设计蓝图迈向实物诞生的全过程。 BOM的分类 按照设计制造的不同阶段&#xff0c;将BOM划分为设计BOM、工艺BOM、制造BOM三种类型。 设计BOM Engineering BO…

【Python】循环语句

while 基本语法格式 while 条件:循环体条件为真, 则执行循环体代码.条件为假, 则结束循环 num 1 while num < 10 :print(num)num 1注&#xff1a; 在 print 函数中&#xff0c;可以使用 end 参数来指定输出结束时使用的字符。默认情况下&#xff0c;end 参数的值为 &qu…

TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文

本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值&#xff0c;控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…

LeetCode:37. 解数独

跟着carl学算法&#xff0c;本系列博客仅做个人记录&#xff0c;建议大家都去看carl本人的博客&#xff0c;写的真的很好的&#xff01; 代码随想录 LeetCode&#xff1a;37. 解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff…

PyTorch使用教程(10)-torchinfo.summary网络结构可视化详细说明

1、基本介绍 torchinfo是一个为PyTorch用户量身定做的开源工具&#xff0c;其核心功能之一是summary函数。这个函数旨在简化模型的开发与调试流程&#xff0c;让模型架构一目了然。通过torchinfo的summary函数&#xff0c;用户可以快速获取模型的详细结构和统计信息&#xff0…