基于Python开发的智能停车场车牌识别计费系统(源码+可执行程序+程序配置说明书+程序使用说明书)

简介: 基于Python开发的智能停车场车牌识别计费系统(源码+可执行程序+程序配置说明书+程序使用说明书)

一、项目简介

本项目是一套基于Python开发的智能停车场车牌识别计费系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。

包含:项目源码、项目文档等,该项目附带全部源码可作为毕设使用。

项目都经过严格调试,确保可以运行!

二、开发环境要求

本系统的软件开发及运行环境具体如下。

操作系统:Windows 7、Windows 10。

Python版本:Python 3.7。

开发工具:PyCharm 2018。

Python内置模块:os、time、datetime。

第三方模块:opencv-python、pandas、matplotlib、pygame、baidu-aip、xlrd。

注意:在使用第三方模块时,首先需要使用pip install命令安装该模块,例如,安装pygame模块,可以在Python命令窗口中执行以下命令:

pip install pygame

三、系统功能

在PyCharm中运行《智能停车场车牌识别计费系统》即可进入如图1所示的系统主界面。

说明:在运行程序前,先将当前的计算机连接互联网,并且需要先申请百度AI开放平台的图片识别需要的Key,并且复制该Key到项目根目录下的file子目录的key.txt文件中替换相应的内容即可。替换时需要注意不要把原来的单引号删除。

具体的操作步骤如下:

(1)识别车牌,并实现车辆入场和出场。当有车辆的车头或车尾对准摄像头后,管理员单击“识别”按钮,系统将识别该车牌,并且根据车牌判断入场或出场,显示不同信息。车辆入场时效果如图2所示,车辆驶出时效果如图3所示。

(2)收入统计。单击“收入统计”按钮,系统会根据车辆进出记录汇总出一个的收入信息,并且通过柱型图显示出来,效果如图4所示。

(3)满预警。系统会根据以往的数据自动判断一周中的哪一天会出现车位紧张的情况,从而在前一天给出预警提示,方便管理员提前做好调度,效果如图5所示。

四、部分代码展示

# !/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import pandas as pd
from pandas import DataFrame
import matplotlib.pyplot as plt
import pygame
import time
import os
import ocrutil
import btn
import timeutil
# 定义颜色
BLACK = ( 0, 0, 0)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
BLUE = (0, 120, 215)
GRAY = (96,96,96)
RED = (220,20,60)
YELLOW = (255,255,0)
DARKBLUE = (73, 119, 142)
BG = DARKBLUE  # 指定背景颜色
#信息内容
txt1=''
txt2=''
txt3=''
# 窗体大小
size = 1000, 484
# 设置帧率(屏幕每秒刷新的次数)
FPS = 60
# 一共有多少车位
Total =100
# 月收入统计分析界面开关
income_switch=False
# 获取文件的路径
cdir = os.getcwd()
# 文件路径
path=cdir+'/datafile/'
# 读取路径
if not os.path.exists(path):
    # 根据路径建立文件夹
    os.makedirs(path)
    # 车牌号 日期 时间 价格 状态
    carnfile = pd.DataFrame(columns=['carnumber', 'date', 'price', 'state'])
    # 生成xlsx文件
    carnfile.to_excel(path+'停车场车辆表' + '.xlsx', sheet_name='data')
    carnfile.to_excel(path+'停车场信息表' + '.xlsx', sheet_name='data')
# 读取文件内容
pi_table = pd.read_excel(path+'停车场车辆表.xlsx', sheet_name='data')
pi_info_table = pd.read_excel(path+'停车场信息表.xlsx', sheet_name='data')
# 停车场车辆
cars = pi_table[['carnumber', 'date', 'state']].values
# 已进入车辆数量
carn =len(cars)
# pygame初始化
pygame.init()
# 设置窗体名称
pygame.display.set_caption('智能停车场车牌识别计费系统')
# 图标
ic_launcher = pygame.image.load('file/ic_launcher.png')
# 设置图标
pygame.display.set_icon(ic_launcher)
# 设置窗体大小
screen=pygame.display.set_mode(size)
# 设置背景颜色
screen.fill(BG)
try:
    cam = cv2.VideoCapture(0)
except:
    print('请连接摄像头')
# 背景文图案
def text0(screen):
    # 底色
    pygame.draw.rect(screen, BG, (650, 2, 350, 640))
    # 绘制横线
    pygame.draw.aaline(screen, GREEN, (662, 50), (980, 50), 1)
    # 绘制信息矩形框
    pygame.draw.rect(screen, GREEN, (650, 350, 342,85),1)
    # 使用系统字体
    xtfont = pygame.font.SysFont('SimHei', 15)
    # 重新开始按钮
    textstart = xtfont.render('信息', True, GREEN)
    # 获取文字图像位置
    text_rect = textstart.get_rect()
    # 设置文字图像中心点
    text_rect.centerx = 675
    text_rect.centery = 365
    # 绘制内容
    screen.blit(textstart, text_rect)
    cars = pi_table[['carnumber', 'date', 'state']].values
    if len(cars)>0:
        longcar=cars[0][0]
        cartime =cars[0][1]
        # 使用系统字体
        xtfont = pygame.font.SysFont('SimHei', 15)
        # 转换当前时间 2018-12-11 16:18
        localtime = time.strftime('%Y-%m-%d %H:%M', time.localtime())
        htime = timeutil.DtCalc(cartime, localtime)
        # 重新开始按钮
        textscar = xtfont.render('停车时间最长车辆:'+str(longcar), True, RED)
        texttime = xtfont.render("已停车:" + str(htime) + '小时', True, RED)
        # 获取文字图像位置
        text_rect1 = textscar.get_rect()
        text_rect2 = texttime.get_rect()
        # 设置文字图像中心点
        text_rect1.centerx = 820
        text_rect1.centery = 320
        text_rect2.centerx = 820
        text_rect2.centery = 335
        # 绘制内容
        screen.blit(textscar, text_rect1)
        screen.blit(texttime, text_rect2)
        pass
# 车位文字
def text1(screen):
    # 剩余车位
    k =Total - carn
    if k<10:
        # 剩余车位
        sk='0'+str(k)
    else:
        sk =str(k)
    # 使用系统字体
    xtfont = pygame.font.SysFont('SimHei', 20)
    # 重新开始按钮
    textstart = xtfont.render('共有车位:'+str(Total)+'  剩余车位:'+sk, True,WHITE)
    # 获取文字图像位置
    text_rect = textstart.get_rect()
    # 设置文字图像中心点
    text_rect.centerx =820
    text_rect.centery =30
    # 绘制内容
    screen.blit(textstart, text_rect)
# 停车场信息表头
def text2(screen):
    # 使用系统字体
    xtfont = pygame.font.SysFont('SimHei', 15)
    # 重新开始按钮
    textstart = xtfont.render('  车号       时间    ', True,WHITE)
    # 获取文字图像位置
    text_rect = textstart.get_rect()
    # 设置文字图像中心点
    text_rect.centerx =820
    text_rect.centery =70
    # 绘制内容
    screen.blit(textstart, text_rect)
    pass
# 停车场车辆信息
def text3(screen):
    # 使用系统字体
    xtfont = pygame.font.SysFont('SimHei', 12)
    # 获取文档表信息
    cars = pi_table[['carnumber', 'date', 'state']].values
    # 页面就绘制10辆车信息
    if len(cars) > 10:
        cars = pd.read_excel(path + '停车场车辆表.xlsx', skiprows=len(cars) - 10, sheet_name='data').values
    # 动态绘制y点变量
    n=0
    # 循环文档信息
    for car in cars:
        n+=1
        # 车辆车号 车辆进入时间
        textstart = xtfont.render( str(car[0])+'   '+str(car[1]), True, WHITE)
        # 获取文字图像位置
        text_rect = textstart.get_rect()
        # 设置文字图像中心点
        text_rect.centerx = 820
        text_rect.centery = 70+20*n
        # 绘制内容
        screen.blit(textstart, text_rect)
    pass
# 历史信息 满预警信息
def text4(screen,txt1,txt2,txt3):
    # 使用系统字体
    xtfont = pygame.font.SysFont('SimHei', 15)
    texttxt1 = xtfont.render(txt1, True, GREEN)
    # 获取文字图像位置
    text_rect = texttxt1.get_rect()
    # 设置文字图像中心点
    text_rect.centerx = 820
    text_rect.centery = 355+20
    # 绘制内容
    screen.blit(texttxt1, text_rect)
    texttxt2 = xtfont.render(txt2, True, GREEN)
    # 获取文字图像位置
    text_rect = texttxt2.get_rect()
    # 设置文字图像中心点
    text_rect.centerx = 820
    text_rect.centery = 355+40
    # 绘制内容
    screen.blit(texttxt2, text_rect)
    texttxt3 = xtfont.render(txt3, True, GREEN)
    # 获取文字图像位置
    text_rect = texttxt3.get_rect()
    # 设置文字图像中心点
    text_rect.centerx = 820
    text_rect.centery = 355+60
    # 绘制内容
    screen.blit(texttxt3, text_rect)
    # 满预警
    kcar = pi_info_table[pi_info_table['state'] == 2]
    kcars = kcar['date'].values
    # 周标记 0代表周一
    week_number=0
    for k in kcars:
        week_number=timeutil.get_week_numbeer(k)
    # 转换当前时间 2018-12-11 16:18
    localtime = time.strftime('%Y-%m-%d %H:%M', time.localtime())
    # 根据时间返回周标记 0代表周一
    week_localtime=timeutil.get_week_numbeer(localtime)
    if week_number ==0:
        if week_localtime==6 :
            text6(screen,'根据数据分析,明天可能出现车位紧张的情况,请提前做好调度!')
        elif week_localtime==0:
            text6(screen,'根据数据分析,今天可能出现车位紧张的情况,请做好调度!')
    else:
        if week_localtime+1==week_number:
            text6(screen, '根据数据分析,明天可能出现车位紧张的情况,请提前做好调度!')
        elif week_localtime==week_number:
            text6(screen, '根据数据分析,今天可能出现车位紧张的情况,请做好调度!')
    pass
# 收入统计
def text5(screen):
    # 计算price列 和
    sum_price = pi_info_table['price'].sum()
    # print(str(sum_price) + '元')
    # 使用系统字体
    xtfont = pygame.font.SysFont('SimHei', 20)
    # 重新开始按钮
    textstart = xtfont.render('共计收入:' + str(int(sum_price)) + '元', True, WHITE)
    # 获取文字图像位置
    text_rect = textstart.get_rect()
    # 设置文字图像中心点
    text_rect.centerx = 1200
    text_rect.centery = 30
    # 绘制内容
    screen.blit(textstart, text_rect)
    # 加载图像
    image = pygame.image.load('file/income.png')
    # 设置图片大小
    image = pygame.transform.scale(image, (390, 430))
    # 绘制月收入图表
    screen.blit(image, (1000,50))
# 显示满预警提示内容
def text6(screen,week_info):
    pygame.draw.rect(screen, YELLOW, ((2, 2), (640, 40)))
    xtfont = pygame.font.SysFont('SimHei', 22)
    textweek_day = xtfont.render(week_info, True, RED)
    # 获取文字图像位置
    text_rectw = textweek_day.get_rect()
    # 设置文字图像中心点
    text_rectw.centerx = 322
    text_rectw.centery = 20
    # 绘制内容
    screen.blit(textweek_day, text_rectw)
# 游戏循环帧率设置
clock = pygame.time.Clock()
# 主线程
Running =True
while Running:
    # 从摄像头读取图片
    sucess, img = cam.read()
    # 保存图片,并退出。
    cv2.imwrite('file/test.jpg', img)
    # 加载图像
    image = pygame.image.load('file/test.jpg')
    # 设置图片大小
    image = pygame.transform.scale(image, (640, 480))
    # 绘制视频画面
    screen.blit(image, (2,2))
    # 背景文字图案
    text0(screen)
    # 停车位信息
    text1(screen)
    # 停车场信息表头
    text2(screen)
    # 停车场车辆信息
    text3(screen)
    # 提示信息
    text4(screen, txt1, txt2, txt3)
    # 创建识别按钮
    button_go = btn.Button(screen, (640, 480), 150, 60, BLUE, WHITE, "识别", 25)
    # 绘制创建的按钮
    button_go.draw_button()
    # 创建分析按钮
    button_go1 = btn.Button(screen, (990, 480), 100, 40, RED, WHITE, "收入统计", 18)
    # 绘制创建的按钮
    button_go1.draw_button()
    # 判断是否开启了收入统计按钮
    if income_switch:
        # 开启时候绘制页面
        text5(screen)
        pass
    else:
        pass
    for event in pygame.event.get():
        # 关闭页面游戏退出
        if event.type == pygame.QUIT:
            # 退出
            pygame.quit()
            # 关闭摄像头
            cam.release()
            exit()
        #判断点击
        elif event.type == pygame.MOUSEBUTTONDOWN:
            # 输出鼠标点击位置
            print(str(event.pos[0])+':'+str(event.pos[1]))
            # 判断是否点击了收入统计按钮位置
            # 收入统计按钮
            if 890 <= event.pos[0] and event.pos[0] <= 990 \
                    and 440 <= event.pos[1] and event.pos[1] <= 480:
                print('分析统计按钮')
                if income_switch:
                    income_switch = False
                    # 设置窗体大小
                    size  = 1000, 484
                    screen = pygame.display.set_mode(size)
                    screen.fill(BG)
                else:
                    income_switch = True
                    # 设置窗体大小
                    size  = 1400, 484
                    screen = pygame.display.set_mode(size)
                    screen.fill(BG)
                    attr = ['1月', '2月', '3月', '4月', '5月',
                            '6月', '7月', '8月', '9月', '10月', '11月', '12月']
                    v1 = []
                    # 循环添加数据
                    for i in range(1, 13):
                        k = i
                        if i < 10:
                            k = '0' + str(k)
                        #筛选每月数据
                        kk = pi_info_table[pi_info_table['date'].str.contains('2019-' + str(k))]
                        # 计算价格和
                        kk = kk['price'].sum()
                        v1.append(kk)
                    # 设置字体可以显示中文
                    plt.rcParams['font.sans-serif'] = ['SimHei']
                    # 设置生成柱状图图片大小
                    plt.figure(figsize=(3.9, 4.3))
                    # 设置柱状图属性 attr为x轴内容 v1为x轴内容相对的数据
                    plt.bar(attr, v1, 0.5, color="green")
                    # 设置数字标签
                    for a, b in zip(attr, v1):
                        plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=7)
                    # 设置柱状图标题
                    plt.title("每月收入统计")
                    # 设置y轴范围
                    plt.ylim((0, max(v1) + 50))
                    # 生成图片
                    plt.savefig('file/income.png')
                pass
            # 判断是否点击了识别按钮位置
            #识别按钮
            if 492<=event.pos[0] and event.pos[0]<=642 and 422<=event.pos[1] and event.pos[1]<=482:
                print('点击识别')
                try:
                    # 获取车牌
                    carnumber=ocrutil.getcn()
                    # 转换当前时间 2018-12-11 16:18
                    localtime = time.strftime('%Y-%m-%d %H:%M', time.localtime())
                    # 获取车牌号列数据
                    carsk = pi_table['carnumber'].values
                    # 判断当前识别得车是否为停车场车辆
                    if carnumber in carsk:
                        txt1='车牌号: '+carnumber
                        # 时间差
                        y=0
                        # 获取行数用
                        kcar=0
                        # 获取文档内容
                        cars = pi_table[['carnumber', 'date', 'state']].values
                        # 循环数据
                        for car in cars:
                            # 判断当前车辆根据当前车辆获取时间
                            if carnumber ==car[0]:
                                # 计算时间差 0,1,2...
                                y = timeutil.DtCalc(car[1], localtime)
                                break
                            #行数+1
                            kcar = kcar + 1
                        #判断停车时间 如果时间
                        if y==0:
                            y=1
                        txt2='停车费:'+str(3*y)+'元'
                        txt3='出停车场时间:'+localtime
                        # 删除停车场车辆表信息
                        pi_table=pi_table.drop([kcar],axis = 0)
                        # 更新停车场信息
                        pi_info_table=pi_info_table.append({'carnumber': carnumber,
                                                            'date': localtime,
                                                            'price':3*y,
                                                            'state': 1}, ignore_index=True)
                        # #保存信息更新xlsx文件
                        DataFrame(pi_table).to_excel(path + '停车场车辆表' + '.xlsx',
                                                     sheet_name='data', index=False, header=True)
                        DataFrame(pi_info_table).to_excel(path + '停车场信息表' + '.xlsx',
                                                          sheet_name='data', index=False, header=True)
                        # 停车场车辆
                        carn -= 1
                    else:
                        if carn <=Total:
                           # 添加信息到文档 ['carnumber', 'date', 'price', 'state']
                           pi_table=pi_table.append({'carnumber': carnumber,
                                                     'date': localtime ,
                                                     'state': 0}, ignore_index=True)
                           # 更新xlsx文件
                           DataFrame(pi_table).to_excel(path + '停车场车辆表' + '.xlsx',
                                                        sheet_name='data', index=False, header=True)
                           if carn<Total:
                               # state等于0得时候为 停车场有车位进入停车场
                               pi_info_table = pi_info_table.append({'carnumber': carnumber,
                                                                     'date': localtime,
                                                                     'state': 0}, ignore_index=True)
                               # 车辆数量+1
                               carn += 1
                           else:
                               # state等于2得时候为 停车场没有车位的时候
                               pi_info_table = pi_info_table.append({'carnumber': carnumber,
                                                                     'date': localtime,
                                                                     'state': 2}, ignore_index=True)
                           DataFrame(pi_info_table).to_excel(path + '停车场信息表' + '.xlsx',
                                                             sheet_name='data', index=False,header=True)
                           ...............................此处省略

五、源码地址

https://download.csdn.net/download/weixin_43860634/88335364


相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
90 55
|
23天前
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品安全追溯系统的深度学习模型
使用Python实现智能食品安全追溯系统的深度学习模型
50 4
|
12天前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
82 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
13天前
|
机器学习/深度学习 算法 前端开发
基于Python深度学习的果蔬识别系统实现
果蔬识别系统,主要开发语言为Python,基于TensorFlow搭建ResNet卷积神经网络算法模型,通过对12种常见的果蔬('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜')图像数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django框架搭建Web网页端可视化操作界面,以下为项目实现介绍。
24 4
基于Python深度学习的果蔬识别系统实现
|
13天前
|
IDE 程序员 开发工具
Python编程入门:打造你的第一个程序
迈出编程的第一步,就像在未知的海洋中航行。本文是你启航的指南针,带你了解Python这门语言的魅力所在,并手把手教你构建第一个属于自己的程序。从安装环境到编写代码,我们将一步步走过这段旅程。准备好了吗?让我们开始吧!
|
19天前
|
JSON 开发工具 git
基于Python和pygame的植物大战僵尸游戏设计源码
本项目是基于Python和pygame开发的植物大战僵尸游戏,包含125个文件,如PNG图像、Python源码等,提供丰富的游戏开发学习素材。游戏设计源码可从提供的链接下载。关键词:Python游戏开发、pygame、植物大战僵尸、源码分享。
|
23天前
|
存储 人工智能 数据挖掘
Python编程入门:打造你的第一个程序
本文旨在为初学者提供Python编程的初步指导,通过介绍Python语言的基础概念、开发环境的搭建以及一个简单的代码示例,帮助读者快速入门。文章将引导你理解编程思维,学会如何编写、运行和调试Python代码,从而开启编程之旅。
36 2
|
26天前
|
Python
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
在Python中,`try...except`语句用于捕获和处理程序运行时的异常
41 5
|
24天前
|
存储 Python
Python编程入门:理解基础语法与编写简单程序
本文旨在为初学者提供一个关于如何开始使用Python编程语言的指南。我们将从安装Python环境开始,逐步介绍变量、数据类型、控制结构、函数和模块等基本概念。通过实例演示和练习,读者将学会如何编写简单的Python程序,并了解如何解决常见的编程问题。文章最后将提供一些资源,以供进一步学习和实践。
32 1
|
12天前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!