【智慧交通项目实战】《 OCR车牌检测与识别》(四):基于Pyqt的项目可视化

news2024/9/25 13:19:03

在这里插入图片描述

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️点击链接 加群。
🎉专栏推荐: 点击访问➡️ 《计算机视觉》 总结目标检测、图像分类、分割OCR、等方向资料。 点击访问➡️ 《深入浅出OCR》: 对标全网最全OCR教程,含理论与实战总结。以上专栏内容丰富、价格便宜且长期更新,欢迎订阅,可加入上述交流群长期学习。
🎉学习者福利: 强烈推荐优秀AI学习网站,包括机器学习、深度学习等理论与实战教程,非常适合AI学习者。➡️网站链接

在这里插入图片描述

💚 专栏地址:深入浅出OCR
🍀 专栏导读:恭喜你发现宝藏!本专栏系列主要介绍计算机视觉OCR文字识别领域,每章将分别从OCR技术发展、方向、概念、算法、论文、数据集、对现有平台及未来发展方向等各种角度展开详细介绍,综合基础与实战知识。以下是本系列目录,分为前置篇、基础篇与进阶篇,进阶篇在基础篇基础上进行全面总结,会针对最经典论文及最新算法展开讲解,内容目前包括不限于文字检测、识别、表格分析等方向。 未来看情况更新NLP方向知识,本专栏目前主要面向深度学习及CV同学学习,希望大家能够多多交流,欢迎订阅本专栏,如有错误请大家评论区指正,如有侵权联系删除。


【智慧交通项目实战】 OCR车牌检测与识别项目实战(四):基于Pyqt的项目可视化

💚导读:本项目为新系列【智慧交通项目实战】《OCR车牌检测和识别》(四)–项目可视化,该系列将分为多篇文章展开分别对项目流程、数据集、检测、识别算法、可视化进行详细介绍。本篇为该系列第四篇,将着重介绍车牌识别项目可视化,对可视化界面、配置进行详进行详细解读,后续将陆续更新其他项目实战文章。

在这里插入图片描述

智慧交通预测系统(PaddleOCR版本)

参考:https://blog.csdn.net/qq_36816848/article/details/128686227

OCR车牌检测+识别

本系列项目目录如下, 代码暂未公开,需要代码和指导可加群联系。

【智慧交通项目实战】《 OCR车牌检测与识别》(一)项目介绍
【智慧交通项目实战】 《 OCR车牌检测与识别》(二):基于YOLO的车牌检测
【智慧交通项目实战】 《 OCR车牌检测与识别》(三):基于CRNN改进版的车牌识别
【智慧交通项目实战】 《 OCR车牌检测与识别》(四):车牌检测与识别可视化(本篇)

在这里插入图片描述

车辆检测

后续更新,且将持续更新其他实战项目系列!
img


一、项目背景:

车牌识别技术是智能交通的重要环节,目前已广泛应用于例如停车场、收费站等等交通设施中,提供高效便捷的车辆认证的服务,其中较为典型的应用场景为卡口系统。车牌识别即识别车牌上的文字信息,属于光学字符识别(OCR)的一项子任务。
请添加图片描述

二、车牌识别可视化流程:

项目流程图:
在这里插入图片描述

系统支持如下:

  • 1.单行蓝牌
  • 2.单行黄牌
  • 3.新能源车牌
  • 4.白色警用车牌
  • 5.教练车牌
  • 6.武警车牌
  • 7.双层黄牌
  • 8.双层白牌
  • 9.使馆车牌
  • 10.港澳粤Z牌
  • 11.双层绿牌
  • 12.民航车牌

三、项目文件目录

#注:代码过长只截取部分代码文件

----plate\
    |----ccpd_process.py
    |----data\
    |    |----argoverse_hd.yaml
    |    |----coco.yaml
    |    |----coco128.yaml
    |    |----hyp.finetune.yaml
    |    |----hyp.scratch.yaml
    |    |----plateAndCar.yaml
    |    |----retinaface2yolo.py
    |    |----train2yolo.py
    |    |----val2yolo.py
    |    |----val2yolo_for_test.py
    |    |----voc.yaml
    |    |----widerface.yaml
    |----demo.sh
    |----detect_demo.py
    |----detect_plate.py
    |----export.py
    |----fonts\
    |    |----platech.ttf
    |----hubconf.py
    |----image\
    |    |----README\
    |    |    |----test_1.jpg
    |    |    |----weixian.png
    |----json2yolo.py
    |----LICENSE
    |----models\
    |    |----blazeface.yaml
    |    |----blazeface_fpn.yaml
    |    |----common.py
    |    |----experimental.py
    |    |----yolo.py
    |    |----yolov5l.yaml
    |    |----yolov5l6.yaml
    |    |----yolov5m.yaml
    |    |----yolov5m6.yaml
    |    |----yolov5n-0.5.yaml
    |    |----yolov5n.yaml
    |    |----yolov5n6.yaml
    |    |----yolov5s.yaml
    |    |----yolov5s6.yaml

四、基于Pyqt的车牌识别可视化实战

PyQt是一个用于创建桌面应用程序的Python库,它是对Qt应用框架的Python绑定。Qt是一个跨平台的C++应用程序开发框架,具有强大的图形界面和事件处理能力。PyQt通过将Qt的功能暴露给Python开发者,使得开发者可以使用Python来创建功能丰富的桌面应用程序。PyQt有几个不同的模块,每个模块提供了与Qt的不同方面进行交互的类和函数。

1.Pyqt主要模块包括:

QtCore:提供了核心的非图形类,包括事件处理、定时器、线程、文件IO等。
QtGui:包含了图形相关的类,用于创建窗口、绘制图形、处理用户输入等。
QtWidgets:包含了更高级的图形界面类,如按钮、文本框、列表框等,可以用于构建用户友好的界面。
QtNetwork:提供了网络编程相关的类,用于创建网络连接、实现客户端和服务器通信等。
QtSql:用于数据库操作,可以与各种数据库系统进行交互。
QtWebEngine:用于在应用程序中嵌入Web内容。
使用PyQt,开发者可以使用Python语言灵活地创建和操作丰富多样的GUI界面。PyQt提供了丰富的API文档和示例代码,使得学习和使用PyQt变得相对容易。此外,由于Qt和PyQt是跨平台的,所以开发的应用程序可以在多个操作系统上运行,极大地提高了应用程序的可移植性。

2.PyQt关键特点:

1.强大的功能:PyQt提供了对Qt框架的完整访问,包括GUI组件、布局管理、事件处理、文件操作、网络通信等功能。它支持丰富的Qt类库,能够满足各种复杂的应用程序开发需求。
2.跨平台支持:Qt框架本身是跨平台的,PyQt作为其Python绑定库也具备跨平台的特性。开发者可以在不同的操作系统(如Windows、MacOS、Linux等)上运行相同的PyQt应用程序,而无需修改代码。
3.可视化设计工具:PyQt提供了Qt Designer,一个可视化设计工具,可以轻松创建和编辑GUI界面。Qt Designer生成的界面文件可以与PyQt代码无缝集成,简化了界面设计和开发的流程。
4.灵活性和可扩展性:PyQt基于Python语言,具有灵活性和可扩展性。开发者可以利用Python强大的生态系统和第三方库,进行数据处理、图形绘制、数据库操作等任务,与PyQt结合开发出功能丰富的应用程序。

3.安装PyQt

对于商业许可版本的 PyQt,您必须先获得许可证才能安装。 要安装 GPL 许可版本,请运行以下命令创建虚拟环境并安装 PyQt5。 虽然您可以全局安装 PyQt,但建议您使用虚拟环境。

pip install PyQt5

4.PyQt开始构建简单GUI程序

(1) 导入需要的类
PyQt 带有几个内置模块。 但是,在构建 GUI 时,您最常与之交互的模块是 QtWidgets 模块。 它具有您将用于创建 GUI 的类。

from PyQt.QtWidgets import QApplication, QWidgets

因为是创建最基本的“hello world”GUI,所以我们将只使用 QApplication 和 QWidgets 类。 首先像这样导入它们:

(2) 初始化应用程序
我们需要通过创建 QApplication 的实例来初始化应用程序。 它负责管理应用程序的主要设置和控制流。 因此,您应该在创建与用户界面相关的任何其他对象之前实例化此类。

application = QApplication([])

在上面的代码中,我们向 QApplication 传递了一个空数组,但如果您希望应用程序从命令行接收参数,您也可以传递 sys.argv。 如果您将 sys.argv 作为参数传递,请务必导入 sys。

(3) 创建主窗口

主窗口,也称为顶层窗口,是一个没有父窗口的小部件。 每个 GUI 都必须有一个主窗口。

创建一个 QWidget 实例并将其作为我们的主窗口,如下所示:

mainWindow = QWidget()
mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Hello World')

创建 Qwidget 实例后,您可以调用其他几种方法。 对于我们的简单 GUI,我们调用了 setGeometry 方法和 setWindowTitle 方法。

setGeometry 方法用于在屏幕上定位 GUI 并设置其尺寸。 它的函数签名是 setGeometry(x, y, width, height)。 前两个参数指定窗口在屏幕上的 x 和 y 坐标,width 和 height 分别用于设置窗口的宽度和高度。

setWindowTitle 方法,顾名思义,用于设置应用程序的标题。 您可以将标题作为字符串参数传递。 如果您不自己设置,窗口将没有标题。

(4)显示主窗口

默认情况下,我们在上一步中创建的窗口是不可见的。 我们需要通过调用 show 方法来显示它:

mainWindow.show()

(5) 启动事件循环

最后,您需要通过调用 application.exec 方法来启动事件循环:

application.exec()

也可以改用 application.exec_() 来启动事件循环。完成上述所有五个步骤后,您的 app.py 文件应包含以下代码:

from PyQt5.QtWidgets import QWidget, QApplication
 
application = QApplication([])
 
mainWindow = QWidget()
 
mainWindow.setGeometry(0, 0, 350, 400)
mainWindow.setWindowTitle('Hello World')
 
mainWindow.show()
 
application.exec()

与任何其他 Python 脚本一样,您需要使用命令 python3 app.py 来运行 app.py。 您应该能够看到显示的窗口。 窗口的外观在很大程度上取决于您的系统。 在 Linux 上,它应该类似于下图。

5.车牌识别模型最终识别效果:

在这里插入图片描述

6.项目Pyqt界面配置:

本项目使用Qt Designer工具完成系统的UI界面设计与制作。Qt Designer是一种灵活的可视化GUI创作方法,创建的UI界面通常使用.ui格式。ui文件可以通过其他python格式引用,也可以使用pyuic5命令转换为.py格式的文件,还可以手动转换使用Eric6命令。要实现信号与槽之间的通信,需要使用PyQt5控件。点击按钮产生的消息称为信号,发送的信号需要通过槽函数传递给另一个控件来完成事件。当发生特定事件时,会发射一个事件信号。

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1060, 679)
        MainWindow.setSizeIncrement(QtCore.QSize(0, 0))
        MainWindow.setStyleSheet("#MainWindow{border-image: url(UI/bg.jpg);}")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.PB_stop = QtWidgets.QPushButton(self.centralwidget)
        self.PB_stop.setObjectName("PB_stop")
        self.gridLayout.addWidget(self.PB_stop, 9, 1, 1, 1)
        self.PB_resize = QtWidgets.QPushButton(self.centralwidget)
        self.PB_resize.setObjectName("PB_resize")
        self.gridLayout.addWidget(self.PB_resize, 7, 0, 1, 2)
        self.line_2 = QtWidgets.QFrame(self.centralwidget)
        self.line_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.gridLayout.addWidget(self.line_2, 5, 0, 1, 2)
        self.PB_predict = QtWidgets.QPushButton(self.centralwidget)
        self.PB_predict.setObjectName("PB_predict")
        self.gridLayout.addWidget(self.PB_predict, 9, 0, 1, 1)
        self.line_3 = QtWidgets.QFrame(self.centralwidget)
        self.line_3.setFrameShape(QtWidgets.QFrame.HLine)
        self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line_3.setObjectName("line_3")
        self.gridLayout.addWidget(self.line_3, 0, 0, 1, 8)
        self.gridLayout_3 = QtWidgets.QGridLayout()
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.label_out = QtWidgets.QLabel(self.centralwidget)
        self.label_out.setEnabled(True)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(5)
        sizePolicy.setHeightForWidth(self.label_out.sizePolicy().hasHeightForWidth())
        self.label_out.setSizePolicy(sizePolicy)
        self.label_out.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_out.setText("")
        self.label_out.setObjectName("label_out")
        self.gridLayout_3.addWidget(self.label_out, 1, 1, 1, 1)
        self.horizontalLayout_13 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_13.setObjectName("horizontalLayout_13")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_13.addItem(spacerItem)
        self.label_title2 = QtWidgets.QLabel(self.centralwidget)
        self.label_title2.setMinimumSize(QtCore.QSize(0, 25))
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.label_title2.setFont(font)
        self.label_title2.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_title2.setStyleSheet("")
        self.label_title2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_title2.setObjectName("label_title2")
        self.horizontalLayout_13.addWidget(self.label_title2)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_13.addItem(spacerItem1)
        self.gridLayout_3.addLayout(self.horizontalLayout_13, 0, 1, 1, 1)
        self.horizontalLayout_18 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_18.setObjectName("horizontalLayout_18")
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_18.addItem(spacerItem2)
        self.label_title1_2 = QtWidgets.QLabel(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(self.label_title1_2.sizePolicy().hasHeightForWidth())
        self.label_title1_2.setSizePolicy(sizePolicy)
        self.label_title1_2.setMinimumSize(QtCore.QSize(0, 25))
        font = QtGui.QFont()
        font.setFamily("微软雅黑")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.label_title1_2.setFont(font)
        self.label_title1_2.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_title1_2.setStyleSheet("")
        self.label_title1_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_title1_2.setObjectName("label_title1_2")
        self.horizontalLayout_18.addWidget(self.label_title1_2)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_18.addItem(spacerItem3)
        self.gridLayout_3.addLayout(self.horizontalLayout_18, 0, 0, 1, 1)
        self.label_in = QtWidgets.QLabel(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(5)
        sizePolicy.setHeightForWidth(self.label_in.sizePolicy().hasHeightForWidth())
        self.label_in.setSizePolicy(sizePolicy)
        self.label_in.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.label_in.setText("")
        self.label_in.setObjectName("label_in")
        self.gridLayout_3.addWidget(self.label_in, 1, 0, 1, 1)
        self.gridLayout.addLayout(self.gridLayout_3, 2, 3, 11, 5)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_3.sizePolicy().hasHeightForWidth())
        self.label_3.setSizePolicy(sizePolicy)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_6.addWidget(self.label_3)
        self.L_during = QtWidgets.QLineEdit(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.L_during.sizePolicy().hasHeightForWidth())
        self.L_during.setSizePolicy(sizePolicy)
        self.L_during.setObjectName("L_during")
        self.horizontalLayout_6.addWidget(self.L_during)
        self.gridLayout.addLayout(self.horizontalLayout_6, 4, 0, 1, 2)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setFrameShape(QtWidgets.QFrame.VLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.gridLayout.addWidget(self.line, 2, 2, 11, 1)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_4.addWidget(self.label_2)
        self.L_time = QtWidgets.QLineEdit(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.L_time.sizePolicy().hasHeightForWidth())
        self.L_time.setSizePolicy(sizePolicy)
        self.L_time.setObjectName("L_time")
        self.horizontalLayout_4.addWidget(self.L_time)
        self.gridLayout.addLayout(self.horizontalLayout_4, 3, 0, 1, 2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setObjectName("label")
        self.horizontalLayout_3.addWidget(self.label)
        self.L_day = QtWidgets.QLineEdit(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.L_day.sizePolicy().hasHeightForWidth())
        self.L_day.setSizePolicy(sizePolicy)
        self.L_day.setObjectName("L_day")
        self.horizontalLayout_3.addWidget(self.L_day)
        self.gridLayout.addLayout(self.horizontalLayout_3, 2, 0, 1, 2)
        self.listWidget_in = QtWidgets.QListWidget(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.listWidget_in.setFont(font)
        self.listWidget_in.setObjectName("listWidget_in")
        self.gridLayout.addWidget(self.listWidget_in, 10, 0, 1, 2)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.RB_camera = QtWidgets.QRadioButton(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.RB_camera.sizePolicy().hasHeightForWidth())
        self.RB_camera.setSizePolicy(sizePolicy)
        self.RB_camera.setObjectName("RB_camera")
        self.horizontalLayout_5.addWidget(self.RB_camera)
        self.RB_img = QtWidgets.QRadioButton(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(1)
        sizePolicy.setHeightForWidth(self.RB_img.sizePolicy().hasHeightForWidth())
        self.RB_img.setSizePolicy(sizePolicy)
        self.RB_img.setObjectName("RB_img")
        self.horizontalLayout_5.addWidget(self.RB_img)
        self.PB_import = QtWidgets.QPushButton(self.centralwidget)
        self.PB_import.setObjectName("PB_import")
        self.horizontalLayout_5.addWidget(self.PB_import)
        self.gridLayout.addLayout(self.horizontalLayout_5, 6, 0, 1, 2)
        self.listWidget_out = QtWidgets.QListWidget(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(12)
        self.listWidget_out.setFont(font)
        self.listWidget_out.setObjectName("listWidget_out")
        self.gridLayout.addWidget(self.listWidget_out, 11, 0, 1, 2)
        self.gridLayout.setColumnStretch(7, 10)
        self.gridLayout_2.addLayout(self.gridLayout, 3, 2, 1, 1)
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        font = QtGui.QFont()
        font.setPointSize(20)
        font.setBold(True)
        font.setWeight(75)
        self.label_4.setFont(font)
        self.label_4.setAlignment(QtCore.Qt.AlignCenter)
        self.label_4.setObjectName("label_4")
        self.gridLayout_2.addWidget(self.label_4, 0, 2, 1, 1)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.action_helmet_clothes = QtWidgets.QAction(MainWindow)
        self.action_helmet_clothes.setObjectName("action_helmet_clothes")
        self.action_weight = QtWidgets.QAction(MainWindow)
        self.action_weight.setObjectName("action_weight")
        self.action_loadmodel = QtWidgets.QAction(MainWindow)
        self.action_loadmodel.setObjectName("action_loadmodel")
        self.action_jump = QtWidgets.QAction(MainWindow)
        self.action_jump.setObjectName("action_jump")

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.PB_stop.setText(_translate("MainWindow", "停止"))
        self.PB_resize.setText(_translate("MainWindow", "适应窗口"))
        self.PB_predict.setText(_translate("MainWindow", "预测"))
        self.label_title2.setText(_translate("MainWindow", "输出"))
        self.label_title1_2.setText(_translate("MainWindow", "输入"))
        self.label_3.setText(_translate("MainWindow", "使用时间:"))
        self.label_2.setText(_translate("MainWindow", "时    间:"))
        self.label.setText(_translate("MainWindow", "日    期:"))
        self.RB_camera.setText(_translate("MainWindow", "摄像头"))
        self.RB_img.setText(_translate("MainWindow", "图片/视频"))
        self.PB_import.setText(_translate("MainWindow", "打开"))
        self.label_4.setText(_translate("MainWindow", "车牌识别系统V1.0"))
        self.action_helmet_clothes.setText(_translate("MainWindow", "头盔/反光衣"))
        self.action_weight.setText(_translate("MainWindow", "选择权重文件"))
        self.action_loadmodel.setText(_translate("MainWindow", "载入模型"))
        self.action_jump.setText(_translate("MainWindow", "tiaozhuan"))

五、可视化界面识别效果:

1.双层车牌识别:

在这里插入图片描述

2.倾斜角度车牌识别效果:

在这里插入图片描述

在这里插入图片描述

六、项目总结:

《智慧交通项目实战《OCR车牌检测和识别》(三)–基于改进CRNN的车牌识别》为该系列第三篇,着重介绍车牌识别流程,对数据集、训练流程、训练配置进行详细解读,后续该系列文章将继续更新项目可视化流程。

文章参考 :

1.基于Paddle的智慧交通预测系统
2.Pyqt介绍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot 限流方案

一、背景 限流对于一个微服务架构系统来说具有非常重要的意义,否则其中的某个微服务将成为整个系统隐藏的雪崩因素,为什么这么说? 举例来讲,某个SAAS平台有100多个微服务应用,但是作为底层的某个或某几个应用来说&…

【前端】运行一个vue项目

如何运行一个vue项目 首先cd到要运行的vue文件夹下,或者是在webstorm下面的终端直接打开,就会自动开启在这个文件夹下的终端安装项目中所有需要的依赖包 sudo npm install运行项目 sudo npm run serve到这里项目就运行起来了 4. 打开项目 点击网址打…

html实现视频网站,仿爱奇艺,搜狐,迅雷看看(附源码)

文章目录 1.功能模板1.1 仿爱奇艺1.2 仿搜狐视频1.3 仿迅雷看看1.4 视频播放1.5 影视公司官网 2.效果和源码2.1 源代码2.2 模板目录 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/131516313 html实现视频网站…

c++ 内存管理二:重载(接管内存管理工具)

文章目录 前言1 重载全局的 ::operator new 运算符2 重载类的 operator new 运算符3 重载类的带有额外参数的 operator new 运算符 前言 重载 operator new 运算符来自定义内存分配的行为。重载 operator new 运算符允许我们使用自定义的内存分配逻辑,例如使用池分…

压测工具哪个好?LoadRunner、Jmeter、Locust、Wrk 全方位对比....

当你想做性能测试的时候,你会选择什么样的测试工具呢?是会选择wrk?jmeter?locust?还是loadrunner呢?今天,笔者将根据自己使用经验,针对jmeter、locust、wrk和loadrunner常用的性能测…

【数据结构与算法】内排序算法比较(C\C++)

实践要求 1. 问题描述 各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间,试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 2. 基本要求 对以下10种常用的内部排序算法进行比较…

MySQL更改表结构语句

一、MySQL表结构变更语句 1. 新增字段 语法&#xff1a; &#xff08;1&#xff09;在末尾添加字段 ALTER TABLE <表名> ADD <新字段名><数据类型>[约束条件]; &#xff08;2&#xff09;在开头添加字段 ALTER TABLE <表名> ADD <新字段名> <…

[C++]lambda

目录 前言&#xff1a; 1 认识lambda 2 lambda语法 3 lambda的类型 4 lambda的底层 前言&#xff1a; 本篇讲解了C11当中新添加的lambda语法&#xff0c;以及lambda的底层 1 认识lambda lambda的出现方便了很多我们写程序的地方&#xff0c;例如下面这个样例…

C++图形开发(2):最基本的图形界面

文章目录 1.构成2.内容介绍2.1 initgraph()2.2 _getch()2.3 closegraph() 3.总结 今天来简单介绍下最基本的图形界面~ 1.构成 输入以下内容并编译&#xff1a; 这就是一个最基本的图形界面了 #include<graphics.h> #include<conio.h>int main() {initgraph(600, …

rollup入门 - 学习笔记(1)

rollup打包工具 打包项目用webpack , 打包js库用rollup 下载rollup npm i rollup --save-dve 初始化项目 npm init -y 创建src/main.js文件 import welcomerollup from ../modules/mymodule welcomerollup(hello world) 创建module/mymodule.js文件 const welcomerollup (ms…

Python PDF生成和二进制流转换(FPDF)

文章目录 安装FPDF生成PDF文档生成PDF的二进制流 安装FPDF pip install fpdf22.7.4生成PDF文档 通过FPDF生成PDF文档的具体步骤&#xff1a; 初始化&#xff1a;fpdf库的操作主要由FPDF对象来处理&#xff0c;在生成PDF文档时&#xff0c;需要初始化FPDF对象。添加页面&…

引爆媒体关注的秘密武器:媒介易教你打造热门新闻故事!

在进行媒体邀约时&#xff0c;提供有吸引力的新闻价值和故事性是吸引媒体关注和获得采访机会的关键。媒体记者时常接收大量的邀约&#xff0c;因此需要与众多企业竞争&#xff0c;才能让自己的邀约脱颖而出。本文将探讨如何在媒体邀约中提供有吸引力的新闻价值和故事性&#xf…

Domain Admin域名和SSL证书过期监控到期提醒

基于Python3 Vue3.js 技术栈实现的域名和SSL证书监测平台 用于解决&#xff0c;不同业务域名SSL证书&#xff0c;申请自不同的平台&#xff0c;到期后不能及时收到通知&#xff0c;导致线上访问异常&#xff0c;被老板责骂的问题 核心功能&#xff1a;域名 和SSL证书 的过期…

【敬伟ps教程】亮度与色阶看懂直方图

文章目录 亮度/对比度色阶调整输入色阶调整输出色阶调节原色通道调整图层 亮度/对比度 控制明暗的视觉因素&#xff0c;三要素之一&#xff0c;明度 在拾色器中修改 HSB 中的 B&#xff0c;改为较低的值即可调整明度。明度较低时&#xff0c;RGB色值偏低&#xff0c;CMYK色值…

怎么看懂今日白银现货价格?这个技术信号了解一下

金叉&#xff0c;是某些技术指标的一种技术动作&#xff0c;通常预示着&#xff0c;今日白银现货价格开始上涨&#xff0c;并且出现了买入机会。但是&#xff0c;是不是金叉就一定有买入机会呢&#xff1f;在今日白银现货价格出现金叉时要如何处理呢&#xff1f;这都是我们要处…

UV统计量

UV统计 UV&#xff1a;Unique Visitor&#xff0c;即独立访客量&#xff0c;是指通过互联网访问、浏览该网页的自然人。一天内同一个用户多次访问该网站&#xff0c;只会记录一次。 PV&#xff1a;Page View&#xff0c;即页面访问量或点击量&#xff0c;用户每访问网站的一个…

d2l_第九章_RNN循环神经网络

x.1 Sequence model 经过前面的学习&#xff0c;我们已知数据大于算法。而以数据为驱动的前提下&#xff0c;我们提出了各种模型。为了适配表格数据&#xff0c;提出了MLP&#xff1b;为了适配图像数据提出了CNN&#xff1b;而对了适配序列数据&#xff0c;我们提出了RNN。 目…

C++笔记之call_once和once_flag

C笔记之call_once和once_flag code review! 文章目录 C笔记之call_once和once_flag1.call_once和once_flag2.std::call_once和单例模式 1.call_once和once_flag 2.std::call_once和单例模式

音频格式转换怎么操作?分享这几个MP3转换器给大家!

有一个名叫小灵的音乐爱好者&#xff0c;对音乐充满热情&#xff0c;每天都沉浸在动听的旋律中&#xff0c;借助耳机享受音乐的魅力。然而&#xff0c;最近她遇到了一个问题&#xff1a;她手头有一些喜欢的音乐文件&#xff0c;但却无法在自己的音乐播放器上播放&#xff0c;这…

【C++】C++教程、学习笔记

文章目录 一、C基础入门1 C初识1.1 第一个C程序1.1.1 创建项目1.1.2 创建文件1.1.3 编写代码1.1.4 运行程序 1.2 注释1.3 变量1.4 常量1.5 关键字1.6 标识符命名规则 2 数据类型2.1 整型2.2 sizeof关键字2.3 实型&#xff08;浮点型&#xff09;2.4 字符型2.5 转义字符2.6 字符…