python3GUI--基于YOLOv8深度学习的车牌识别系统(详细图文介绍)

文章目录


本系统支持黄牌、蓝牌、绿牌、黑牌、白牌,支持双层车牌识别,且识别准确度95%+,支持多种操作类型以及个性化自定义回显样式,项目上手简单,欢迎了解!

一.前言

本系统是一款基于 PyQt5 图形界面与 YOLOv8 深度学习模型 的智能车牌识别系统,集成了目标检测与字符识别于一体,具有良好的实时性与易用性。系统采用 YOLOv8 作为核心检测算法,对车辆及车牌区域进行高精度定位,并结合训练优化后的车牌识别模型,实现对车牌字符的准确解析。

在功能方面,系统全面支持 黄牌、蓝牌、绿牌、黑牌、白牌 等多种常见车牌类型,能够适应不同颜色、字体及复杂背景环境。同时,针对实际交通场景中常见的 双层车牌,系统通过结构特征分析与字符分区策略,有效提升了双层车牌的识别准确率。

在交互层面,系统基于 PyQt5 构建可视化操作界面,支持图片识别、视频流识别及摄像头实时识别,识别结果可实时显示并保存,操作直观、响应迅速。整体系统具有良好的扩展性与工程实用价值,适用于智慧停车、交通管理、小区安防等多种应用场景。

二.核心技术&知识

在这章我将要介绍本系统的核心技术。

1.PyQt5

PyQt5 是一套用于创建跨平台桌面应用程序的 Python GUI 工具包,它是 Qt 应用框架的 Python 绑定。通过 PyQt5,开发者可以使用 Python 编写具有现代图形界面的应用程序,支持丰富的控件、信号与槽机制、窗口管理、事件处理等功能。它兼容主流操作系统(如 Windows、macOS 和 Linux),适用于开发各种规模的桌面软件,常与 Qt Designer 配合使用以加快开发效率。

2.YOLOv8

YOLOv8 是 Ultralytics 在 YOLO 系列基础上推出的新一代目标检测与视觉任务框架,代表了当前实时计算机视觉模型的先进水平。它在继承 YOLO 系列"端到端、单阶段、高速度"优势的同时,对网络结构、训练流程和工程化设计进行了全面优化。YOLOv8 采用全新的解耦头结构,将分类与回归任务分离,使模型在收敛速度和检测精度上都有明显提升。同时引入更灵活的 C2f 模块,在保证性能的前提下减少参数量,提高推理效率。

在功能上,YOLOv8 不仅支持目标检测,还统一支持实例分割、图像分类和姿态估计等多种任务,极大降低了多任务开发的门槛。其训练与推理流程高度自动化,提供简洁的 API 和命令行工具,方便快速部署到服务器、边缘设备或嵌入式平台。此外,YOLOv8 默认采用无锚框(Anchor-Free)机制,减少了对超参数的依赖,使模型在不同数据集上的泛化能力更强。凭借高精度、易用性和良好的工程实践,YOLOv8 已成为工业和科研中广泛应用的视觉解决方案。

3.多线程

QThread 是 PyQt5 中用于实现多线程的重要类,主要用于将耗时任务从主线程(GUI 线程)中分离出来,以避免界面卡顿或无响应。在 PyQt5 中,所有界面组件都必须运行在主线程中,如果在主线程中直接执行耗时操作,如文件读写、网络请求或复杂计算,就会阻塞事件循环,影响用户体验。QThread 的作用正是为了解决这一问题。

通过继承 QThread 并重写 run() 方法,开发者可以将需要后台执行的逻辑放入子线程中运行。线程启动后,run() 会在新的线程环境中执行,而不会影响主线程的界面刷新。QThread 通常会结合信号与槽机制使用,子线程在执行过程中可以通过自定义信号向主线程发送数据或状态更新,主线程再通过槽函数安全地更新界面,从而避免直接跨线程操作 UI 所带来的风险。

在实际开发中,更推荐使用"QObject + QThread"的方式,即将业务对象移动到线程中执行,而不是直接继承 QThread,这种方式结构更清晰、可维护性更高。合理使用 QThread 能显著提升 PyQt5 应用的性能和交互体验,是构建复杂桌面程序的关键技术之一。

4.sqlite3

本次数据均存储在sqlite数据库中,数据库里包含用户注册信息。

SQLite3 是一种轻量级的嵌入式关系型数据库管理系统,被广泛应用于桌面软件、移动应用和嵌入式设备中。与传统的客户端---服务器数据库不同,SQLite3 不需要独立的数据库服务进程,其数据库以单个文件的形式直接存储在本地磁盘中,应用程序通过库函数直接读写数据。这种设计使 SQLite3 具有零配置、易部署和占用资源极少的特点,非常适合对体积和性能敏感的场景。

在功能方面,SQLite3 完整支持 SQL-92 标准的大部分特性,包括表、索引、视图、触发器和事务等机制,能够满足大多数中小规模数据存储需求。它采用 ACID 事务模型,通过日志机制保证数据的一致性和可靠性,即使在系统异常断电的情况下也能有效防止数据损坏。SQLite3 还支持多线程和多进程访问,采用读写锁机制实现并发控制,虽然同一时间只允许一个写操作,但在读取密集型场景下依然具有良好性能。

从开发角度来看,SQLite3 提供了简洁稳定的 C 接口,并被众多语言如 Python、C++、Java 等原生或通过绑定方式支持,极大降低了使用门槛。由于其开源、跨平台和高度可靠的特性,SQLite3 已成为本地数据存储领域中不可或缺的基础组件,在实际工程中具有极高的实用价值。

5.主流车牌识别方案

主流车牌识别(LPR,License Plate Recognition)方案通常由车牌检测、字符分割/识别、结果校验等环节组成,随着深度学习的发展,整体技术路线已从传统图像处理逐步演进为端到端的智能识别体系。

传统方案早期主要依赖 OpenCV 等图像处理方法,通过颜色特征、边缘检测、形态学操作定位车牌区域,再进行字符分割和模板匹配或 SVM、KNN 等分类器识别字符。这类方案实现简单、对硬件要求低,但对光照变化、复杂背景、遮挡和倾斜场景适应性较差,鲁棒性有限,目前已较少在复杂场景中使用。

深度学习两阶段方案是目前较为成熟的工业方案之一。第一阶段使用目标检测模型(如 YOLO、SSD、Faster R-CNN)定位车牌位置;第二阶段对裁剪后的车牌区域进行字符识别,常见方法包括 CNN+LSTM+CTC 或 CRNN 网络。这种方案结构清晰、可控性强,便于单独优化检测与识别模块,广泛应用于停车场、高速收费和城市监控系统。

端到端识别方案近年来逐渐成为主流趋势,直接将整车图像输入模型,输出完整车牌号码。常见模型结合检测与序列识别,如 YOLO + OCR Head,或基于 Transformer 的序列建模方法。该方案减少中间步骤,对复杂场景适应性更强,在实时性和准确率之间取得较好平衡。

此外,多模态与工程优化方案也被广泛采用,如结合视频时序信息、多帧投票、规则校验以及边缘设备推理优化。综合来看,深度学习驱动的端到端或两阶段方案已成为当前车牌识别的主流选择。

1.本系统车牌识别方案

该车牌识别系统的核心设计围绕"高精度检测 + 稳定识别 + 工程级可视化"三条主线展开,整体采用深度学习驱动的端到端流水线架构。在检测阶段,系统基于 YOLOv8 模型完成车牌区域的快速定位,通过 letterbox 前处理、自定义 NMS 和坐标还原机制,确保在不同分辨率、复杂背景和多车场景下依然具备良好的实时性与定位准确率。同时模型区分单层与双层车牌,为后续识别策略提供可靠依据。

在识别阶段,系统采用定制化的 CNN 序列识别网络 myNet_ocr_color,融合字符识别与车牌颜色分类两项任务。通过特征卷积、时序展开以及 CTC 风格的解码策略,有效解决车牌字符长度不固定的问题,并结合 softmax 概率与重复字符抑制机制,提高识别稳定性。针对双层车牌,系统引入上下结构重排策略,将图像重组为单行形式,显著提升复杂车牌的识别准确率。此外,统一的字符集设计覆盖新能源、警用、使领馆等多种车牌类型,增强了系统的通用性。

在工程层面,系统对前处理、后处理、模型推理进行了模块化封装,支持 GPU / CPU 自适应运行,具备良好的部署灵活性。同时结果输出不仅包含车牌号码,还融合了颜色、置信度、车牌类型和精确位置等信息,便于业务系统集成。在可视化方面,系统提供高度可配置的绘制模块,支持多种边框样式、透明文本背景、颜色映射与中文渲染,既满足调试需求,也适合直接用于实际应用展示。整体而言,该系统在算法精度、鲁棒性和工程可用性之间取得了良好平衡,具备较强的实用价值。

三.核心功能展示

我们的系统包含两个界面,分别是登录注册界面以及主界面,所有核心功能都在主界面展示。

1.登录注册

本系统基于 PyQt5 框架开发,采用登录与注册相结合的使用模式,用户需先完成账号注册并成功登录后,方可进入系统并使用其正式功能。首次启动软件时,系统会引导用户填写匹配的账号与密码信息,点击"登录"按钮后完成身份校验,只有通过验证的用户才能正常访问系统的各项核心功能,从而有效保障系统的使用安全性与规范性。

在界面设计上,我们对登录注册界面进行了精心美化与布局优化。整体界面采用左右分区结构,左侧展示以"车"为主题的高清图片,直观突出系统围绕车辆相关业务展开的设计理念;右侧则为主要的功能操作区域,集成了登录、注册及窗口控制等核心交互元素。用户可在右上角进行最小化或关闭操作,并可通过点击蓝色的按钮文字,在登录页面与注册页面之间自由切换,操作直观且流畅。

在输入安全方面,系统制定了严格的输入策略:账号长度限制为最多 10 位,密码长度限制为最多 16 位;在密码输入过程中,系统会自动将字符显示为圆形黑点,有效防止密码泄露。同时,每个输入框均配备了"清空"按钮,用户在输入内容后可一键清除当前输入,提高了操作的便捷性与友好性。

为了提升用户体验,我们还细致设计了多种鼠标交互效果。当鼠标移入输入框时,输入框会呈现明显的 hover 状态变化;当鼠标移入按钮区域时,按钮背景颜色会发生细微变化,增强界面的反馈感知。当用户点击最小化按钮时,窗口将收起至任务栏;点击关闭按钮时,系统会弹出二次确认提示,只有在用户确认退出后,程序才会正式关闭,完整结束软件生命周期。

在注册流程中,用户需填写账号和密码,并通过二次密码确认后才能完成注册操作。若两次密码不一致或信息未填写完整,系统会给予明确提示,指导用户正确操作。注册成功后,用户即可切换至登录界面进行登录。整个登录注册界面底部统一展示 "Copyright © 2025 All rights reserved.",体现了系统的专业性与完整性。

下图为登录操作流程图,展示了登录界面的逻辑流转

2.图像识别

图像识别模块是系统实现车牌检测与识别的核心功能之一,当用户在左侧区域选择并确定好输入内容后,系统会根据所指定的图像、视频或视频流源自动执行识别操作。在图像识别过程中,系统首先调用 YOLOv8 模型对输入内容中的车牌位置进行快速精准的检测,同时结合自行训练的车牌号及车牌颜色识别模型提取关键信息,实现车牌号码、颜色及单双层类型的识别。识别过程中,系统会根据用户在样式配置模块中设置的参数,将车牌标注框、文字、阴影效果及颜色信息实时绘制到图像上,使识别结果直观呈现。同时,识别结果不仅在图像中可视化显示,还会同步更新到结果表格及详细信息模块中,包括车牌号、颜色、置信度、车牌类型、位置信息及车牌高度等数据,实现图像结果与数据结果的联动展示。整个识别流程高效、自动化,用户只需选择输入内容并确认设置,即可得到完整、可视化且结构化的识别结果,为后续分析、导出或进一步处理提供了可靠依据。

3.视频&摄像头识别

视频与摄像头识别模块是系统面向动态内容的核心功能,支持视频文件、本地摄像头以及网络视频流(RTMP、RTSP)等多种输入方式。用户只需在左侧区域选择对应的数据源,并点击"开始识别"按钮,系统便会自动读取输入内容,实时执行车牌检测与识别操作。与图像识别相同,系统首先使用 YOLOv8 模型对视频帧中的车牌位置进行快速检测,同时结合自行训练的车牌号与车牌颜色识别模型提取车牌信息,实现车牌号码、颜色及单双层类型的动态识别。在识别过程中,系统会将实时检测结果以标注框、文字、阴影及颜色效果绘制到每一帧图像上,同时同步更新检测结果表格和车牌详细信息模块,使用户能够直观查看每一帧的识别情况。针对多车牌场景,系统支持组合框切换,实时聚焦特定车牌信息,并记录帧率、检测耗时及置信度,确保性能和准确性可控。整个流程高效稳定,实现了从视频或摄像头流数据的自动读取、实时识别到结果可视化展示的闭环,为动态环境下的车牌识别提供了可靠、直观且便捷的操作体验。

下图为"摄像头内容识别"演示效果!

四.系统界面模块介绍

完成登录的用户就可以使用本系统的正式功能了,我们的系统包含多个灵活功能模块,采用分组框(QGroupBox)进行分组,界面功能模块划分清楚、一目了然,我们的主界面分成三个区域,分别是左侧内容输入控制区、中间结果展示区、右侧详细结果日志输出区域。

1.左侧输入区

整个左侧区域采用整体垂直布局,由四个功能子模块组成,分别是检测内容子模块、模型配置子模块、检测结果样式配置子模块以及系统操作模块。各子模块功能相互配合,形成完整的操作流程:用户可在检测内容模块中选择输入数据源并设置相关参数,在模型配置模块中指定检测与识别模型路径并调整置信度与 IoU 阈值,在检测结果样式模块中自定义标注框、文字、阴影及颜色等显示效果,最后通过系统操作模块执行识别、清空或导出结果,以及查看系统信息或退出系统。整体布局简洁直观,各模块协同工作,实现了从输入设置、模型选择到结果展示和操作控制的完整功能闭环。

1.检测内容模块

检测内容模块采用表单布局进行设计,将各类输入选项与参数设置进行统一管理,使界面结构更加规整直观,便于用户快速理解和操作。该模块支持四种数据源输入方式,能够满足不同应用场景下的车牌检测需求,包括图像数据源、视频数据源、网络视频流数据源以及摄像头实时内容检测。在使用过程中,用户可以通过点击"浏览"按钮,手动选择本地存储的图像或视频文件作为检测输入,操作简单直观;对于网络场景,系统允许用户直接输入视频流地址,支持 RTMP、RTSP 等主流协议,从而实现远程视频流的车牌识别;此外,模块还提供摄像头索引选择功能,用户可根据实际设备情况选择对应的摄像头,实现对本地或外接摄像头采集画面的实时检测。通过表单化的布局设计与多数据源接入方式的结合,该模块在保证功能完整性的同时,提高了系统的灵活性、可扩展性以及整体使用体验。

2.模型配置模块

在该检测内容区域中,系统进一步提供了模型配置与参数调节功能,增强了整体的灵活性与可控性。用户可以在此区域分别配置目标检测模型与车牌识别模型的本地路径,并通过点击"更换模型"按钮,在本地文件系统中自由选择所需模型文件。系统在模型加载过程中会自动匹配对应的模型扩展名,避免因格式不一致而导致的加载错误;桌面路径作为默认初始目录,用户也可通过文件选择器自行切换至任意模型存放位置,操作便捷高效。系统内置了 YOLOv8s 通用检测模型以及自行训练的车牌检测与车牌颜色识别模型,用户可根据实际需求灵活选用或替换模型。在参数设置方面,该区域支持对置信度阈值与 IoU 重叠度阈值进行调节,系统默认值分别为 0.4 和 0.75。用户既可以通过点击 DoubleSpinBox 进行精确数值输入,也可以通过拖动滑块快速调整参数,系统提供了多种交互方式,兼顾了操作效率与参数调节的精细化需求。

3.检测结果样式配置模块

在检测结果样式配置模块中,系统为用户提供了高度自由的可视化定制能力,使检测结果的呈现更加直观、美观且符合个性化需求。该区域内集成了多项可勾选的样式控制选项,用户可根据需要自由选择是否在检测结果中显示标注框、车牌号码、车牌颜色、置信度等关键信息,所有设置均可实时作用于检测结果的绘制过程。在此基础上,系统还支持对文本颜色与车牌阴影区域颜色进行自定义设置,并允许用户灵活调整边框样式、文字显示位置、阴影透明度效果、字体大小系数以及文本之间的间距,从而实现更加精细化的显示控制。值得说明的是,检测结果中的文字与阴影效果均基于 OpenCV 的绘图接口实现,由于 OpenCV 在颜色参数上采用 BGR 格式输入,系统在内部对用户所选颜色进行了自动转换处理,确保界面层的颜色选择与实际绘制效果保持一致,进一步提升了系统的易用性与专业性。

4.系统操作模块

系统操作模块是整个界面中核心功能按钮的集中展示区域,专为提升操作效率与用户体验而设计。该模块通过为每个操作按钮配备直观图标,使用户能够一眼识别按钮功能,比单纯文字提示更易理解与操作。在此区域内,用户可以根据前面设置的输入源、模型与样式配置,快速执行车牌识别相关操作,包括开始识别、停止识别以及清空当前检测结果等基础功能。此外,系统提供了多种结果导出方式,用户可以选择导出检测结果的文本信息、完整图像或仅包含车牌区域的图像,以满足不同应用需求。模块还集成了信息查看功能,用户可随时查询当前登录用户信息、作者信息以及系统版本和状态信息,确保操作透明化与可追踪性。同时,操作模块还支持退出登录及退出系统功能,方便用户在不同使用场景下安全、快捷地完成操作。整体设计强调功能集中、操作直观,使系统在执行各类车牌识别任务时既高效又易用。

2.中间内容展示区域

该检测结果展示区域是系统直观呈现车牌识别成果的核心模块,充分结合了图像可视化与数据结构化展示的优势。上方区域根据左侧设置的输入源、模型配置及样式参数,自动绘制出带有标注框、阴影效果以及文字信息的结果图像,使用户能够直接在图像中看到每一块车牌的位置、颜色、单双层信息及其置信度表现。同时,阴影颜色、透明度、文字字体及背景色均按照用户自定义参数呈现,确保视觉效果既美观又符合实际需求。下方则通过表格形式详细展示每条检测结果,包括车牌号、车牌颜色、检测置信度、颜色置信度、车牌类型(单双层)、车牌矩形四个顶点位置以及车牌高度(像素值)等字段,所有文字信息居中显示,数值统一格式化到小数点后两位,行与行之间采用交替颜色并支持高亮选中,使数据一目了然、易于分析。图像与表格的结合不仅让用户能够直观观察识别效果,也便于快速对比和验证检测结果,实现从输入设置、模型识别到最终结果展示的完整闭环,为系统的专业性和可操作性提供了有力保障。

1.检测结果展示模块

检测结果展示模块是系统直观呈现车牌识别成果的核心区域。在该模块中,系统会将用户在样式配置模块中自定义的各种显示效果应用到最终结果中,确保检测结果既准确又美观。通过 YOLO 模型对车牌位置进行精准识别,并结合自行训练的车牌及车牌颜色识别模型提取关键信息,系统能够在图像中标注出车牌位置、车牌号码、车牌颜色以及单双层车牌信息。在视觉效果方面,系统利用用户自定义的车牌阴影颜色与阴影透明度系数,将阴影效果自然地叠加在车牌区域,同时通过自定义文字填写方法和字体设置,将中文车牌号以清晰可读的形式呈现。系统还会根据车牌颜色自动调整矩形边框及文字背景颜色,使标注信息与车牌本身形成良好对比,从而让用户能够一目了然地查看检测结果,提升了识别的可视化效果和交互体验。

2.检测结果表格信息展示模块

检测结果表格信息展示模块是系统对车牌识别结果进行结构化、可视化呈现的重要区域。在该模块中,我们使用 PyQt5 的 QTableWidget 来展示所有检测到的车牌信息,使用户能够直观、清晰地查看每一条检测结果。系统将识别结果以列表形式存储,每个列表元素是一个字典,字典中包含车牌号、车牌颜色、单双层车牌信息、置信度、矩形位置等多个字段。表格设计注重美观与易读性,表头与数据区通过清晰的样式区分开来,数据行与行之间采用交替颜色,点击某一行时会自动高亮选中行,提升交互体验。所有文字信息均居中显示,使表格整体视觉效果协调统一,同时所有浮点数数据统一格式化到小数点后两位,保证数据展示的精确性与整洁性。车牌位置信息以矩形四个顶点坐标的形式展示,车牌高度以像素值表示,方便用户对位置和尺寸进行直观理解与分析。通过这种结构化表格展示,用户不仅可以快速浏览检测结果,还能结合图像结果模块进行比对,实现车牌识别数据的高效管理与分析,为系统整体的实用性与专业性提供了有力支撑。

3.右侧详细结果日志输出区域

该区域集成了车牌识别结果展示与系统状态实时日志功能,为用户提供了完整的操作反馈与信息查看通道。车牌信息模块详细呈现所选车牌的关键数据,包括车牌号、车牌类型、检测目标数量、帧率、检测耗时、置信度以及车牌位置等,并在多车牌情况下通过组合框实现灵活切换与联动显示,使用户能够精准聚焦关注对象。状态展示与实时日志模块则实时反馈系统运行情况,每条日志均带有时间戳,记录从数据输入、模型加载到识别执行的全过程,同时提供清空和导出日志功能,支持日志持久化保存与分析。通过图像结果、数据表格、详细信息和日志的有机结合,用户不仅能够直观查看检测结果,还能全面掌握系统运行状态,快速定位问题与评估性能,从而提高操作效率与使用体验,实现对车牌识别全过程的可视化管理与监控。

1.车牌识别结果&车牌图像模块

车牌识别结果模块是系统中专门用于展示单个或多个车牌详细信息的核心区域,旨在帮助用户快速、精准地获取每一块车牌的识别情况。该模块中,所选车牌的车牌号以大号加粗字体显示,车牌类型(单双层)以次大号加粗字体呈现,使关键内容一目了然;同时展示检测目标数量、检测耗时(毫秒级)、帧率(单位 fps)、颜色置信度、识别置信度,以及车牌矩形坐标信息(xmin、ymin、xmax、ymax),提供完整的数据参考。值得注意的是,当图像或视频中检测到多个车牌时,模块会自动生成一个 ComboBox 组合框,默认选择"ALL",即显示最后一个车牌,组合框中包含所有检测到的车牌号,用户可以随时切换关注的车牌,模块中间的内容区以及下方的车牌图像信息会实时联动更新,实现信息同步展示。系统还会根据车牌右下角坐标位置,从左到右、从上到下排列车牌信息,使用户能够直观地看到排列顺序,同时能够只聚焦需要关注的车牌数据,提高查看效率。通过这种设计,模块不仅提供了丰富、精确的识别信息,还兼顾了多车牌场景下的交互性和操作便捷性,为用户分析和判断提供了强有力的支持。

3.状态展示&实时日志模块

状态展示与实时日志模块是系统用于反馈软件运行状态、记录操作过程以及跟踪车牌识别过程的重要区域。每当用户进行操作,如选择输入图像、视频文件、视频流或摄像头时,该模块会即时更新显示当前系统状态,让用户清楚了解每一步操作的执行情况和系统响应。与此同时,模块还会实时记录日志信息,每条日志前都会自动添加时间戳,确保用户能够准确掌握软件运行的时间节点,从而全面了解系统运行状态和识别进度。日志内容涵盖从数据源选择、模型加载、识别过程到结果输出的各类操作细节,帮助用户排查问题或分析性能。为了提高操作便利性,实时日志模块提供了两个辅助功能按钮:清空日志和导出日志。用户可以一键清空已有日志记录,保持界面整洁;也可以将日志导出为 Excel 文件,实现数据持久化保存,便于后续分析、存档或与他人共享。通过状态展示与实时日志模块,系统不仅提升了用户对软件运行全过程的可视化掌控能力,也为操作安全性、可追溯性以及结果管理提供了坚实保障,使用户在使用车牌识别功能时更加高效、可靠。

五.核心功能实现

1.界面设计

本次在界面设计方面,为有效降低项目的上手难度并减少界面开发与调试所需的时间,我们采用了 Qt Designer 进行可视化界面设计。通过所见即所得的设计方式,不仅提高了界面搭建效率,也使整体布局更加直观、规范,便于后续维护与扩展。系统界面主要由两个部分组成:一是基于 main_ui.ui 的主功能界面,用于承载核心业务逻辑与交互操作;二是基于 login_dialog.ui 的登录与注册界面,负责用户身份校验与基础信息交互。在资源管理方面,项目将所有图片、图标等界面相关资源统一存放于 .../resource/resource.qrc 文件中,通过 Qt 的资源系统进行集中管理。这种方式有效避免了资源路径混乱的问题,提高了资源的可移植性与复用性,同时也降低了用户在界面资源配置与使用过程中的操作成本,为整体软件的稳定性和易用性提供了良好保障。

1.登录注册界面

在登录注册界面的设计上,我们遵循简洁直观、层次清晰的设计原则,力求在保证功能完整的前提下提升用户的交互体验。整体界面采用左右分区布局:左侧为固定的图片展示区域,用于增强视觉效果与界面辨识度;右侧则为垂直布局区域,由水平布局组件、堆栈组件以及版权信息展示标签共同构成,使界面结构更加规整、有序。堆栈组件内部共包含两页内容,当索引为 0 时显示登录界面,当索引为 1 时显示注册界面,通过切换索引即可实现界面间的平滑过渡。

在登录界面的信息填写区域中,表单布局采用了"局部水平、整体垂直"的设计思路,即账号与密码等字段内部使用水平布局,将文本标签与对应的 LineEdit 输入框并排放置,标签仅承担提示说明的作用,从而降低视觉干扰,提高信息填写效率。界面下方的切换提示按钮采用蓝色无边框样式,本质上仍为 QPushButton,并将其置于水平布局中,在右侧加入水平弹簧,使按钮整体呈现左对齐效果,符合用户的操作习惯。底部的登录按钮选用了 QToolButton,并为其配置了图标及相应的鼠标交互样式,进一步增强了可点击性与反馈感。在逻辑实现上,我们为"没有账号?去注册"按钮绑定了槽函数,当用户点击该按钮时,通过切换堆栈组件的索引值,实现登录与注册界面的联动切换,使整体交互流程更加自然流畅。

2.主界面

在主界面的设计上,我们同样遵循了"局部水平、整体垂直"的布局原则,以保证界面结构清晰、功能分区明确。整体布局采用一个垂直布局作为容器,将顶部与底部两个水平布局依次放置其中,使界面在纵向上具有良好的层次感。顶部水平布局主要用于承载系统的核心导航与状态展示信息,便于用户快速了解当前系统状态并进行主要功能操作。

底部的水平布局则作为主功能区域,被进一步细分为左、中、右三个子区域,每个区域内部根据功能需求包含若干功能模块。这种分区式设计不仅提升了界面的可读性,也方便后续功能扩展与模块维护,使不同业务逻辑在视觉和结构上都保持相对独立。为了增强系统的交互性与易用性,主界面中引入了多种类型的界面交互组件,如按钮、列表、输入框等,实现了与用户之间的有效交互,提升了整体使用体验。

在界面美化方面,我们使用 QSS(Qt Style Sheet)对部分组件进行了样式定制,通过统一配色、调整控件边距与交互效果,使界面风格更加协调、美观,同时也增强了系统的专业感与辨识度。相关的 QSS 样式已在项目中给出,供大家参考与复用,开发者也可以在此基础上根据自身需求进行修改和扩展,从而快速设计出符合自己系统风格的主界面。

python 复制代码
#centralwidget{ background: qlineargradient(
        x1: 0, y1: 0,
        x2: 0, y2: 1,
        stop: 0 #E9EFFB,
        stop: 1 #C9D6F2
    );
}
QGroupBox {
    border: 1px solid #B7C6E3;
    border-radius: 8px;
    margin-top: 16px;

    background: qlineargradient(
        x1: 0, y1: 0,
        x2: 0, y2: 1,
        stop: 0 #E9EFFB,
        stop: 1 #C9D6F2
    );
    font: 16px "Microsoft YaHei";
font-weight:600;
}

/* 标题 */
QGroupBox::title {
    subcontrol-origin: margin;
    margin-left: 4px;
    color: black;
}
QSlider::groove:horizontal {
    height: 6px;
    border-radius: 3px;
    background: #DCE6F7;
}

QSlider::sub-page:horizontal {
    border-radius: 3px;
    background: qlineargradient(
        x1: 0, y1: 0,
        x2: 1, y2: 0,
        stop: 0 #9FB6E8,
        stop: 1 #6F8FD8
    );
}

QSlider::add-page:horizontal {
    border-radius: 3px;
    background: #DCE6F7;
}

QSlider::handle:horizontal {
    width: 14px;
    height: 14px;
    margin: -4px 0;          /* 关键:让滑块居中 */
    border-radius: 7px;

    background: #FFFFFF;
    border: 2px solid #6F8FD8;
}

QSlider::handle:horizontal:hover {
    border-color: #4C6EDB;
}

QSlider::handle:horizontal:pressed {
    background: #6F8FD8;
}

QDoubleSpinBox {
    min-height: 18px;
    padding: 2px 8px;

    border: 1px solid #B7C6E3;
    border-radius: 6px;

    background-color: #FFFFFF;
    color: #2F3F60;

    font-size: 13px;
}

QDoubleSpinBox:hover {
    border-color: #8FA6E6;
}

QDoubleSpinBox:focus {
    border-color: #6F8FD8;
    background-color: #F6F9FF;
}

*{font-family:"微软雅黑"}

QTableWidget {
    border: 1px solid #B7C6E3;
    border-radius: 8px;
    background-color: #FFFFFF;

    gridline-color: #D5DFF3;
    font-size: 13px;
    color: #2F3F60;

    selection-background-color: #DCE6F7;
    selection-color: #1E3354;
}

/* 表头整体 */
QHeaderView::section {
    background: qlineargradient(
        x1: 0, y1: 0,
        x2: 0, y2: 1,
        stop: 0 #EEF3FD,
        stop: 1 #D9E4F7
    );

    border: 1px solid #C3D0EA;
    padding: 4px 8px;

    font-weight: bold;
    color: #2F3F60;
}

/* 去掉左上角空白 */
QTableCornerButton::section {
    background-color: #E9EFFB;
    border: 1px solid #C3D0EA;
}

/* 行 hover */
QTableWidget::item:hover {
    background-color: #F3F7FF;
}

/* 选中单元格 */
QTableWidget::item:selected {
    background-color: #C9D6F2;
    color: #1E3354;
}

/* 行号(如果显示垂直表头) */
QHeaderView::section:vertical {
    background-color: #EEF3FD;
    border: 1px solid #C3D0EA;
}
QLineEdit {
    min-height: 16px;

    border: 1px solid #B7C6E3;
    border-radius: 6px;
	padding-left:5px;
    background: #FFFFFF;
    color: #2F3F60;

    font-size: 13px;
}

/* 悬停 */
QLineEdit:hover {
    border-color: #8FA6E6;
    background: #F9FBFF;
}

/* 获取焦点 */
QLineEdit:focus {
    border: 1px solid #6F8FD8;

    background: qlineargradient(
        x1: 0, y1: 0,
        x2: 0, y2: 1,
        stop: 0 #F6F9FF,
        stop: 1 #EEF3FD
    );
}

/* 禁用状态 */
QLineEdit:disabled {
    color: #9AA8C5;
    background-color: #EEF3FD;
    border-color: #C3D0EA;
}

/* 占位符文字(Qt 5.12+) */
QLineEdit::placeholder {
    color: #9AA8C5;
}
QTextBrowser {
    background-color: rgba(0,0,0,0.8);  /* 黑色背景 */
    color: #00FF00;             /* 科技绿文字 */
    border: 1px solid #333333;  /* 边框颜色 */
    font-size: 12px;
border-radius:10px;
}

2.关于模型

我们为了实现车牌、车牌颜色识别训练了一个plate_rec_color.pth模型,配合联动我们的系统代码实现了对多种数据源内容的识别。

实现了一套完整的车牌检测与识别可视化系统。整体流程分为三部分:检测、识别和绘制结果。首先使用 YOLOv8 模型完成车牌目标检测,包含前处理(letterbox)、后处理(置信度筛选、NMS、坐标还原)。随后对检测到的车牌区域进行裁剪,并通过 CNN+CTC 的车牌识别网络完成字符序列解码,同时支持车牌颜色分类与双层车牌结构处理。识别阶段包含图像归一化、softmax 解码及重复字符合并。最后提供高度可配置的绘制模块,支持多种边框样式(实线、虚线、圆角、角标等)、中文文字叠加、颜色自适应、阴影与透明背景等效果。整体代码模块化清晰,兼顾工程实用性与可扩展性,适用于实际车牌识别应用场景。

六.项目运行环境

本项目名称为yolov8-plate-recognition

1.项目依赖

博主是在Windows电脑上使用Python3.8开发的本系统,建议大家使用的Python版本别太高。

其中项目依赖为:

bash 复制代码
PyQt5==5.15.11
torch==2.4.1
torchvision==0.19.1
Pillow==9.3.0
opencv-python==4.10.0.82
pandas==2.0.3
numpy==1.24.4

我已经整理到了requirements.txt,大家直接使用命令
pip install -r requirements.txt

即可一键安装项目依赖,其中的torch和torchvision只要匹配即可,不一定非要和博主开发环境的版本一致。

2.项目结构

很多小伙伴担心拿到代码后项目看不懂,这个大家不必担心,我们采用文件+类名对相关功能进行了模块化定义,大家见名知意。

下图博主采用tree命令生成了文件、目录树

bash 复制代码
tree "D:\projects\gitee\2025\yolov8-plate-recognition" /f /a
bash 复制代码
D:\PROJECTS\GITEE\2025\YOLOV8-PLATE-RECOGNITION
|   main.py(软件启动入口)
|   record.txt(开发记录)
|   requirements.txt(项目依赖)
|
|
+---data(数据文件目录)
|   +---conf(系统配置)
|   |       main_conf.yaml(系统配置文件)
|   |
|   +---database(数据库文件夹)
|   |       data.db(数据库-sqlite3)
|   |
|   +---fonts(字体文件夹)
|   |       platech.ttf(字体文件,支持中文绘制)
|   |
|   \---weights(权重文件)
|           plate_rec_color.pth(车牌、颜色识别模型)
|           yolov8s.pt(目标检测模型)
|
+---script(工具脚本包)
|       create_qrc.py(资源转换脚本)
|
+---src
|   +---conf(核心配置包)
|   |       style_conf.py(样式设置)
|   |       system_conf.py(系统配置)
|   |       test_data.py(测试数据)
|   |       __init__.py
|   |
|   +---engine(核心引擎)
|   |       db_engine.py(数据库引擎-sqlite3)
|   |       detect_rec_plate.py(车牌、颜色识别引擎)
|   |       main_engine.py(核心线程引擎)
|   |       __init__.py
|   |
|   +---resource(资源文件夹)
|   |   |   resource.qrc
|   |   |   resource_rc.py
|   |   |   __init__.py
|   |   |
|   |   \---imgs(图像资源文件夹)
|   |           about_author.png
|   |           ai.svg
|   |           bin.png
|   |           camera.png
|   |           car.png
|   |           change.png
|   |           clear_log.png
|   |           download.png
|   |           excel.png
|   |           exit.png
|   |           export_image_file.png
|   |           file.png
|   |           image_file.png
|   |           info.png
|   |           key.png
|   |           live_camera.png
|   |           login.jpg
|   |           logout.png
|   |           plate_no.jpg
|   |           register.png
|   |           stop.png
|   |           video_file.png
|   |
|   +---utils
|   |       conf_manager.py(配置管理器)
|   |       custom_utils.py(工具方法)
|   |       __init__.py
|   |
|   \---widgets(组件包)
|           login_dialog.py(登录注册窗口-由设计师.ui转化而来)
|           login_dialog.ui(登录注册窗口Ui)
|           login_page.py(登录注册主逻辑)
|           main_page.py(主界面逻辑调度)
|           main_ui.py(主界面-由设计师.ui转化而来)
|           main_ui.ui(主界面窗口UI)
|           __init__.py
|
\---ultralytics(YOLOv8包)
   ......

七.总结

本系统基于 PyQt5 图形界面与 YOLOv8 深度学习模型,实现了高效、可视化的车牌识别功能。系统左侧采用垂直布局,包含检测内容设置、模型配置、结果样式自定义及操作模块,支持图像、视频、视频流及摄像头多种输入方式,并可灵活调整模型路径、置信度阈值及 IoU 阈值。检测结果通过图像、表格及详细信息模块直观展示,包括车牌号、颜色、类型、置信度及位置信息,同时支持多车牌切换和联动显示。系统还提供状态展示与实时日志功能,可清空或导出日志,便于追踪操作和分析性能。整体设计实现了从数据输入、模型识别到结果展示与操作控制的完整闭环,操作直观、功能全面,兼具高效性与可扩展性,满足多场景下的车牌识别需求。

欢迎各位朋友前来咨询,大家可以表情包下面的二维码联系博主,最后谢谢大家!

相关推荐
Blossom.1182 小时前
多模态大模型LoRA微调实战:从零构建企业级图文检索系统
人工智能·python·深度学习·学习·react.js·django·transformer
MarkHD3 小时前
智能体在车联网中的应用:第30天 多智能体强化学习实战入门:PettingZoo环境搭建与simple_adversary深度解析
深度学习
oscar9993 小时前
激活函数:神经网络的“开关”与“灵魂”
人工智能·深度学习·神经网络·激活函数
Eric.Lee20214 小时前
机器人:sim2real 技术必要性
人工智能·深度学习·机器人·机器人仿真·mujoco·sim2real
江上鹤.1484 小时前
Day 49 预训练模型
人工智能·深度学习·机器学习
zuozewei4 小时前
7D-AI系列:Transformer 与深度学习核心概念
人工智能·深度学习·transformer
victory04314 小时前
大模型长上下文长度使用窗口注意力表现有下降吗
深度学习
Java后端的Ai之路5 小时前
【神经网络基础】-深度学习框架学习指南
人工智能·深度学习·神经网络·机器学习