yolo--qt可視化開發

qt5可能不支持我們的cuda版本,改用qt6

YOLO11+QT6+Opencv+C++訓練加載模型全過程講解_yolov11 模型轉換成opencv c++模型-CSDN博客


下面是qt5版本的案例,和yolo及cuda有沖突

安裝qt

切換到虛擬環境,例如pyqt,conda activate pyqt

pip install PyQt5

驗證安裝結果

寫一個簡單程序

import sys
from PyQt5.QtWidgets import QApplication, QLabelapp = QApplication([])
label = QLabel('Hello PyQt5!')
label.show()
sys.exit(app.exec_())

可以直接在虛擬環境中命令行輸入:python,輸入上面代碼,按回車。?

彈出一個小窗口是安裝成功。

復雜的

import sys
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, \QMessageBox, QFileDialog
from PyQt5.QtGui import QImage, QPixmap, QIcon
import cv2
from ultralytics import YOLOclass Worker:def __init__(self):self.model = Nonedef load_model(self):model_path, _ = QFileDialog.getOpenFileName(None, "選擇模型文件", "", "模型文件 (*.pt)")if model_path:self.model = YOLO(model_path)return self.model is not Nonereturn Falsedef detect_image(self, image):results = self.model.predict(image)return resultsclass MainWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("@author:笑臉惹桃花")# self.setWindowIcon(QIcon("icon.png"))self.setGeometry(300, 150, 800, 400)# 創建兩個 QLabel 分別顯示左右圖像self.label1 = QLabel()self.label1.setAlignment(Qt.AlignCenter)self.label1.setMinimumSize(580, 450)  # 設置大小self.label1.setStyleSheet('border:3px solid #6950a1; background-color: black;')  # 添加邊框并設置背景顏色為黑色self.label2 = QLabel()self.label2.setAlignment(Qt.AlignCenter)self.label2.setMinimumSize(580, 450)  # 設置大小self.label2.setStyleSheet('border:3px solid #6950a1; background-color: black;')  # 添加邊框并設置背景顏色為黑色# 水平布局,用于放置左右兩個 QLabellayout = QVBoxLayout()# layout.addWidget(self.label1)hbox_video = QHBoxLayout()hbox_video.addWidget(self.label1)  # 左側顯示原始圖像hbox_video.addWidget(self.label2)  # 右側顯示檢測后的圖像layout.addLayout(hbox_video)self.worker = Worker()# 創建按鈕布局hbox_buttons = QHBoxLayout()# 添加模型選擇按鈕self.load_model_button = QPushButton("📁模型選擇")self.load_model_button.clicked.connect(self.load_model)self.load_model_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.load_model_button)# 添加圖片檢測按鈕self.image_detect_button = QPushButton("💾圖片檢測")self.image_detect_button.clicked.connect(self.detect_image)self.image_detect_button.setEnabled(False)self.image_detect_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.image_detect_button)# 添加顯示檢測物體按鈕self.display_objects_button = QPushButton("🔍顯示檢測物體")self.display_objects_button.clicked.connect(self.show_detected_objects)self.display_objects_button.setEnabled(False)self.display_objects_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.display_objects_button)# 添加退出按鈕self.exit_button = QPushButton("?退出")self.exit_button.clicked.connect(self.exit_application)self.exit_button.setFixedSize(120, 30)hbox_buttons.addWidget(self.exit_button)layout.addLayout(hbox_buttons)central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)self.current_results = Nonedef detect_image(self):image_path, _ = QFileDialog.getOpenFileName(None, "選擇圖片文件", "", "圖片文件 (*.jpg *.jpeg *.png)")if image_path:image = cv2.imread(image_path)if image is not None:self.current_results = self.worker.detect_image(image)if self.current_results:annotated_image = self.current_results[0].plot()image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)  # 轉換為 RGBheight1, width1, channel1 = image_rgb.shapebytesPerLine1 = 3 * width1qimage1 = QImage(image_rgb.data, width1, height1, bytesPerLine1, QImage.Format_RGB888)pixmap1 = QPixmap.fromImage(qimage1)self.label1.setPixmap(pixmap1.scaled(self.label1.size(), Qt.KeepAspectRatio))annotated_image = cv2.cvtColor(annotated_image, cv2.COLOR_BGR2RGB)  # 轉換為 RGBheight2, width2, channel2 = annotated_image.shapebytesPerLine2 = 3 * width2qimage2 = QImage(annotated_image.data, width2, height2, bytesPerLine2, QImage.Format_RGB888)pixmap2 = QPixmap.fromImage(qimage2)self.label2.setPixmap(pixmap2.scaled(self.label2.size(), Qt.KeepAspectRatio))def show_detected_objects(self):if self.current_results:det_info = self.current_results[0].boxes.clsobject_count = len(det_info)object_info = f"識別到的物體總個數:{object_count}\n"object_dict = {}class_names_dict = self.current_results[0].namesfor class_id in det_info:class_name = class_names_dict[int(class_id)]if class_name in object_dict:object_dict[class_name] += 1else:object_dict[class_name] = 1sorted_objects = sorted(object_dict.items(), key=lambda x: x[1], reverse=True)for obj_name, obj_count in sorted_objects:object_info += f"{obj_name}: {obj_count}\n"self.show_message_box("識別結果", object_info)else:self.show_message_box("識別結果", "未檢測到物體")def show_message_box(self, title, message):msg_box = QMessageBox(self)msg_box.setWindowTitle(title)msg_box.setText(message)msg_box.exec_()def load_model(self):if self.worker.load_model():self.image_detect_button.setEnabled(True)self.display_objects_button.setEnabled(True)def exit_application(self):# 終止程序運行sys.exit()if __name__ == '__main__':app = QApplication(sys.argv)window = MainWindow()window.show()sys.exit(app.exec_())

報錯:

安裝opencv

conda install -c conda-forge opencv

安裝訓練庫?

在虛擬環境安裝

pip install -i https://mirrors.aliyun.com/pypi/simple/ ultralytics torch torchvision

檢查yolo

yolo checks

export QT_PLUGIN_PATH=~/miniconda3/envs/yoloenv/lib/python3.13/site-packages/cv2/qt/plugins
export QT_QPA_PLATFORM_PLUGIN_PATH=$QT_PLUGIN_PATH/platforms

?檢查插件文件狀態?

  • 確認libqxcb.so文件存在于$QT_PLUGIN_PATH/platforms/目錄
  • 賦予執行權限:
chmod +x ~/miniconda3/envs/yoloenv/lib/python3.13/site-packages/cv2/qt/plugins/platforms/libqxcb.so

PyQt5+Anaconda+PyCharm安裝、配置和使用_anaconda pyqt5 pycharm-CSDN博客

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

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

相關文章

SQL性能優化

show [session|global] status : 查看服務器狀態 show global status like Com_ : 查看各種語句的執行次數 開啟慢查詢: 在 MySQL 配置文件(/etc/my.cnf)配置: #開啟MySQL慢日志查詢開關 slow_query_log1 #設置慢日志的時間為2秒,SQL語句執…

ctfshow pwn40

目錄 1. 分析程序 2. 漏洞編寫 3. 漏洞驗證 1. 分析程序 首先檢查程序相關保護,發現程序為32位且只開啟了一個NX保護 checksec pwn 使用IDA進行逆向分析代碼,查看漏洞觸發點: 在main函數中,有一個ctfshow函數,這里…

SQL173 店鋪901國慶期間的7日動銷率和滯銷率

SQL173 店鋪901國慶期間的7日動銷率和滯銷率 SQL題解:店鋪動銷率與滯銷率計算 關鍵:只要當天任一店鋪有任何商品的銷量就輸出該天的結果,即使店鋪901當天的動銷率為0。 潛臺詞:?輸出邏輯與店鋪901的銷售情況無關,只取…

PytorchLightning最佳實踐基礎篇

PyTorch Lightning(簡稱 PL)是一個建立在 PyTorch 之上的高層框架,核心目標是剝離工程代碼與研究邏輯,讓研究者專注于模型設計和實驗思路,而非訓練循環、分布式配置、日志管理等重復性工程工作。本文從基礎到進階&…

Apache Flink 實時流處理性能優化實踐指南

Apache Flink 實時流處理性能優化實踐指南 隨著大數據和實時計算需求不斷增長,Apache Flink 已經成為主流的流處理引擎。然而,在生產環境中,高并發、大吞吐量和低延遲的業務場景對 Flink 作業的性能提出了更高要求。本文將從原理層面深入解析…

ubuntu上將TempMonitor加入開機自動運行的方法

1.新建一個TempMonitor.sh文件,內容如下:#!/bin/bashcd /fjrobot/ ./TempMonitor &2.執行以下命令chmod x TempMonitor chmod x TempMonitor.sh rm -rf /etc/rc2.d/S56TempMonitor rm -rf /etc/init.d/TempMonitor cp /fjrobot/TempMonitor.sh /etc/…

速賣通自養號測評技術解析:IP、瀏覽器與風控規避的實戰方案

一、速賣通的“春天”來了,賣家如何抓住機會?2025年的夏天,速賣通的風頭正勁。從沙特市場躍升為第二大電商平臺,到8月大促返傭力度升級,平臺對優質商家的扶持政策越來越清晰。但與此同時,競爭也愈發激烈——…

adb: CreateProcessW failed: 系統找不到指定的文件

具體錯誤 adb devices * daemon not running; starting now at tcp:5037 adb: CreateProcessW failed: 系統找不到指定的文件。 (2) * failed to start daemon adb.exe: failed to check server version: cannot connect to daemon 下載最新的platform-tools-windows 下載最新…

Centos安裝HAProxy搭建Mysql高可用集群負載均衡

接上文MYSQL高可用集群搭建–docker https://blog.csdn.net/weixin_43914685/article/details/149647589?spm1001.2014.3001.5501 連接到你搭建的 Percona XtraDB Cluster (PXC) 數據庫集群,實現高可用性和負載均衡,建議使用一個中間件來管理這些連接。…

Sql server開掛的OPENJSON

以前一直用sql server2008,自從升級成sql server2019后,用OPENJSON的感覺像開掛,想想以前表作為參數傳輸時的痛苦,不堪回首。一》不堪回首 為了執行效率,很多時候希望將表作為參數傳給數據庫的存儲過程。存儲過程支持自…

【數據結構】隊列和棧練習

1.用隊列實現棧 225. 用隊列實現棧 - 力扣(LeetCode) typedef int QDatatype; typedef struct QueueNode {struct QueueNode *next;QDatatype data; }QNode;typedef struct Queue {QNode* head;QNode* tail;QDatatype size; }Que;typedef struct {Que…

LabVIEW二維碼實時識別

?LabVIEW通過機器視覺技術,集成適配硬件構建二維碼實時識別系統。通過圖像采集、預處理、定位及識別全流程自動化,解決復雜環境下二維碼識別效率低、準確率不足問題,滿足工業產線追溯、物流分揀等實時識別需求。應用場景適用于工業產線追溯&…

微服務-springcloud-springboot-Skywalking詳解(下載安裝)

一、SkyWalking核心介紹 1. 什么是SkyWalking? Apache SkyWalking是一款國人主導開發的開源APM(應用性能管理)系統,2015年由吳晟創建,2017年進入Apache孵化器,2019年畢業成為Apache頂級項目。它通過分布式…

Elasticsearch 字段值過長導致索引報錯問題排查與解決經驗總結

在最近使用 Elasticsearch 的過程中,我遇到了一個 字段值過長導致索引失敗 的問題。經過排查和多次嘗試,最終通過設置字段 "index": false 方式解決。本文將從問題現象、排查過程、問題分析、解決方案和建議等方面,詳細記錄這次踩坑…

使用idea 將一個git分支的部分記錄合并到git另一個分支

場景: 有多個版本分支,需要將其中一個分支的某一兩次提交合并到指定分支上 eg: 將v1.0.0分支中指定提交記錄 合并到 v1.0.1分支中 操作: 步驟一 idea切換項目分支到v1.0.1(需要合并到哪個分支就先站到哪個分支上) 步驟二 在ide…

基于深度學習的圖像分類:使用ShuffleNet實現高效分類

前言 圖像分類是計算機視覺領域中的一個基礎任務,其目標是將輸入的圖像分配到預定義的類別中。近年來,深度學習技術,尤其是卷積神經網絡(CNN),在圖像分類任務中取得了顯著的進展。ShuffleNet是一種輕量級的…

OpenGL里相機的運動控制

相機的核心構造一個是glm::lookAt函數,一個是glm::perspective函數,本文相機的一切運動都在于如何構建相應的參數傳入上述兩個函數里。glm::mat4 glm::lookAt(glm::vec3 const &eye,//相機所在位置glm::vec3 const &center,//要凝視的點glm::vec…

java設計模式 -【策略模式】

策略模式定義 策略模式(Strategy Pattern)是一種行為設計模式,允許在運行時選擇算法的行為。它將算法封裝成獨立的類,使得它們可以相互替換,而不影響客戶端代碼。 核心組成 Context(上下文)&…

項目重新發布更新緩存問題,Nginx清除緩存更新網頁

server {listen 80;server_name your.domain.com; # 替換為你的域名root /usr/share/nginx/html; # 替換為你的項目根目錄# 規則1:HTML 文件 - 永不緩存# 這是最關鍵的一步,確保瀏覽器總是獲取最新的入口文件。location /index.html {add_header Cache-…

系統架構師:系統安全與分析-思維導圖

系統安全與分析的定義??系統安全與分析是系統架構師在系統全生命周期中貫穿的核心職責,其本質是通過??識別、評估、防控安全風險,并基于數據與威脅情報進行動態分析??,構建從技術到管理的多層次防護體系,確保系統的保密性&a…