yolov8 pyQt5
时间: 2025-03-04 08:41:11 浏览: 36
### 将YOLOv8与PyQt5集成
为了将YOLOv8模型集成到基于PyQt5的应用程序中,可以遵循以下方法来创建一个图形界面应用程序,该应用能够加载图像并使用YOLOv8执行对象检测。
#### 创建主窗口类
定义一个继承自`QMainWindow`的类作为主窗口,在其中设置菜单栏、工具栏以及状态栏等功能组件。通过这个类管理整个GUI布局和逻辑控制流。
```python
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QFileDialog
import sys
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("YOLOv8 Object Detection App")
layout = QVBoxLayout()
self.label = QLabel("No image selected.")
layout.addWidget(self.label)
btn_load_image = QPushButton("Load Image")
btn_load_image.clicked.connect(self.load_image)
layout.addWidget(btn_load_image)
container = QWidget()
container.setLayout(layout)
self.setCentralWidget(container)
def load_image(self):
options = QFileDialog.Options()
fileName, _ = QFileDialog.getOpenFileName(
None,
"Select an Image",
"",
"Images (*.png *.jpg)",
options=options
)
if fileName:
self.label.setText(f"Image loaded: {fileName}")
```
这段代码展示了如何构建基本框架[^1]。
#### 集成YOLOv8推理功能
引入必要的库来进行YOLOv8预测操作,并将其嵌入到上述定义的方法里:
```python
import torch
from ultralytics.yolo.engine.model import YOLO
model_path = 'path/to/yolov8_model.pt' # 替换成实际路径
yolo_model = YOLO(model_path)
def predict_with_yolov8(image_path):
results = yolo_model.predict(source=image_path)[0].boxes.data.tolist()
detected_objects = []
for result in results:
class_id = int(result[-1])
confidence = float(result[4])
bbox = [round(x.item()) for x in result[:4]]
obj_info = {"bbox": bbox, "confidence": confidence}
detected_objects.append(obj_info)
return detected_objects
```
此部分实现了调用预训练好的YOLOv8权重文件完成图片中的物体识别任务[^4]。
最后一步是在点击按钮事件处理器内加入对新函数`predict_with_yolov8()` 的调用,从而实现当用户选择了特定图片之后自动触发目标检测过程并将结果显示出来。
#### 完整示例代码片段
以下是完整的Python脚本样例,它包含了前面提到的所有要素:
```python
import sys
import os.path as osp
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import (
QApplication,
QMainWindow,
QLabel,
QVBoxLayout,
QWidget,
QPushButton,
QFileDialog,
QGraphicsScene,
QGraphicsView,
QMessageBox
)
import torch
from ultralytics.yolo.engine.model import YOLO
# 加载YOLOv8模型
model_path = './best.pt'
assert osp.exists(model_path), f"{model_path} does not exist."
yolo_model = YOLO(model_path)
class ImageViewer(QWidget):
def __init__(self, parent=None):
super(ImageViewer, self).__init__(parent=parent)
scene = QGraphicsScene(self)
view = QGraphicsView(scene)
layout = QVBoxLayout()
layout.addWidget(view)
self.setLayout(layout)
self.scene = scene
self.view = view
def show_image(self, img_file_name):
pixmap = QPixmap(img_file_name)
item = self.scene.addPixmap(pixmap)
self.view.fitInView(item.boundingRect(), Qt.KeepAspectRatio)
self.adjustSize()
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.image_viewer = ImageViewer(parent=self)
self.setCentralWidget(self.image_viewer)
menu_bar = self.menuBar()
file_menu = menu_bar.addMenu("&File")
open_action = file_menu.addAction("&Open...")
open_action.triggered.connect(self.open_image_dialog)
detect_button = QPushButton('Detect Objects', self)
detect_button.move(20, 70)
detect_button.clicked.connect(lambda checked: self.detect_objects())
def open_image_dialog(self):
options = QFileDialog.Options()
filename, _ = QFileDialog.getOpenFileName(
caption="Choose an image", filter="Images (*.png *.jpeg *.bmp)", options=options
)
if filename != '':
try:
self.image_viewer.show_image(filename)
self.current_img_filename = filename
except Exception as e:
msg_box = QMessageBox.critical(None, "Error opening image.", str(e))
def detect_objects(self):
if hasattr(self, 'current_img_filename'):
detections = predict_with_yolov8(self.current_img_filename)
message_text = "\n".join([
f"BBox={d['bbox']}, Confidence={d['confidence']:.2f}"
for d in detections
])
QMessageBox.information(None, "Detection Results", message_text)
else:
QMessageBox.warning(None, "", "Please select an image first.")
app = QApplication(sys.argv)
window = MainWindow()
window.resize(600, 400)
window.show()
sys.exit(app.exec_())
```
阅读全文
相关推荐


















