赞
踩
目录
基于自己的经验,给大家总结出了一套YoloV8结合PyQt5的教程,希望对大家能够有帮助,同时我的代码给大家提供了下载方式
链接: https://pan.baidu.com/s/1xBVSrPdALdXNdKQntRsU5w?pwd=gps8 提取码: gps8
--来自百度网盘超级会员v4的分享
1.创建虚拟环境,作者这里使用Anaconda3创建虚拟环境。
2.安装所需库,为加速下载这里使用清华大学镜像源。
(1)安装PyQt5
pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
(2)安装pyqt5-tools
pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
(3)安装ultralytics
pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple/
1.定位并打开designer.exe程序
安装好PyQt5及pyqt5-tools之后,打开QtDesigener,如果你和我一样使用的Anaconda3创建虚拟环境下载的库,首先在文件管理器中打开Anaconda3所在位置并定位至虚拟环境所在位置,按照以下位置定位QtDesigner,点击运行。
2.开始绘制界面
(1)进入应用,这里选择Widget即可
(2)拖动相关部件进入界面,主要用到PushButton和Label即可
(3)给每个标签和按钮命名以便后期代码操作,对控件和布局稍做美化,这里可以查询相关教程,不再做过多描述;
3.保存并转化文件
(1)打开Pycharm,新建一个名为YOLO_QT的项目,使用上面创建的虚拟环境,并将上述UI文件保存到项目下
(2)将yolov8.ui文件转化成py文件,终端输入,即可看到项目下生成了一个.py后缀的Python文件
pyuic5 -o yolov8.py yolov8.ui
根据第二步操作我们得到了名为yolov8.py的文件,这个文件就是整个可视化界面部分,为了做到前后端分开,我们这里新建一个名为main.py的文件,新建一个类并继承yolov8.py中的类
(1)首先导入相关库
- import sys
- from PyQt5 import QtWidgets, QtCore
- from PyQt5.QtWidgets import QFileDialog
- from PyQt5.QtGui import QPixmap, QImage
- import cv2
- from ultralytics import YOLO
- from yolov8 import Ui_Form
这里指的一提的是,from yolov8 import Ui_Form是从yolov8.py中导入Ui_Form这个类,仔细观察yolov8.py可以发现,所有的代码都是写在Ui_Form这个类里面的,这部分内容对没有学过面向对象的同学不太好理解
(2)新建一个类MainWindow,导入模型文件以及设置好相关变量,绑定好按钮对应的函数,由于我已经在QtDesigner里面更改了控件名称,所以可能有的同学代码会报错,可以用我上述链接里的yolov8.py替换掉你项目下的yolov8.py,这里的yolov8.pt模型文件,可以自行去yolov8官网下载,同时我的网盘里也可以下载,也可以换成你自己的模型文件
- class MainWindow(QtWidgets.QWidget, Ui_Form):
- def __init__(self):
- try:
- super().__init__()
- self.setupUi(self)
- self.model = YOLO("yolov8n.pt")
- self.timer = QtCore.QTimer()
- self.timer.timeout.connect(self.update_frame)
-
- self.cap = None
- self.is_detection_active = False
- self.current_frame = None
-
- # 各个按钮绑定功能
- self.picture_detect_pushButton.clicked.connect(self.load_picture)
- self.video_detect_pushButton.clicked.connect(self.load_video)
- self.camera_detect_pushButton.clicked.connect(self.start_camera)
- self.start_detect_pushButton.clicked.connect(self.start_detection)
- self.stop_detect_pushButton.clicked.connect(self.stop_detection)
- self.pause_detect_pushButton.clicked.connect(self.pause_detect)
-
-
- except Exception as e:
- print(e)
这里继承了Ui_Form类,这样Ui_Form类里面所有的按钮以及其他布局,都被MainWindow类拿过来使用了,同时,定义了两个变量is_detection_active、current_frame,主要作用是为了视频检测的开始与暂停
(3)各按钮所对应的核心函数
- def load_picture(self):
- try:
- fileName, _ = QFileDialog.getOpenFileName(self, "选择图片", "", "Image Files (*.jpg *.png)")
- self.is_detection_active = False
-
- if fileName:
- if self.timer.isActive():
- self.timer.stop()
- if self.cap:
- self.cap.release()
- self.cap = None
-
- self.current_frame = cv2.imread(fileName)
- self.display_image(self.current_frame, self.original_image)
- results = self.model.predict(self.current_frame)
- self.detected_frame = results[0].plot() # 获取检测结果的帧并保存
- self.display_image(self.detected_frame, self.detected_image)
- except Exception as e:
- print(e)
-
- def load_video(self):
- fileName, _ = QFileDialog.getOpenFileName(self, "选择视频", "", "Video Files (*.mp4 *.avi)")
- if fileName:
- if self.cap:
- self.cap.release()
- self.cap = None
-
- self.cap = cv2.VideoCapture(fileName)
-
- if self.cap.isOpened():
- ret, frame = self.cap.read()
- if ret:
- self.current_frame = frame.copy()
- self.display_image(frame, self.original_image)
- self.display_image(frame, self.detected_image)
- else:
- QtWidgets.QMessageBox.warning(self, 'Error', '无法读取视频文件的第一帧。')
-
- def start_camera(self):
- self.is_detection_active = False
- if self.cap:
- self.cap.release()
- self.cap = cv2.VideoCapture(0)
- self.timer.start(20)
-
- def update_frame(self):
- if self.cap:
- ret, frame = self.cap.read()
- if ret:
- self.current_frame = frame.copy()
- self.display_image(frame, self.original_image)
-
- if self.is_detection_active:
- results = self.model.predict(frame)
- self.detected_frame = results[0].plot() # 获取检测结果的帧并保存
- self.display_image(self.detected_frame, self.detected_image)
-
- def start_detection(self):
- if self.cap and not self.cap.isOpened():
- self.cap.open(self.fileName)
- if self.cap and not self.timer.isActive():
- self.timer.start(20)
- self.is_detection_active = True
-
- def display_image(self, frame, target_label):
- frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
- height, width, channel = frame.shape
- step = channel * width
- qImg = QImage(frame.data, width, height, step, QImage.Format_RGB888)
- pixmap = QPixmap.fromImage(qImg)
- scaled_pixmap = pixmap.scaled(target_label.size(), QtCore.Qt.KeepAspectRatio)
- target_label.setPixmap(scaled_pixmap)
-
- def pause_detect(self):
- self.is_detection_active = False
-
- if self.timer.isActive():
- self.timer.stop()
-
- def stop_detection(self):
- self.is_detection_active = False
-
- if self.timer.isActive():
- self.timer.stop()
-
- if self.cap:
- self.cap.release()
- self.cap = None
-
- self.clear_display(self.original_image)
- self.clear_display(self.detected_image)
-
- def clear_display(self, target_label):
- target_label.clear()
- target_label.setText('')
-
- if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- main_window = MainWindow()
- main_window.show()
- sys.exit(app.exec_())
其中检测部分最核心部分代码如下
results = self.model.predict(self.current_frame)
希望以上教程能够对大家有帮助,有任何疑问可以在评论区留言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。