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