YOLOv12跨平台GUI应用开发:基于Qt框架的检测工具制作

news2026/3/25 11:51:27
YOLOv12跨平台GUI应用开发基于Qt框架的检测工具制作最近在做一个计算机视觉相关的项目需要频繁使用目标检测模型来测试各种图片和视频。每次都要打开命令行输入一堆参数然后等待结果这个过程实在有点繁琐。特别是当我想快速调整一下检测的灵敏度或者对比不同阈值下的效果时来回切换和修改命令非常影响效率。于是我就想能不能做一个带图形界面的小工具把常用的功能都集成进去点几下鼠标就能完成检测、查看结果、调整参数还能把结果保存下来。更重要的是我希望这个工具能在我的Windows工作电脑、Linux服务器甚至同事的MacBook上都能运行省去为不同系统分别开发的麻烦。经过一番调研和尝试我选择了Qt框架来搭建这个工具。今天我就把这个基于Qt和YOLOv12的跨平台桌面检测工具的开发过程分享出来希望能给有类似需求的朋友一些参考。1. 为什么选择Qt来开发检测工具在决定用哪个框架之前我对比了几个常见的GUI开发选项。比如Python的Tkinter和PyQt还有Electron等。最终选择Qt的C版本主要是基于下面几个考虑。首先跨平台能力是Qt最吸引我的地方。我们团队的工作环境比较杂有Windows、Ubuntu还有macOS。用Qt写的代码基本上只需要编译一次就能在各个系统上运行界面和功能都保持一致。这大大减少了后期维护的成本我不需要为每个系统单独写一套界面逻辑。其次性能表现很关键。目标检测本身是比较耗计算资源的特别是处理视频或者高分辨率图片的时候。如果GUI框架本身太“重”或者效率不高就会拖慢整个应用的响应速度。Qt底层用C实现对系统资源的占用控制得比较好界面渲染也很流畅能和后端的检测引擎很好地配合。再者Qt的界面设计非常灵活和美观。它提供了一套完整的控件库从基本的按钮、文本框到复杂的图表、表格视图都有。通过Qt Designer这个可视化工具我可以像搭积木一样设计界面然后生成对应的代码开发效率很高。而且Qt支持样式表类似CSS可以轻松定制界面的颜色、字体、边框等让工具看起来更专业。最后Qt的生态和文档很完善。遇到问题无论是查官方文档还是在社区里搜索基本上都能找到解决方案。这对于个人开发者或者小团队来说能节省很多摸索的时间。当然用C和Qt开发相比用Python写脚本入门门槛会稍微高一点。但考虑到我们要做的是一个需要长期使用、可能还会不断增加功能的桌面工具前期在架构上多花点功夫是值得的。2. 工具核心功能设计与规划动手写代码之前我先明确了这个小工具需要具备哪些核心功能。我不想把它做得太复杂重点是解决我日常使用中的痛点所以功能设计上以实用为主。第一是灵活的文件输入。工具需要能支持常见的图片格式比如JPG、PNG和视频格式比如MP4、AVI。最好还能支持直接拖拽文件到界面上这种便捷的操作方式。对于视频除了文件我还希望能支持摄像头实时画面的输入这样在做演示或者测试的时候会更方便。第二是直观的结果展示。检测完成后不能只输出一个冷冰冰的文本文件。界面上应该能实时显示加载的图片或视频并且把检测框、类别标签、置信度直接画在画面上。同时旁边最好有一个区域用列表或者表格的形式统计一下本次检测到了哪些物体各自的数量和置信度是多少一目了然。第三是便捷的参数调节。YOLO模型检测时置信度阈值和IOU交并比阈值是两个最常调整的参数。前者决定了模型多“自信”才认为检测到了一个物体后者则用于处理重叠的检测框。我需要能在界面上通过滑动条或者输入框实时调整这两个参数并且立刻看到调整后的检测效果变化。这比修改配置文件再重新运行要直观太多了。第四是实用的结果导出。检测结果除了在界面上看还需要能保存下来。一方面要把带检测框的图片或视频保存成新文件。另一方面最好能生成一份简单的检测报告比如一个文本文件或CSV表格里面记录下检测到的所有目标信息方便后续的整理和分析。基于这些想法我画了一个简单的界面布局草图主区域用来显示媒体内容和检测结果侧边栏放置文件加载按钮、参数调节滑块和结果统计面板底部则安排一些操作按钮比如开始检测、停止、导出等。3. 开发环境搭建与项目初始化工欲善其事必先利其器。第一步就是把开发环境准备好。因为要跨平台我这里以Ubuntu系统为例Windows和macOS的步骤也大同小异。首先需要安装Qt。我选择了Qt 5.15这个长期支持版本比较稳定。可以通过Qt官网的在线安装器来安装记得勾选Qt Creator集成开发环境和你目标平台的编译套件比如Desktop GCC。# 例如在Ubuntu上也可以使用apt安装版本可能较旧 # sudo apt install qt5-default qtcreator接下来是OpenCV。我们的工具需要用它来读取图片、视频进行图像显示和基本的绘图操作。# Ubuntu 安装 OpenCV sudo apt update sudo apt install libopencv-dev然后是深度学习推理框架。YOLOv12的官方实现通常基于PyTorch但为了在C环境中获得更好的性能和控制力我选择了ONNX Runtime。它支持将PyTorch训练好的模型导出为ONNX格式然后在C中高效推理。# 下载ONNX Runtime的Linux发行版 # 可以从GitHub Release页面下载https://github.com/microsoft/onnxruntime/releases # 例如下载 onnxruntime-linux-x64-1.15.1.tgz tar -xzf onnxruntime-linux-x64-*.tgz # 将其中的lib和include目录路径记下来稍后配置项目时需要环境准备好后打开Qt Creator新建一个Qt Widgets Application项目。在项目配置文件.pro文件中我们需要把OpenCV和ONNX Runtime的库和头文件路径加进去。# 在 .pro 文件中的示例配置 QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets # 假设OpenCV通过pkg-config配置 CONFIG link_pkgconfig PKGCONFIG opencv4 # 指定ONNX Runtime的头文件和库路径 (请根据你的实际路径修改) INCLUDEPATH /path/to/onnxruntime-linux-x64-1.15.1/include LIBS -L/path/to/onnxruntime-linux-x64-1.15.1/lib -lonnxruntime项目创建好后我首先设计主界面。使用Qt Designer拖拽出基本的窗口部件一个QLabel用于显示图像/视频几个QPushButton用于控制QSlider和QDoubleSpinBox用于调节参数还有一个QTableWidget用于显示检测结果统计。4. 核心功能模块实现界面搭好架子后接下来就是实现后台的逻辑了。我把核心功能分成了几个模块来开发。4.1 媒体文件加载与显示模块这个模块负责打开用户选择的图片或视频文件并将其内容显示在界面的QLabel上。对于图片直接用OpenCV读取并转换成Qt的QImage格式显示即可。对于视频则需要启动一个定时器不断地从视频流中读取帧并刷新显示。// 示例加载并显示图片的简化代码 void MainWindow::loadImage() { QString fileName QFileDialog::getOpenFileName(this, 选择图片, , Images (*.png *.jpg *.bmp)); if (fileName.isEmpty()) return; cv::Mat cvImage cv::imread(fileName.toStdString()); if (cvImage.empty()) { QMessageBox::warning(this, 错误, 无法加载图片); return; } // 将BGR的OpenCV Mat转换为RGB的QImage cv::cvtColor(cvImage, cvImage, cv::COLOR_BGR2RGB); QImage qImage((uchar*)cvImage.data, cvImage.cols, cvImage.rows, cvImage.step, QImage::Format_RGB888); // 缩放图像以适应显示区域并更新界面 QPixmap pixmap QPixmap::fromImage(qImage); pixmap pixmap.scaled(ui-imageLabel-size(), Qt::KeepAspectRatio, Qt::SmoothTransformation); ui-imageLabel-setPixmap(pixmap); currentImage cvImage.clone(); // 保存原始图像用于检测 }视频和摄像头输入的逻辑类似但需要在一个独立的线程或定时器中循环抓取帧以避免阻塞主界面线程。4.2 YOLOv12模型推理模块这是工具的核心。首先你需要有一个训练好的YOLOv12模型并将其导出为ONNX格式。这个模块的工作就是加载ONNX模型准备输入数据执行推理并解析输出结果。// 示例初始化ONNX Runtime推理会话 bool Detector::loadModel(const std::string modelPath) { Ort::Env env(ORT_LOGGING_LEVEL_WARNING, YOLOv12Detector); Ort::SessionOptions sessionOptions; sessionOptions.SetIntraOpNumThreads(1); // 设置线程数 sessionOptions.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_ENABLE_ALL); try { session std::make_uniqueOrt::Session(env, modelPath.c_str(), sessionOptions); } catch (const Ort::Exception e) { std::cerr 加载模型失败: e.what() std::endl; return false; } // 获取模型输入输出信息 Ort::AllocatorWithDefaultOptions allocator; inputName session-GetInputName(0, allocator); auto inputShape session-GetInputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape(); // inputShape 可能是 [-1, 3, 640, 640]表示动态批次、3通道、640x640输入 inputHeight inputShape[2]; inputWidth inputShape[3]; outputName session-GetOutputName(0, allocator); return true; }在检测函数中我们需要将原始的OpenCV图像预处理缩放、归一化、转换通道顺序等成模型需要的输入张量然后运行会话得到输出。YOLO的输出通常包含了大量的候选框我们需要根据置信度阈值和IOU阈值进行过滤非极大值抑制NMS最终得到可靠的检测框和类别。4.3 检测结果可视化与交互模块拿到检测框和类别信息后就需要把它们画到图像上并更新统计面板。我用OpenCV的绘图函数在cv::Mat上画矩形和文字然后再转换回QImage显示。参数调节的交互是提升体验的关键。我将界面上的滑动条QSlider和数值框QDoubleSpinBox的valueChanged信号连接到模型推理模块的阈值设置函数上。这样当用户拖动滑动条时阈值立即改变并触发一次重新检测如果当前有加载的图像或视频帧结果也会实时更新。这种即时反馈让参数调整变得非常直观。4.4 结果导出与报告生成模块这个模块功能相对独立。当用户点击“导出图片”或“导出报告”按钮时触发相应的槽函数。图片/视频导出将画好了检测框的当前帧cv::Mat用cv::imwrite保存到指定路径。对于视频则需要用OpenCV的VideoWriter将处理后的每一帧写入新文件。报告生成我将每次检测的结果帧序号、目标类别、置信度、边框坐标存储在一个数据结构里比如std::vectorDetectionResult。当需要生成报告时遍历这个结构将数据格式化成字符串写入文本文件或者用逗号分隔写成CSV格式方便用Excel打开分析。// 示例生成简单文本报告 void MainWindow::exportReport() { QString fileName QFileDialog::getSaveFileName(this, 保存报告, detection_report.txt, Text Files (*.txt)); if (fileName.isEmpty()) return; QFile file(fileName); if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { QMessageBox::warning(this, 错误, 无法创建报告文件); return; } QTextStream out(file); out YOLOv12 检测报告\n; out 生成时间: QDateTime::currentDateTime().toString() \n\n; out 序号\t类别\t置信度\tX\tY\t宽度\t高度\n; int index 1; for (const auto det : latestDetectionResults) { out index \t det.className \t QString::number(det.confidence, f, 2) \t det.bbox.x \t det.bbox.y \t det.bbox.width \t det.bbox.height \n; } file.close(); QMessageBox::information(this, 成功, 报告已生成); }5. 跨平台编译与部署心得功能开发完成后最后一步就是让它在不同系统上都能跑起来。Qt的跨平台特性在这里发挥了巨大优势大部分代码都不需要改动。在Linux上直接使用Qt Creator编译即可。需要注意确保所有动态链接库.so文件比如OpenCV和ONNX Runtime的库都在系统的链接路径中或者和可执行文件放在同一目录下。在Windows上我用的是MSVC编译器。步骤类似在Qt Creator中配置好Kit选择MSVC编译套件。主要的区别在于第三方库的获取。OpenCV和ONNX Runtime都需要下载为Windows预编译好的版本通常是.dll和.lib文件。在.pro文件中需要正确指定这些库的路径Windows下路径使用反斜杠或双正斜杠。编译完成后记得将程序运行所依赖的.dll文件Qt的、OpenCV的、ONNX Runtime的复制到可执行文件旁边或者加入到系统Path环境变量中。在macOS上环境通常用Homebrew来管理。通过brew install qt5 opencv onnxruntime可以方便地安装依赖。然后在Qt Creator中配置使用Clang编译器。macOS的应用程序通常打包成.app的BundleQt Creator在编译Release版本时可以帮你完成初步的打包但可能需要手动使用macdeployqt工具来确保所有Qt库都被正确复制到Bundle内。为了让分发更简单我通常会为每个平台写一个简单的脚本用来收集所有必需的依赖库并和可执行文件一起打包成一个文件夹。这样用户拿到后直接运行里面的程序文件就可以了不需要自己再去配置复杂的环境。6. 总结回过头来看用Qt来开发这样一个YOLOv12的桌面检测工具整个过程还是比较顺畅的。Qt框架的成熟度很高界面开发效率不错跨平台的能力也实实在在解决了我们多环境部署的痛点。工具做出来之后团队里的同事不管用什么系统都能直接使用测试和演示的效率提高了很多。当然这个工具还有很多可以完善的地方。比如可以加入模型管理功能让用户能方便地切换不同的YOLO模型v12, v11, v10等可以增加批量处理图片的功能或者把检测历史记录保存下来方便回溯和比较。这些都可以作为后续迭代的方向。如果你也在为频繁使用命令行检测模型而烦恼不妨试试用Qt自己动手做一个GUI工具。它不一定需要多么复杂的功能关键是能贴合你自己的 workflow解决实际的问题。从简单的文件加载、结果显示做起慢慢添加需要的功能这个过程本身也是学习和积累经验的好机会。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…