基于深度学习YOLOv8的工地运输车识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

基于YOLOv8的工地运输车识别检测系统
部署运行你感兴趣的模型镜像

一、项目介绍

摘要

本项目基于先进的YOLOv8深度学习算法,开发了一套高精度的工地运输车智能识别检测系统,专门用于识别和分类施工现场常见的三种运输车辆:挖掘机(EXCAVATORS)、自卸卡车(dump truck)和轮式装载机(wheel loader)。系统在包含2,244张训练图像、267张验证图像和144张测试图像的专用数据集上进行训练和优化,实现了在复杂工地环境下的高准确率目标检测。

该系统具备实时监测、车辆分类和数据分析等功能,可广泛应用于施工现场管理、工程进度监控、自动化调度和安全监管等领域。通过计算机视觉技术,本系统能够自动识别工地运输车辆的类型、位置和数量,为智慧工地建设提供关键技术支持。相比传统人工监管方式,本系统显著提高了工地车辆管理的效率和精确度,同时降低了人力成本和安全风险。

项目意义

1. 提升工地智能化管理水平

在现代工程建设中,运输车辆的高效管理直接影响工程进度和施工安全。本系统的应用可以:

  • 实时监控工地各类运输车辆的分布情况

  • 自动统计不同时段车辆出入数量

  • 识别异常车辆活动

  • 生成可视化数据分析报告

  • 优化车辆调度和资源配置

这种智能化管理方式将大幅提升工地运营效率,降低管理成本,推动传统建筑行业向数字化、智能化转型。

2. 加强施工现场安全管理

工地运输车辆是安全事故的高风险因素。本系统能够:

  • 检测危险区域违规停放车辆

  • 识别车辆超速行驶行为

  • 监控盲区作业安全距离

  • 预警潜在碰撞风险

  • 记录安全事故过程

通过24小时不间断监测,有效预防车辆相关事故,保障施工人员安全,降低企业安全风险。

3. 优化工程进度管理

运输车辆活动直接反映工程进度。本系统可以:

  • 通过车辆活动分析工程阶段进展

  • 自动记录各类车辆工作时长

  • 评估施工效率

  • 发现进度滞后问题

  • 为项目管理决策提供数据支持

这种数据驱动的进度管理方式,有助于提高工程管理精细化水平,确保项目按期完成。

4. 促进绿色施工和环保监管

运输车辆是工地主要污染源之一。本系统能够:

  • 监控高排放车辆使用情况

  • 统计车辆运行时间

  • 评估环保措施执行效果

  • 为绿色施工认证提供数据

  • 支持环保合规性检查

这有助于减少工地环境污染,推动建筑业可持续发展。

5. 为智慧工地建设提供关键技术

本系统是智慧工地解决方案的重要组成部分,可以:

  • 与BIM系统集成实现数字孪生

  • 结合物联网设备实现全面监控

  • 为自动驾驶工程机械提供环境感知

  • 支持远程工地管理

  • 积累施工大数据

这些功能将加速建筑行业数字化转型,提升整体竞争力。

6. 计算机视觉技术在工程领域的创新应用

本项目针对工地环境的特殊需求进行了多项技术创新:

  • 解决了复杂光照条件下的检测难题

  • 优化了相似车型的区分能力

  • 提升了小目标车辆的识别准确率

  • 开发了适应扬尘、震动等干扰的鲁棒算法

  • 实现了多角度车辆的精准识别

这些技术创新为计算机视觉在工程建设领域的应用提供了重要参考。

应用前景

本系统具有广阔的应用前景,可扩展至:

  • 大型基建项目智能监控

  • 矿山开采车辆管理

  • 港口物流机械调度

  • 市政工程进度监管

  • 工程机械自动化作业

随着建筑行业数字化转型加速,工地运输车识别检测系统将成为智慧工地建设的重要技术支撑,具有显著的经济效益和社会价值。

总结

YOLOv8工地运输车识别检测系统的研发和应用,代表了人工智能技术在工程建设领域的重要突破。该系统不仅能够提升工地管理效率和安全性,还能为工程数字化、智能化提供关键技术支撑。未来,随着技术的持续优化和应用场景的拓展,该系统将在智慧工地建设中发挥更加重要的作用,推动建筑行业高质量发展。

目录

一、项目介绍

摘要

项目意义

二、项目功能展示

系统功能

图片检测

视频检测

摄像头实时检测

三、数据集介绍

数据集概述

数据集特点

数据集配置文件

数据集制作流程

四、项目环境配置

创建虚拟环境

pycharm中配置anaconda

安装所需要库

五、模型训练

训练代码

训练结果

六、核心代码​

七、项目源码(视频简介内)


基于深度学习YOLOv8的工地运输车识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv8的工地运输车识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

二、项目功能展示

系统功能

图片检测:可对图片进行检测,返回检测框及类别信息。

视频检测:支持视频文件输入,检测视频中每一帧的情况。

摄像头实时检测:连接USB 摄像头,实现实时监测。

参数实时调节(置信度和IoU阈值)

  • 图片检测

        该功能允许用户通过单张图片进行目标检测。输入一张图片后,YOLO模型会实时分析图像,识别出其中的目标,并在图像中框出检测到的目标,输出带有目标框的图像。批量图片检测

        用户可以一次性上传多个图片进行批量处理。该功能支持对多个图像文件进行并行处理,并返回每张图像的目标检测结果,适用于需要大规模处理图像数据的应用场景。

  • 视频检测

        视频检测功能允许用户将视频文件作为输入。YOLO模型将逐帧分析视频,并在每一帧中标记出检测到的目标。最终结果可以是带有目标框的视频文件或实时展示,适用于视频监控和分析等场景。

  • 摄像头实时检测

        该功能支持通过连接摄像头进行实时目标检测。YOLO模型能够在摄像头拍摄的实时视频流中进行目标检测,实时识别并显示检测结果。此功能非常适用于安防监控、无人驾驶、智能交通等应用,提供即时反馈。

核心特点:

  • 高精度:基于YOLO模型,提供精确的目标检测能力,适用于不同类型的图像和视频。
  • 实时性:特别优化的算法使得实时目标检测成为可能,无论是在视频还是摄像头实时检测中,响应速度都非常快。
  • 批量处理:支持高效的批量图像和视频处理,适合大规模数据分析。

三、数据集介绍

数据集概述

本项目的核心数据集是专门针对工地运输车辆构建的专业图像数据集,共包含2,655张高质量标注图像,按照约8:1:1的比例划分为训练集(2,244张)、验证集(267张)和测试集(144张)。数据集覆盖了三种典型工地运输车辆:挖掘机、自卸车和轮式装载机,所有图像均由建筑行业专业人员参与标注,确保类别判断的准确性和专业性。

数据集特点

  1. 目标多样性

    • 包含三种差异明显的工程车辆类型

    • 覆盖不同品牌、型号和尺寸的各类车辆

    • 车辆处于各种工作状态(运行、静止、装卸等)

    • 多种车辆颜色和外观装饰变化

  2. 场景复杂性

    • 不同施工阶段的工地场景(土方工程、结构施工等)

    • 各种天气条件(晴天、阴天、雨天、雾天)

    • 不同时段采集数据(清晨、正午、黄昏、夜间)

    • 多种拍摄角度和距离(地面视角、监控俯瞰等)

  3. 挑战性因素

    • 车辆部分遮挡(被建筑物料、其他设备遮挡)

    • 密集车辆场景下的重叠和交叉

    • 强光影干扰(金属反光、阴影区域)

    • 运动模糊(移动中车辆的图像捕捉)

  4. 标注专业性

    • 由具有建筑行业知识的人员参与标注,确保车辆类型判断准确

    • 采用紧密贴合车辆轮廓的精确边界框

    • 特别标注了车辆的工作状态属性(可选)

    • 对困难样本(模糊、小目标等)进行特殊标记

  5. 数据分布

    • 三类车辆样本数量均衡

    • 覆盖各种典型施工场景

    • 包含正常工作和异常情况的样本

    • 训练集与测试集场景分布一致

数据集配置文件

项目采用YOLO格式的数据集:

train: F:\工地运输车识别检测数据集\train\images
val: F:\工地运输车识别检测数据集\valid\images
test: F:\工地运输车识别检测数据集\test\images

nc: 3
names: ['EXCAVATORS', 'dump truck', 'wheel loader']

数据集制作流程

  1. 数据采集阶段

    • 实地采集:在多个大型建筑工地使用高清摄像机进行多角度拍摄

    • 监控视频提取:从工地安防系统获取监控视频并提取关键帧

    • 无人机航拍:获取工地全景中的车辆分布图像

    • 公开数据补充:筛选合适的网络图像资源(确保版权合规)

  2. 数据预处理

    • 图像去重:去除高度相似图像

    • 分辨率调整:统一缩放,保持原始宽高比

    • 格式统一:转换为JPG格式

    • 曝光校正:对过暗/过亮图像进行自适应直方图均衡化

  3. 数据集划分方法

    • 按工地项目分层抽样,确保不同工地数据均匀分布

    • 同一工地的连续视频帧不会跨训练/验证/测试集

    • 保留最具挑战性的样本作为测试集

    • 验证集包含所有典型场景的代表性样本

  4. 质量控制体系

    • 建立标注质量KPI

    • 开发自动化校验工具检查标注格式一致性

    • 定期抽样人工复检,维持标注质量

    • 版本化管理,记录每次数据集更新的变更内容

  5. 持续优化机制

    • 收集模型预测错误的样本进行针对性补充

    • 定期纳入新型工程车辆数据

    • 根据实际应用反馈扩展特殊场景样本

    • 建立数据质量-模型性能闭环优化流程

  

四、项目环境配置

创建虚拟环境

首先新建一个Anaconda环境,每个项目用不同的环境,这样项目中所用的依赖包互不干扰。

终端输入

conda create -n yolov8 python==3.9

激活虚拟环境

conda activate yolov8
 

安装cpu版本pytorch

pip install torch torchvision torchaudio

pycharm中配置anaconda

安装所需要库

pip install -r requirements.txt

五、模型训练

训练代码

from ultralytics import YOLO

model_path = 'yolov8s.pt'
data_path = 'datasets/data.yaml'

if __name__ == '__main__':
    model = YOLO(model_path)
    results = model.train(data=data_path,
                          epochs=500,
                          batch=64,
                          device='0',
                          workers=0,
                          project='runs/detect',
                          name='exp',
                          )
根据实际情况更换模型
yolov8n.yaml (nano):轻量化模型,适合嵌入式设备,速度快但精度略低。
yolov8s.yaml (small):小模型,适合实时任务。
yolov8m.yaml (medium):中等大小模型,兼顾速度和精度。
yolov8b.yaml (base):基本版模型,适合大部分应用场景。
yolov8l.yaml (large):大型模型,适合对精度要求高的任务。
  • --batch 64:每批次64张图像。
  • --epochs 500:训练500轮。
  • --datasets/data.yaml:数据集配置文件。
  • --weights yolov8s.pt:初始化模型权重,yolov8s.pt 是预训练的轻量级YOLO模型。

训练结果

六、核心代码

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QImage, QPixmap, QIcon
from PyQt5.QtWidgets import (QFileDialog, QMessageBox, QTableWidgetItem,
                             QStyledItemDelegate, QHeaderView)
import cv2
import numpy as np
from ultralytics import YOLO
import os
import datetime
import sys


class CenteredDelegate(QStyledItemDelegate):
    def initStyleOption(self, option, index):
        super().initStyleOption(option, index)
        option.displayAlignment = Qt.AlignCenter


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1400, 900)
        MainWindow.setWindowTitle("YOLOv8 目标检测系统")

        # 设置窗口图标
        if hasattr(sys, '_MEIPASS'):
            icon_path = os.path.join(sys._MEIPASS, 'icon.ico')
        else:
            icon_path = 'icon.ico'
        if os.path.exists(icon_path):
            MainWindow.setWindowIcon(QIcon(icon_path))

        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        # 主布局
        self.main_layout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.main_layout.setContentsMargins(10, 10, 10, 10)
        self.main_layout.setSpacing(15)

        # 左侧布局 (图像显示)
        self.left_layout = QtWidgets.QVBoxLayout()
        self.left_layout.setSpacing(15)

        # 原始图像组
        self.original_group = QtWidgets.QGroupBox("原始图像")
        self.original_group.setMinimumHeight(400)
        self.original_img_label = QtWidgets.QLabel()
        self.original_img_label.setAlignment(QtCore.Qt.AlignCenter)
        self.original_img_label.setText("等待加载图像...")
        self.original_img_label.setStyleSheet("background-color: #F0F0F0; border: 1px solid #CCCCCC;")

        original_layout = QtWidgets.QVBoxLayout()
        original_layout.addWidget(self.original_img_label)
        self.original_group.setLayout(original_layout)
        self.left_layout.addWidget(self.original_group)

        # 检测结果图像组
        self.result_group = QtWidgets.QGroupBox("检测结果")
        self.result_group.setMinimumHeight(400)
        self.result_img_label = QtWidgets.QLabel()
        self.result_img_label.setAlignment(QtCore.Qt.AlignCenter)
        self.result_img_label.setText("检测结果将显示在这里")
        self.result_img_label.setStyleSheet("background-color: #F0F0F0; border: 1px solid #CCCCCC;")

        result_layout = QtWidgets.QVBoxLayout()
        result_layout.addWidget(self.result_img_label)
        self.result_group.setLayout(result_layout)
        self.left_layout.addWidget(self.result_group)

        self.main_layout.addLayout(self.left_layout, stretch=3)

        # 右侧布局 (控制面板)
        self.right_layout = QtWidgets.QVBoxLayout()
        self.right_layout.setSpacing(15)

        # 模型选择组
        self.model_group = QtWidgets.QGroupBox("模型设置")
        self.model_group.setStyleSheet("QGroupBox { font-weight: bold; }")
        self.model_layout = QtWidgets.QVBoxLayout()

        # 模型选择
        self.model_combo = QtWidgets.QComboBox()
        self.model_combo.addItems(["best.pt"])
        self.model_combo.setCurrentIndex(0)

        # 加载模型按钮
        self.load_model_btn = QtWidgets.QPushButton(" 加载模型")
        self.load_model_btn.setIcon(QIcon.fromTheme("document-open"))
        self.load_model_btn.setStyleSheet(
            "QPushButton { padding: 8px; background-color: #4CAF50; color: white; border-radius: 4px; }"
            "QPushButton:hover { background-color: #45a049; }"
        )

        self.model_layout.addWidget(self.model_combo)
        self.model_layout.addWidget(self.load_model_btn)
        self.model_group.setLayout(self.model_layout)
        self.right_layout.addWidget(self.model_group)

        # 参数设置组
        self.param_group = QtWidgets.QGroupBox("检测参数")
        self.param_group.setStyleSheet("QGroupBox { font-weight: bold; }")
        self.param_layout = QtWidgets.QFormLayout()
        self.param_layout.setLabelAlignment(Qt.AlignLeft)
        self.param_layout.setFormAlignment(Qt.AlignLeft)
        self.param_layout.setVerticalSpacing(15)

        # 置信度滑块
        self.conf_slider = QtWidgets.QSlider(Qt.Horizontal)
        self.conf_slider.setRange(1, 99)
        self.conf_slider.setValue(25)
        self.conf_value = QtWidgets.QLabel("0.25")
        self.conf_value.setAlignment(Qt.AlignCenter)
        self.conf_value.setStyleSheet("font-weight: bold; color: #2196F3;")

        # IoU滑块
        self.iou_slider = QtWidgets.QSlider(Qt.Horizontal)
        self.iou_slider.setRange(1, 99)
        self.iou_slider.setValue(45)
        self.iou_value = QtWidgets.QLabel("0.45")
        self.iou_value.setAlignment(Qt.AlignCenter)
        self.iou_value.setStyleSheet("font-weight: bold; color: #2196F3;")

        self.param_layout.addRow("置信度阈值:", self.conf_slider)
        self.param_layout.addRow("当前值:", self.conf_value)
        self.param_layout.addRow(QtWidgets.QLabel(""))  # 空行
        self.param_layout.addRow("IoU阈值:", self.iou_slider)
        self.param_layout.addRow("当前值:", self.iou_value)

        self.param_group.setLayout(self.param_layout)
        self.right_layout.addWidget(self.param_group)

        # 功能按钮组
        self.func_group = QtWidgets.QGroupBox("检测功能")
        self.func_group.setStyleSheet("QGroupBox { font-weight: bold; }")
        self.func_layout = QtWidgets.QVBoxLayout()
        self.func_layout.setSpacing(10)

        # 图片检测按钮
        self.image_btn = QtWidgets.QPushButton(" 图片检测")
        self.image_btn.setIcon(QIcon.fromTheme("image-x-generic"))

        # 视频检测按钮
        self.video_btn = QtWidgets.QPushButton(" 视频检测")
        self.video_btn.setIcon(QIcon.fromTheme("video-x-generic"))

        # 摄像头检测按钮
        self.camera_btn = QtWidgets.QPushButton(" 摄像头检测")
        self.camera_btn.setIcon(QIcon.fromTheme("camera-web"))

        # 停止检测按钮
        self.stop_btn = QtWidgets.QPushButton(" 停止检测")
        self.stop_btn.setIcon(QIcon.fromTheme("process-stop"))
        self.stop_btn.setEnabled(False)

        # 保存结果按钮
        self.save_btn = QtWidgets.QPushButton(" 保存结果")
        self.save_btn.setIcon(QIcon.fromTheme("document-save"))
        self.save_btn.setEnabled(False)

        # 设置按钮样式
        button_style = """
        QPushButton {
            padding: 10px;
            background-color: #2196F3;
            color: white;
            border: none;
            border-radius: 4px;
            text-align: left;
        }
        QPushButton:hover {
            background-color: #0b7dda;
        }
        QPushButton:disabled {
            background-color: #cccccc;
        }
        """

        for btn in [self.image_btn, self.video_btn, self.camera_btn,
                    self.stop_btn, self.save_btn]:
            btn.setStyleSheet(button_style)
            self.func_layout.addWidget(btn)

        self.func_group.setLayout(self.func_layout)
        self.right_layout.addWidget(self.func_group)

        # 检测结果表格组
        self.table_group = QtWidgets.QGroupBox("检测结果详情")
        self.table_group.setStyleSheet("QGroupBox { font-weight: bold; }")
        self.table_layout = QtWidgets.QVBoxLayout()

        self.result_table = QtWidgets.QTableWidget()
        self.result_table.setColumnCount(4)
        self.result_table.setHorizontalHeaderLabels(["类别", "置信度", "左上坐标", "右下坐标"])
        self.result_table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.result_table.verticalHeader().setVisible(False)
        self.result_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
        self.result_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

        # 设置表格样式
        self.result_table.setStyleSheet("""
            QTableWidget {
                border: 1px solid #e0e0e0;
                alternate-background-color: #f5f5f5;
            }
            QHeaderView::section {
                background-color: #2196F3;
                color: white;
                padding: 5px;
                border: none;
            }
            QTableWidget::item {
                padding: 5px;
            }
        """)

        # 设置居中代理
        delegate = CenteredDelegate(self.result_table)
        self.result_table.setItemDelegate(delegate)

        self.table_layout.addWidget(self.result_table)
        self.table_group.setLayout(self.table_layout)
        self.right_layout.addWidget(self.table_group, stretch=1)

        self.main_layout.addLayout(self.right_layout, stretch=1)

        MainWindow.setCentralWidget(self.centralwidget)

        # 状态栏
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setStyleSheet("QStatusBar { border-top: 1px solid #c0c0c0; }")
        MainWindow.setStatusBar(self.statusbar)

        # 初始化变量
        self.model = None
        self.cap = None
        self.timer = QTimer()
        self.is_camera_running = False
        self.current_image = None
        self.current_result = None
        self.video_writer = None
        self.output_path = "output"

        # 创建输出目录
        if not os.path.exists(self.output_path):
            os.makedirs(self.output_path)

        # 连接信号槽
        self.load_model_btn.clicked.connect(self.load_model)
        self.image_btn.clicked.connect(self.detect_image)
        self.video_btn.clicked.connect(self.detect_video)
        self.camera_btn.clicked.connect(self.detect_camera)
        self.stop_btn.clicked.connect(self.stop_detection)
        self.save_btn.clicked.connect(self.save_result)
        self.conf_slider.valueChanged.connect(self.update_conf_value)
        self.iou_slider.valueChanged.connect(self.update_iou_value)
        self.timer.timeout.connect(self.update_camera_frame)

        # 设置全局样式
        self.set_style()

    def set_style(self):
        style = """
        QMainWindow {
            background-color: #f5f5f5;
        }
        QGroupBox {
            border: 1px solid #e0e0e0;
            border-radius: 5px;
            margin-top: 10px;
            padding-top: 15px;
        }
        QGroupBox::title {
            subcontrol-origin: margin;
            left: 10px;
            padding: 0 3px;
        }
        QLabel {
            color: #333333;
        }
        QComboBox {
            padding: 5px;
            border: 1px solid #cccccc;
            border-radius: 3px;
        }
        QSlider::groove:horizontal {
            height: 6px;
            background: #e0e0e0;
            border-radius: 3px;
        }
        QSlider::handle:horizontal {
            width: 16px;
            height: 16px;
            margin: -5px 0;
            background: #2196F3;
            border-radius: 8px;
        }
        QSlider::sub-page:horizontal {
            background: #2196F3;
            border-radius: 3px;
        }
        """
        self.centralwidget.setStyleSheet(style)

    def load_model(self):
        model_name = self.model_combo.currentText().split(" ")[0]
        try:
            self.model = YOLO(model_name)
            self.statusbar.showMessage(f"模型 {model_name} 加载成功", 3000)
            self.image_btn.setEnabled(True)
            self.video_btn.setEnabled(True)
            self.camera_btn.setEnabled(True)
        except Exception as e:
            QMessageBox.critical(None, "错误", f"模型加载失败: {str(e)}")

    def update_conf_value(self):
        conf = self.conf_slider.value() / 100
        self.conf_value.setText(f"{conf:.2f}")

    def update_iou_value(self):
        iou = self.iou_slider.value() / 100
        self.iou_value.setText(f"{iou:.2f}")

    def detect_image(self):
        if self.model is None:
            QMessageBox.warning(None, "警告", "请先加载模型")
            return

        file_path, _ = QFileDialog.getOpenFileName(
            None, "选择图片", "",
            "图片文件 (*.jpg *.jpeg *.png *.bmp);;所有文件 (*)"
        )
        if file_path:
            try:
                # 读取图片
                img = cv2.imread(file_path)
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

                # 显示原始图片
                self.display_image(img, self.original_img_label)
                self.current_image = img.copy()

                # 检测图片
                conf = self.conf_slider.value() / 100
                iou = self.iou_slider.value() / 100

                self.statusbar.showMessage("正在检测图片...")
                QtWidgets.QApplication.processEvents()  # 更新UI

                results = self.model.predict(img, conf=conf, iou=iou)
                result_img = results[0].plot()

                # 显示检测结果
                self.display_image(result_img, self.result_img_label)
                self.current_result = result_img.copy()

                # 更新结果表格
                self.update_result_table(results[0])

                self.save_btn.setEnabled(True)
                self.statusbar.showMessage(f"图片检测完成: {os.path.basename(file_path)}", 3000)

            except Exception as e:
                QMessageBox.critical(None, "错误", f"图片检测失败: {str(e)}")
                self.statusbar.showMessage("图片检测失败", 3000)

    def detect_video(self):
        if self.model is None:
            QMessageBox.warning(None, "警告", "请先加载模型")
            return

        file_path, _ = QFileDialog.getOpenFileName(
            None, "选择视频", "",
            "视频文件 (*.mp4 *.avi *.mov *.mkv);;所有文件 (*)"
        )
        if file_path:
            try:
                self.cap = cv2.VideoCapture(file_path)
                if not self.cap.isOpened():
                    raise Exception("无法打开视频文件")

                # 获取视频信息
                fps = self.cap.get(cv2.CAP_PROP_FPS)
                width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
                height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

                # 创建视频写入器
                timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
                output_file = os.path.join(self.output_path, f"output_{timestamp}.mp4")
                fourcc = cv2.VideoWriter_fourcc(*'mp4v')
                self.video_writer = cv2.VideoWriter(output_file, fourcc, fps, (width, height))

                # 启用停止按钮,禁用其他按钮
                self.stop_btn.setEnabled(True)
                self.save_btn.setEnabled(True)
                self.image_btn.setEnabled(False)
                self.video_btn.setEnabled(False)
                self.camera_btn.setEnabled(False)

                # 开始处理视频
                self.timer.start(30)  # 30ms间隔
                self.statusbar.showMessage(f"正在处理视频: {os.path.basename(file_path)}...")

            except Exception as e:
                QMessageBox.critical(None, "错误", f"视频检测失败: {str(e)}")
                self.statusbar.showMessage("视频检测失败", 3000)

七、项目源码(视频简介内)

        完整全部资源文件(包括测试图片,py文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

演示与介绍视频:

基于深度学习YOLOv8的工地运输车识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)_哔哩哔哩_bilibili

基于深度学习YOLOv8的工地运输车识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)

您可能感兴趣的与本文相关的镜像

Yolo-v5

Yolo-v5

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值