我给小区物业写了个车牌自动识别系统,非常实用。物业给你免费停车一年!

 

 前言

       今天出门,出小区的时候发现停车杆没有反应,然后我就打电话让人来给我开杆!后来通过和物业人员聊天过程中,原来是车牌识别不了了。好像是坏了!这不是小事吗,我和物业说了一声,晚上我给你弄好!物业小姐姐硬要给我去申请奖金,没办法,拿了奖金就请物业小姐姐吃饭吧!

正文

     一起用Python的PyQt5开发一个车牌自动识别系统!

首先一起来看看最终实现的车牌识别系统效果图:在这里插入图片描述

下面,我们就开始介绍如何实现这款自动车牌识别系统。

一、核心功能设计

总体来说,我们首先要进行UI界面构建设计,根据车牌识别系统功能进行画面排版布局;其次我们的这款车牌识别系统的主要功能车辆图片读取识别显示、图片中车牌ROI区域获取、车牌识别结果输出显示。

对于结果输出显示,我们主要包含了读取图片名称、读取录入时间、识别车牌号码、识别车牌颜色、识别车牌所属地。最后我们还可以将车牌识别系统的数据信息导出本地存储。

拆解需求,大致可以整理出核心功能如下:

UI设计排版布局

  • 左侧区域进行识别信息显示,包含图片名称、读取录入时间、识别车牌号码、识别车牌颜色、识别车牌所属地信息
  • 右侧可以分成3个区域,顶部区域包含窗体最小化,最大化,关闭功能;中间区域显示读取车辆图片;底部区域包含车牌显示区域、图片读取、车牌信息存储功能
  • 车牌识别

    • 通过读取图片进行车牌区域提取输出
    • 车牌自动识别结果输出
  • 车牌信息显示存储

    • 根据自动识别结果对车牌各类信息显示
    • 对录入识别的车辆车牌识别信息存储

二、实现步骤

1. UI设计排版布局

根据车牌识别需要的功能,首先进行

UI布局设计

,我们这次还是使用的

pyqt5

。核心设计代码如下:

def setupUi(self, MainWindow):
    MainWindow.setObjectName("MainWindow")
    MainWindow.resize(1213, 670)
    MainWindow.setFixedSize(1213, 670)  # 设置窗体固定大小
    MainWindow.setToolButtonStyle(QtCore.Qt.ToolButtonIconOnly)
    self.centralwidget = QtWidgets.QWidget(MainWindow)
    self.centralwidget.setObjectName("centralwidget")
    self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea.setGeometry(QtCore.QRect(690, 40, 511, 460))
    self.scrollArea.setWidgetResizable(True)
    self.scrollArea.setObjectName("scrollArea")
    self.scrollAreaWidgetContents = QtWidgets.QWidget()
    self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 500, 489))
    self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
    self.label_0 = QtWidgets.QLabel(self.scrollAreaWidgetContents)
    self.label_0.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_0.setFont(font)
    self.label_0.setObjectName("label_0")
    self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents)
    self.label.setGeometry(QtCore.QRect(10, 40, 481, 420))
    self.label.setObjectName("label")
    self.label.setAlignment(Qt.AlignCenter)
    self.scrollArea.setWidget(self.scrollAreaWidgetContents)
    self.scrollArea_2 = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea_2.setGeometry(QtCore.QRect(10, 10, 671, 631))
    self.scrollArea_2.setWidgetResizable(True)
    self.scrollArea_2.setObjectName("scrollArea_2")
    self.scrollAreaWidgetContents_1 = QtWidgets.QWidget()
    self.scrollAreaWidgetContents_1.setGeometry(QtCore.QRect(0, 0, 669, 629))
    self.scrollAreaWidgetContents_1.setObjectName("scrollAreaWidgetContents_1")
    self.label_1 = QtWidgets.QLabel(self.scrollAreaWidgetContents_1)
    self.label_1.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_1.setFont(font)
    self.label_1.setObjectName("label_1")
    self.tableWidget = QtWidgets.QTableWidget(self.scrollAreaWidgetContents_1)
    self.tableWidget.setGeometry(QtCore.QRect(10, 40, 651, 581))  # 581))
    self.tableWidget.setObjectName("tableWidget")
    self.tableWidget.setColumnCount(5)
    self.tableWidget.setColumnWidth(0, 140)  # 设置1列的宽度
    self.tableWidget.setColumnWidth(1, 130)  # 设置2列的宽度
    self.tableWidget.setColumnWidth(2, 110)  # 设置3列的宽度
    self.tableWidget.setColumnWidth(3, 90)  # 设置4列的宽度
    self.tableWidget.setColumnWidth(4, 181)  # 设置5列的宽度
    self.tableWidget.setHorizontalHeaderLabels(["图片名称", "录入时间", "车牌号码", "车牌类型", "车牌信息"])
    self.tableWidget.setRowCount(self.RowLength)
    self.tableWidget.verticalHeader().setVisible(False)  # 隐藏垂直表头)
    self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
    self.tableWidget.raise_()
    self.scrollArea_2.setWidget(self.scrollAreaWidgetContents_1)
    self.scrollArea_3 = QtWidgets.QScrollArea(self.centralwidget)
    self.scrollArea_3.setGeometry(QtCore.QRect(690, 510, 341, 131))
    self.scrollArea_3.setWidgetResizable(True)
    self.scrollArea_3.setObjectName("scrollArea_3")
    self.scrollAreaWidgetContents_3 = QtWidgets.QWidget()
    self.scrollAreaWidgetContents_3.setGeometry(QtCore.QRect(0, 0, 339, 129))
    self.scrollAreaWidgetContents_3.setObjectName("scrollAreaWidgetContents_3")
    self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
    self.label_2.setGeometry(QtCore.QRect(10, 10, 111, 20))
    font = QtGui.QFont()
    font.setPointSize(11)
    self.label_2.setFont(font)
    self.label_2.setObjectName("label_2")
    self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents_3)
    self.label_3.setGeometry(QtCore.QRect(10, 40, 321, 81))
    self.label_3.setObjectName("label_3")
    self.scrollArea_3.setWidget(self.scrollAreaWidgetContents_3)
    self.scrollArea_4 = QtWidgets.QScrollArea(self.centralwidget)
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的停车收费系统,包括车辆进出记录、车牌识别和计算收费等功能。由于涉及到硬件设备(例如摄像头、扫描仪)和数据库操作等方面,具体实现可能需要根据实际情况进行调整和完善。 ```python import time import random class ParkingLot: def __init__(self): self.capacity = 100 # 停车场容量 self.free_space = 100 # 空闲车位 self.parked_cars = {} # 已停车辆记录,{车牌号: 时间戳} def enter(self, car): if self.free_space == 0: print('车位已满,无法进入') return if car.plate_number in self.parked_cars: print('该车辆已经在停车场内') return self.free_space -= 1 self.parked_cars[car.plate_number] = time.time() print(f'{car} 进入停车场') def exit(self, car): if car.plate_number not in self.parked_cars: print('该车辆不在停车场内') return enter_time = self.parked_cars[car.plate_number] exit_time = time.time() duration = int(exit_time - enter_time) // 60 # 停车时长,单位分钟 self.free_space += 1 del self.parked_cars[car.plate_number] fee = self.calculate_fee(duration) print(f'{car} 离开停车场,停车时长 {duration} 分钟,应缴纳停车费用 {fee} 元') def calculate_fee(self, duration): return duration * 0.1 # 停车费用计算规则:每分钟收费0.1元 class Car: def __init__(self, plate_number): self.plate_number = plate_number def __str__(self): return f'车牌号 {self.plate_number}' # 车辆识别系统 class PlateRecognition: def __init__(self): self.database = {} # 车牌号码和车主信息的数据库 def add_car(self, car): if car.plate_number in self.database: print('该车牌号已经存在') return owner = input(f'请输入车牌号 {car.plate_number} 的车主信息:') self.database[car.plate_number] = owner print(f'车牌号 {car.plate_number} 的车主信息已经添加到数据库中') def recognize(self): plate_number = input('请将车牌号码放入识别区域:') if plate_number not in self.database: print('该车辆未注册,请先添加车主信息') return None return Car(plate_number) # 主程序 if __name__ == '__main__': parking_lot = ParkingLot() plate_recognition = PlateRecognition() while True: print('请选择操作:1.进入停车场 2.离开停车场 3.添加车牌信息 4.退出程序') choice = input() if choice == '1': car = plate_recognition.recognize() if car: parking_lot.enter(car) elif choice == '2': car = plate_recognition.recognize() if car: parking_lot.exit(car) elif choice == '3': plate_number = input('请输入车牌号码:') car = Car(plate_number) plate_recognition.add_car(car) elif choice == '4': break else: print('无效的选择,请重新输入') ``` 这个停车收费系统采用 Python 语言编,包括两个类:`ParkingLot` 和 `Car`。`ParkingLot` 类表示停车场,包括停车位数量、已停车辆记录、进出车辆操作等方法;`Car` 类表示车辆,包括车牌号码等属性。此外,还有一个 `PlateRecognition` 类表示车辆识别系统,可以识别车牌并添加车牌信息到数据库中。 在主程序中,通过循环实现用户交互,支持四种操作:进入停车场、离开停车场、添加车牌信息和退出程序。用户选择进入或离开停车场时,会调用车辆识别系统进行车牌识别,然后调用停车场的相应方法进行进出操作。在离开停车场时,还需要计算停车费用并显示。车辆识别系统还支持添加车牌信息到数据库中,以便后续识别使用。 需要注意的是,该停车收费系统只是一个简单示例,实际应用中还需要进行更多的安全措施和优化。例如,可以加入车辆出入口的摄像头和自动支付功能,避免人工干预和排队等待;还可以加入车位预定和实时监控等功能,提高停车场的使用效率和用户体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值