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 sysfrom PyQt5.QtWidgets import QApplication, QLabelapp = QApplication([])label = QLabel(\'Hello PyQt5!\')label.show()sys.exit(app.exec_())
可以直接在虚拟环境中命令行输入:python,输入上面代码,按回车。
弹出一个小窗口是安装成功。
复杂的
import sysfrom PyQt5.QtCore import Qt, QTimerfrom PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, \\ QMessageBox, QFileDialogfrom PyQt5.QtGui import QImage, QPixmap, QIconimport cv2from ultralytics import YOLOclass Worker: def __init__(self): self.model = None def load_model(self): model_path, _ = QFileDialog.getOpenFileName(None, \"选择模型文件\", \"\", \"模型文件 (*.pt)\") if model_path: self.model = YOLO(model_path) return self.model is not None return False def 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;\') # 添加边框并设置背景颜色为黑色 # 水平布局,用于放置左右两个 QLabel layout = 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 = None def 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) # 转换为 RGB height1, width1, channel1 = image_rgb.shape bytesPerLine1 = 3 * width1 qimage1 = 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) # 转换为 RGB height2, width2, channel2 = annotated_image.shape bytesPerLine2 = 3 * width2 qimage2 = 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.cls object_count = len(det_info) object_info = f\"识别到的物体总个数:{object_count}\\n\" object_dict = {} class_names_dict = self.current_results[0].names for class_id in det_info: class_name = class_names_dict[int(class_id)] if class_name in object_dict: object_dict[class_name] += 1 else: object_dict[class_name] = 1 sorted_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/pluginsexport 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博客