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博客