当前位置: 首页 > article >正文

从零搭建QT(C++)开发环境到实战部署YOLOV5模型

1. 环境准备从零搭建QT开发环境第一次接触QT开发的朋友可能会被各种安装选项搞懵我刚开始配置环境时也踩过不少坑。这里分享一个经过验证的安装方案适用于大多数Linux系统以Ubuntu为例。首先需要安装基础编译工具链sudo apt update sudo apt install -y build-essential cmake git接下来安装QT的依赖库这一步很重要缺少依赖会导致后续编译出错sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev freeglut3-devQT官方提供了在线安装工具Qt Maintenance Tool这是目前最方便的安装方式。下载后运行chmod x qt-unified-linux-x64-4.5.1-online.run ./qt-unified-linux-x64-4.5.1-online.run安装时建议勾选以下组件Qt 5.15.2LTS版本Qt CreatorIDEDesktop gcc 64-bit编译器Qt Charts可选数据可视化用Qt Multimedia可选音视频处理用安装完成后在终端输入qtcreator即可启动开发环境。第一次启动时建议配置下工具链进入工具-选项在Kits选项卡确认自动检测到的编译器在Qt Versions选项卡确认QT安装路径2. 创建第一个QT项目打开Qt Creator后我们来创建一个基础窗口应用。点击文件-新建文件或项目选择Application-Qt Widgets Application。项目配置有几个关键点需要注意构建系统建议选择qmake兼容性更好基类选择QMainWindow带菜单栏的标准窗口勾选Generate form自动创建UI文件创建完成后会看到项目包含这些核心文件project/ ├── project.pro # 项目配置文件 ├── main.cpp # 程序入口 ├── mainwindow.h # 主窗口头文件 ├── mainwindow.cpp # 主窗口实现 └── mainwindow.ui # 界面设计文件在mainwindow.ui中拖拽一个Label控件设置text属性为Hello World。点击运行按钮绿色三角就能看到第一个QT窗口程序了。遇到编译错误时常见问题有找不到OpenGL库安装libgl1-mesa-dev链接错误检查.pro文件中是否添加了必要的QT模块C标准不匹配在.pro中添加CONFIG c173. 集成OpenCV视觉库要在QT中使用YOLOv5需要先集成OpenCV。推荐使用v4.5版本编译时开启Qt支持git clone https://github.com/opencv/opencv.git cd opencv mkdir build cd build cmake -D WITH_QTON -D OPENCV_GENERATE_PKGCONFIGON .. make -j$(nproc) sudo make install在QT项目中集成OpenCV需要修改.pro文件# 添加OpenCV库路径 unix:!macx { INCLUDEPATH /usr/local/include/opencv4 LIBS -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui }测试OpenCV是否正常工作#include opencv2/opencv.hpp void MainWindow::testOpenCV() { cv::Mat img cv::imread(test.jpg); cv::cvtColor(img, img, cv::COLOR_BGR2RGB); QImage qimg(img.data, img.cols, img.rows, QImage::Format_RGB888); ui-label-setPixmap(QPixmap::fromImage(qimg)); }4. 部署YOLOv5模型YOLOv5官方提供PyTorch模型我们需要先转换为ONNX格式# 在Python环境中执行 import torch model torch.hub.load(ultralytics/yolov5, yolov5s) torch.onnx.export(model, torch.randn(1,3,640,640), yolov5s.onnx)在C中加载ONNX模型需要使用ONNX Runtime。安装方法git clone --recursive https://github.com/microsoft/onnxruntime cd onnxruntime/build/Linux ./build.sh --config Release --build_shared_lib --parallelQT项目中集成ONNX Runtime的.pro配置# ONNX Runtime配置 INCLUDEPATH /path/to/onnxruntime/include LIBS -L/path/to/onnxruntime/lib -lonnxruntime创建推理引擎类class YOLOv5Detector { public: YOLOv5Detector(const std::string modelPath) { env Ort::Env(ORT_LOGGING_LEVEL_WARNING, YOLOv5); session Ort::Session(env, modelPath.c_str(), Ort::SessionOptions()); } std::vectorDetection detect(cv::Mat image) { // 预处理图像 cv::Mat blob preprocess(image); // 创建输入张量 Ort::MemoryInfo memory_info Ort::MemoryInfo::CreateCpu( OrtAllocatorType::OrtArenaAllocator, OrtMemType::OrtMemTypeDefault); Ort::Value input_tensor Ort::Value::CreateTensorfloat( memory_info, blob.ptrfloat(), blob.total(), input_shape.data(), input_shape.size()); // 执行推理 auto outputs session.Run(Ort::RunOptions{nullptr}, input_names.data(), input_tensor, 1, output_names.data(), output_names.size()); // 解析输出 return postprocess(outputs); } private: Ort::Env env; Ort::Session session; // ... 其他成员和方法 };5. 设计检测结果可视化界面在mainwindow.ui中设计以下UI元素QGraphicsView用于显示检测画面QLabel用于显示帧率信息QPushButton用于开始/停止检测实现视频检测线程class DetectionThread : public QThread { Q_OBJECT public: explicit DetectionThread(QObject *parent nullptr) : QThread(parent), isRunning(false) {} void run() override { cv::VideoCapture cap(0); // 打开摄像头 while(isRunning) { cv::Mat frame; cap frame; if(frame.empty()) continue; auto detections detector.detect(frame); emit detectionDone(frame, detections); } } void stop() { isRunning false; } signals: void detectionDone(const cv::Mat frame, const std::vectorDetection detections); private: std::atomicbool isRunning; YOLOv5Detector detector{yolov5s.onnx}; };在主窗口中连接信号槽MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui-setupUi(this); thread new DetectionThread(this); connect(thread, DetectionThread::detectionDone, this, MainWindow::updateDetectionResult); } void MainWindow::updateDetectionResult(const cv::Mat frame, const std::vectorDetection detections) { // 绘制检测框 cv::Mat result frame.clone(); for(const auto det : detections) { cv::rectangle(result, det.bbox, cv::Scalar(0,255,0), 2); cv::putText(result, det.label, cv::Point(det.bbox.x, det.bbox.y-5), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0,255,0), 1); } // 转换为QImage显示 QImage qimg(result.data, result.cols, result.rows, QImage::Format_RGB888); ui-graphicsView-setPixmap(QPixmap::fromImage(qimg)); }6. 性能优化技巧在实际部署中我发现几个有效的优化方法模型量化将FP32模型转为INT8速度提升2-3倍# 量化模型导出 model.fuse().eval() quantized_model torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtypetorch.qint8) torch.onnx.export(quantized_model, torch.randn(1,3,640,640), yolov5s_int8.onnx)多线程处理使用QtConcurrent处理图像预处理QFuturecv::Mat future QtConcurrent::run([](){ return preprocessImage(frame); });GPU加速如果使用NVIDIA显卡编译带CUDA支持的OpenCV和ONNX Runtime# 编译OpenCV时添加 -D WITH_CUDAON -D CUDA_ARCH_BIN7.5 # 根据显卡算力修改内存池重用中间结果内存class MemoryPool { public: cv::Mat getMat(int rows, int cols, int type) { auto key std::make_tuple(rows, cols, type); if(pool.count(key) !pool[key].empty()) { auto mat pool[key].back(); pool[key].pop_back(); return mat; } return cv::Mat(rows, cols, type); } void returnMat(cv::Mat mat) { auto key std::make_tuple(mat.rows, mat.cols, mat.type()); pool[key].push_back(std::move(mat)); } private: std::mapstd::tupleint,int,int, std::vectorcv::Mat pool; };7. 跨平台部署方案QT的优势在于跨平台能力针对不同平台的部署需要注意Windows平台使用Visual Studio编译QT和依赖库打包时需要带上Qt5Core.dll等运行时库platforms/qwindows.dllOpenCV的DLL文件推荐使用windeployqt工具自动收集依赖嵌入式Linux交叉编译QT和OpenCV在.pro文件中指定交叉编译工具链# 树莓派示例 QMAKE_CC arm-linux-gnueabihf-gcc QMAKE_CXX arm-linux-gnueabihf-gAndroid平台安装QT的Android组件配置NDK、SDK路径在.pro中添加android { ANDROID_EXTRA_LIBS $$PWD/libs/android/libonnxruntime.so }实际部署到Jetson Nano这类边缘设备时建议使用TensorRT加速。我测试过YOLOv5s在Nano上使用TensorRT可以达到15FPS的实时性能。关键是要使用适当的输入分辨率如320x320和FP16精度。

相关文章:

从零搭建QT(C++)开发环境到实战部署YOLOV5模型

1. 环境准备:从零搭建QT开发环境 第一次接触QT开发的朋友可能会被各种安装选项搞懵,我刚开始配置环境时也踩过不少坑。这里分享一个经过验证的安装方案,适用于大多数Linux系统(以Ubuntu为例)。 首先需要安装基础编译工…...

好写作AI:毕业论文的“智能魔法棒”,解锁学术新境界

在学术的征途中,毕业论文如同一座巍峨的山峰,让无数攀登者既期待又畏惧。它不仅是对多年学习成果的检验,更是个人智慧与创造力的集中展现。但面对复杂的结构、严谨的逻辑、浩瀚的文献,以及那令人头疼的格式要求,你是否…...

不止于仿真:用Cadence Virtuoso IC617的Marker和计算器功能高效分析工艺角(以SMIC 0.18um为例)

高效工艺角分析:Cadence Virtuoso IC617的Marker与计算器高阶应用 在集成电路设计领域,工艺角分析是验证设计鲁棒性的关键环节。传统的手动测量方法不仅效率低下,还容易引入人为误差。本文将深入探讨如何利用Cadence Virtuoso IC617中的Advan…...

Codex CLI实战:5分钟搞定React Hooks重构与数据库迁移(附避坑指南)

Codex CLI实战:5分钟搞定React Hooks重构与数据库迁移(附避坑指南) 在快节奏的现代开发中,效率工具的价值愈发凸显。最近半年,身边不少团队开始将Codex CLI作为日常开发的"瑞士军刀"——特别是处理那些重复性…...

Windows Defender系统优化工具:提升系统性能的终极方案

Windows Defender系统优化工具:提升系统性能的终极方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirrors/wi…...

别再纠结选哪个了!手把手教你根据项目需求选对Go框架:Gin、Kratos还是Zero?

实战指南:如何为你的Go项目精准匹配框架——Gin、Kratos与Zero深度解析 当启动一个新项目时,选择正确的框架往往决定了后续开发的顺畅程度。面对Gin、Kratos和Zero这三个主流Go框架,很多开发者会陷入选择困难。本文将带你从实际项目需求出发&…...

告别乱码黑屏:FBTFT驱动ST7789屏幕的常见问题排查与修复指南

告别乱码黑屏:FBTFT驱动ST7789屏幕的常见问题排查与修复指南 当你在树莓派或香橙派上尝试用FBTFT驱动ST7789屏幕时,最令人沮丧的莫过于接好线后——屏幕要么一片漆黑,要么疯狂闪烁乱码。作为一款被移入Linux内核staging目录的驱动框架&#x…...

告别手动计算!用EB工具链高效配置S32K144的Dio与Port模块

告别手动计算!用EB工具链高效配置S32K144的Dio与Port模块 在汽车电子开发中,S32K1XX系列MCU因其出色的实时性和可靠性成为主流选择。但面对数百个引脚配置,传统手动计算PCR值、逐项填写寄存器的方式不仅效率低下,还容易引入人为错…...

OpenClaw+Phi-3-vision无障碍应用:图片转语音助手的实现

OpenClawPhi-3-vision无障碍应用:图片转语音助手的实现 1. 项目背景与动机 去年夏天,我在社区图书馆做志愿者时遇到一位视障读者。他需要将纸质书籍内容转换成语音,但现有工具要么操作复杂,要么需要付费订阅。这件事让我开始思考…...

性价比高的南昌实体店线上获客哪个靠谱

在南昌,实体店想要在竞争激烈的市场中脱颖而出,线上获客是关键。然而,面对众多的线上获客途径,哪个才靠谱且性价比高呢?今天,我们就来详细探讨一下,同时为大家推荐南昌琨瑜象限本地生活运营服务…...

Balena Etcher在Arch Linux上的终极安装指南:3种简单方法轻松搞定镜像烧录

Balena Etcher在Arch Linux上的终极安装指南:3种简单方法轻松搞定镜像烧录 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher Balena Etcher是一款安全易…...

OpenClaw安装 Skill 完整指南:从哪里找、怎么安装到怎么验证

OpenClaw安装 Skill 完整指南:从哪里找、怎么安装到怎么验证 关键词:OpenClaw、OpenClaw Skill、OpenClaw安装Skill、OpenClaw教程、AI智能体、EasyClaw 摘要:很多人开始接触 OpenClaw 后,很快就会遇到一个问题:Skil…...

是德N5771A直流电源/keysight N5771A

是德N5771A直流电源/keysight N5771A 是德N5771A 探头是一款 直流电源 ,主要特点包括‌: ‌输出额定值‌:电压为300伏,电流为5安培,功率为1500瓦‌ ‌接口标准‌:支持 GPIB 、 LAN 、 USB 接口&#xff0…...

CATIA 转 SolidWorks 高效转换技巧:迪威模型网实战解析

1. CATIA与SolidWorks转换的必要性 在工程设计领域,CATIA和SolidWorks就像两个说着不同方言的工程师。我见过太多团队因为文件格式不通用而耽误进度,特别是当汽车供应商收到主机厂的CATIA文件时,经常需要熬夜加班做格式转换。迪威模型网的在线…...

从PID到阻抗:机器人柔顺控制的模型演进与动力学角色

1. PID控制的本质与局限性 我第一次接触机器人控制时,导师就让我从PID开始学起。这个诞生于上世纪的控制算法,至今仍是工业界的"万金油"。但真正用它做过机器人项目的人都知道,PID就像一把锤子——简单粗暴但缺乏灵活性。 PID的核心…...

打字不如说话,说话不如截图——AI 代码助手的多模态输入实践偈

整体排查思路 我们的目标是验证以下三个环节是否正常: 登录成功时:服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端:浏览器是否成功接收并存储了该Cookie。 后续请求:浏览器在执行查询等操作…...

[特殊字符] 《网络知识和Servlet重点知识整理》

一、网络作用(基础认知) 核心作用:实现不同设备之间的数据传输与通信,支撑互联网应用(网页、APP、游戏、视频等)。 信息传递:客户端 ↔ 服务器 资源共享:文件、数据库、计算资源 分…...

YOLOv12解决方案实战:智能安防、交通监控、工业检测三大场景应用

YOLOv12解决方案实战:智能安防、交通监控、工业检测三大场景应用 【免费下载链接】yolov12 [NeurIPS 2025] YOLOv12: Attention-Centric Real-Time Object Detectors 项目地址: https://gitcode.com/gh_mirrors/yo/yolov12 YOLOv12作为NeurIPS 2025最新发布的…...

避坑指南:在实现LL(1)语法分析器时,SELECT集合计算的那些‘坑’与调试技巧

LL(1)语法分析器实战:SELECT集合计算的七大陷阱与可视化调试方法论 当你按照教科书实现了一个LL(1)语法分析器,却发现它错误地将已知的LL(1)文法判定为非LL(1)文法时,问题往往出在SELECT集合的计算逻辑上。本文将揭示开发者常踩的七个关键陷阱…...

3步掌握Adobe-GenP:开源工具助力创意工作流效率提升

3步掌握Adobe-GenP:开源工具助力创意工作流效率提升 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 在数字创意领域,Adobe Creative Cloud套…...

旋转编码器底层驱动库:轻量级正交解码与抗抖动设计

1. 旋转编码器底层驱动库技术解析与工程实践旋转编码器(Rotary Encoder)是嵌入式系统中最为基础且高频使用的机电输入设备之一,广泛应用于工业HMI、电机调速面板、音频设备音量调节、医疗设备参数设定等场景。其核心价值在于提供无触点、高寿…...

别再只传明文了!SpringBoot若依框架接口Base64加解密避坑指南

若依框架接口安全升级:Base64编码传输的实战陷阱与解决方案 在前后端分离架构中,数据安全传输一直是开发者关注的焦点。最近接手一个金融类项目改造,客户明确要求所有接口数据必须经过编码处理。当我信心满满地准备用Base64方案快速实现时&am…...

告别“权限不足”:手把手教你用CobaltStrike的Bypass UAC功能搞定Windows提权

实战指南:利用CobaltStrike突破Windows权限限制 当你手握一个普通用户权限的Beacon会话,却卡在"请求的操作需要提升"的提示前,这种挫败感每个渗透测试员都深有体会。Windows的用户账户控制(UAC)就像一堵无形的墙,将普通…...

千问3.5-9B提示工程:提升OpenClaw复杂任务分解能力

千问3.5-9B提示工程:提升OpenClaw复杂任务分解能力 1. 为什么需要优化任务拆解能力 上周我让OpenClaw执行"整理上季度销售数据并邮件发送给团队"时,AI直接把原始CSV文件作为附件群发——这显然不是人类想要的"整理"结果。这个尴尬…...

ESPS USB MSC 调试全过程记录酪

背景 在软件开发的漫长旅途中,"构建"这个词往往让人又爱又恨。爱的是,一键点击,代码变成产品,那是程序员最迷人的时刻;恨的是,维护那一堆乱糟糟的构建脚本,简直是噩梦。 在很多项目中…...

Win11共享打印机报错0x00000709?别慌,试试这个注册表一键修复脚本

Win11共享打印机0x00000709错误终极修复指南:注册表脚本与深度解析 遇到Win11共享打印机报错0x00000709时,很多用户会陷入反复重装驱动、重启打印服务的循环中。这个看似简单的网络打印故障,实则与Windows的RPC通信协议配置密切相关。本文将提…...

Verdi 快速上手:信号追踪与波形调试实战

1. Verdi工具入门:数字IC调试的瑞士军刀 刚接触数字IC设计时,最让我头疼的就是仿真波形调试。密密麻麻的信号线像一团乱麻,根本不知道从哪里下手。直到同事推荐了Verdi,这个被业界称为"调试神器"的工具彻底改变了我的工…...

在Laravel 8中配置和使用基于IP的API限流策略

引言在Web开发中,API限流是保护服务器免受恶意请求和滥用的重要手段。Laravel框架提供了简单而强大的限流功能,可以轻松实现基于IP地址的请求限制。本文将详细介绍如何在Laravel 8中配置和使用基于IP的API限流策略。为什么需要API限流?API限流…...

AirPlay协议开源实现全攻略:从Raspberry Pi到Linux的5种方案实测

AirPlay协议开源实现全攻略:从Raspberry Pi到Linux的5种方案实测 在智能家居和多媒体共享领域,AirPlay协议因其出色的用户体验和苹果生态的广泛普及而备受关注。然而,官方AirPlay服务仅限于苹果自家设备,这促使开发者社区涌现出多…...

OpenClaw数据标注:Qwen3.5-9B-AWQ-4bit辅助制作AI训练数据集

OpenClaw数据标注:Qwen3.5-9B-AWQ-4bit辅助制作AI训练数据集 1. 为什么需要AI辅助数据标注 作为一个经常折腾个人机器学习项目的开发者,数据标注一直是我最头疼的环节。上周在做一个垃圾分类模型时,面对2000多张待标注的垃圾图片&#xff0…...