【Yolov8】图形化检测视频-源码免费分享

如果你还不懂YOLOv8的安装、推理,自定义数据集训练与搭建的,可以看一下老师这篇文章和视频
https://blog.csdn.net/chajinglong/article/details/149105590?spm=1001.2014.3001.5501https://blog.csdn.net/chajinglong/article/details/149105590?spm=1001.2014.3001.5501

https://www.bilibili.com/video/BV1qtHeeMEnC/?spm_id_from=333.337.search-card.all.click&vd_source=27c8ea1c143ecfe9f586177e5e7027cfhttps%3A%2F%2Fwww.bilibili.com%2Fvideo%2FBV1qtHeeMEnC%2F%3Fspm_id_from%3D333.337.search-card.all.click&vd_source=27c8ea1c143ecfe9f586177e5e7027cfhttps://www.bilibili.com/video/BV1qtHeeMEnC/?spm_id_from=333.337.search-card.all.click&vd_source=27c8ea1c143ecfe9f586177e5e7027cfhttps%3A%2F%2Fwww.bilibili.com%2Fvideo%2FBV1qtHeeMEnC%2F%3Fspm_id_from%3D333.337.search-card.all.click&vd_source=27c8ea1c143ecfe9f586177e5e7027cf

很多同学问老师,这些课程能不能把文档写出来,分享到更多的人,那么今天它来了,整理成大纲给到同学们,希望能够帮助到你们,如果觉得写的可以,可以对照上面的视频和详细资料进行学习。

【YOLOv8零基础从入门到实战进阶系列教程】

https://www.bilibili.com/cheese/play/ep1342527?query_from=0&search_id=6883789517812043464&search_query=yolov8&csource=common_hpsearch_null_null&spm_id_from=333.337.search-card.all.clickhttps://www.bilibili.com/cheese/play/ep1342527?query_from=0&search_id=6883789517812043464&search_query=yolov8&csource=common_hpsearch_null_null&spm_id_from=333.337.search-card.all.click

​​

基于yolov8图形化目标检测视频(PyQt5 + ultralytics):

  1. 使用YOLO模型进行目标检测
  2. 处理图片和视频流
  3. 实现检测结果GUI可视化
python 复制代码
import sys #用于退出程序
from PyQt5.QtCore import Qt,QTimer #这些是 PyQt5 库的模块,用于构建图形用户界面(GUI)应用程序
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QPushButton, QHBoxLayout, \
    QMessageBox, QFileDialog
from PyQt5.QtGui import QImage, QPixmap
import cv2 #图像处理
from ultralytics import YOLO #深度学习模型接口,用于加载 YOLO(You Only Look Once)模型进行对象检测


#负责处理模型加载和图像检测的逻辑。
class 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)
            if self.model:
                return True
            else:
                return False

    #检测图片
    def detect_image(self, image_path):
        image = cv2.imread(image_path)
        if image is not None:
            results = self.model.predict(image)
            return results
        else:
            return None

    #打开视频
    def detect_video(self, video_path):
        # 打开视频文件
        self.cap = cv2.VideoCapture(video_path)
        if not self.cap.isOpened():
            return False
        return True

    #获取视频标注图像
    def get_frame(self):
        if self.cap is not None and self.cap.isOpened():
            ret, frame = self.cap.read()
            if ret:
                # 使用 YOLO 进行对象检测
                results = self.model.predict(frame)
                annotated_frame = results[0].plot()  # 用检测结果标注图像
                return annotated_frame
        return None

    #释放
    def release(self):
        if self.cap:
            self.cap.release()


#应用程序的主窗口,负责创建界面,处理用户交互和显示检测结果
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("YOLOv8-GUI(图形化界面)")
        """
        第一个:100,左上角屏幕左边缘水平距离(像素)
        第二个:100,左上角屏幕上边缘垂直距离(像素)
        第三个:100,设置窗口的宽度
        第四个:100,设置窗口的高度
        """
        self.setGeometry(100, 100, 1200, 800)

        self.label = QLabel()
        self.label.setAlignment(Qt.AlignCenter)

        self.label.setFixedSize(640,480)

        layout = QVBoxLayout()
        layout.addWidget(self.label)

        central_widget = QWidget()
        central_widget.setLayout(layout)
        self.setCentralWidget(central_widget)

        self.worker = Worker()

        # 创建按钮布局
        hbox_buttons = QHBoxLayout()
        layout.addLayout(hbox_buttons)

        # 添加模型选择按钮
        self.load_model_button = QPushButton("模型选择")
        self.load_model_button.clicked.connect(self.load_model)
        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)
        hbox_buttons.addWidget(self.image_detect_button)

        #添加视频检测按钮
        self.video_detect_button = QPushButton("视频检测")
        self.video_detect_button.clicked.connect(self.detect_video)
        self.video_detect_button.setEnabled(False)
        hbox_buttons.addWidget(self.video_detect_button)


        # 添加退出按钮
        self.exit_button = QPushButton("退出")
        self.exit_button.clicked.connect(self.exit_application)
        hbox_buttons.addWidget(self.exit_button)

        #定时器更新视频
        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_frame)


    def detect_image(self):
        image_path, _ = QFileDialog.getOpenFileName(None, "选择图片文件", "", "图片文件 (*.jpg *.jpeg *.png)")
        if image_path:
            results = self.worker.detect_image(image_path)
            if results:
                annotated_image = results[0].plot()
                height, width, channel = annotated_image.shape
                bytesPerLine = 3 * width
                qimage = QImage(annotated_image.data, width, height, bytesPerLine, QImage.Format_BGR888)
                pixmap = QPixmap.fromImage(qimage)
                self.label.setPixmap(pixmap.scaled(self.label.size(), Qt.KeepAspectRatio))
        else:
            QMessageBox.critical(self, "错误", "请选择图片文件")

    #选择视频文件
    def detect_video(self):
        video_path, _ = QFileDialog.getOpenFileName(None, "选择视频文件", "", "视频文件 (*.mp4 *.avi *.mov)")
        if video_path:
            if self.worker.detect_video(video_path):
                # 开始定时器逐帧处理视频
                self.timer.start(30)  # 每30ms更新一次 (大约每秒更新33帧)
            else:
                QMessageBox.critical(self, "错误", "无法打开视频文件")
        else:
            QMessageBox.critical(self, "错误", "请选择视频文件")

    #更新视频
    def update_frame(self):
        frame = self.worker.get_frame()
        if frame is not None:
            # 获取视频帧的宽高
            height, width, channel = frame.shape
            bytesPerLine = 3 * width
            qimage = QImage(frame.data, width, height, bytesPerLine, QImage.Format_BGR888)

            # 创建 QPixmap 并按固定尺寸显示
            pixmap = QPixmap.fromImage(qimage)

            # 按照 Qlabel 固定的尺寸显示,保持宽高比
            self.label.setPixmap(pixmap.scaled(self.label.size(), Qt.KeepAspectRatio))

        else:
            self.timer.stop()  # 停止定时器,视频播放完毕
            QMessageBox.information(self, "提示", "视频播放完毕")

    def load_model(self):
        if self.worker.load_model():
            self.image_detect_button.setEnabled(True)
            self.video_detect_button.setEnabled(True)

    def exit_application(self):
        # 终止程序运行
        sys.exit()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

如果这篇文章对你有所帮助,那就感谢同学的分享,转载,你们的分享是老师最大的动力

相关推荐
shangjian00714 小时前
AI-大语言模型LLM-Transformer架构4-多头注意力、掩码注意力、交叉注意力
人工智能·语言模型·transformer
努力犯错14 小时前
如何使用AI图片扩展器扩展图片边界:2026年完整指南
人工智能
晨非辰14 小时前
Linux权限管理速成:umask掩码/file透视/粘滞位防护15分钟精通,掌握权限减法与安全协作模型
linux·运维·服务器·c++·人工智能·后端
2501_9415079415 小时前
【YOLOv26】教育环境中危险物品实时检测系统_基于深度学习的校园安全解决方案
深度学习·安全·yolo
丝斯201115 小时前
AI学习笔记整理(63)——大模型对齐与强化学习
人工智能·笔记·学习
延凡科技19 小时前
无人机低空智能巡飞巡检平台:全域感知与智能决策的低空作业中枢
大数据·人工智能·科技·安全·无人机·能源
2501_9413297219 小时前
YOLOv8-SEAMHead改进实战:书籍检测与识别系统优化方案
人工智能·yolo·目标跟踪
晓翔仔20 小时前
【深度实战】Agentic AI 安全攻防指南:基于 CSA 红队测试手册的 12 类风险完整解析
人工智能·安全·ai·ai安全
百家方案20 小时前
2026年数据治理整体解决方案 - 全1066页下载
大数据·人工智能·数据治理
北京耐用通信21 小时前
工业自动化中耐达讯自动化Profibus光纤链路模块连接RFID读写器的应用
人工智能·科技·物联网·自动化·信息与通信