智能停车场车牌识别系统(二)

在上一篇文章实现车牌识别功能的基础上,加入了实现收入统计功能和满预警功能
看这篇文章之前请先完成 智能停车场车牌识别系统(一) 的阅读

实现收入统计功能:

收入统计就是对停车场每个月的收入进行统计,然后绘制柱状图,使得更直观的了解停车场的收入情况。实现收入统计功能分为三个步骤:

1.创建收入统计按钮,绘制到界面上

btn.py按钮模块的代码在上一篇文章已经实现,所以在这里只需要在创建“识别”按钮的代码后面再加一个创建“收入统计”按钮的代码:

#创建识别按钮
btn.Button(screen,(640,480),150,60,BLUE,WHITE,"识别",25)
#创建收入统计按钮
btn.Button(screen,(990,480),100,40,RED,WHITE,"收入统计",18)

2.创建收入统计柱状图,生成图片(matplotlib.pyplot模块)

根据 停车场信息表.xlsx 文件里面的内容生成柱状图图片,主要包括:

  1. 计算每个月的收入总和
  2. 设置柱状图的字体以及生成的柱状图图片的大小
  3. 设置柱状图属性,x轴为月份,每个月的收入总和为x轴内容相对的数据
  4. 设置柱状图标题,以及y轴的范围
  5. 生成柱状图图片

关键代码如下:

#收入统计按钮
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=1500,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('2020-'+str(k))]  #筛选每月数据
            kk=kk['price'].sum()   #计算每月的价格和
            v1.append(kk)
        print(v1)

        plt.rcParams['font.sans-serif']=['SimHei']  #设置字体可以显示中文
        plt.figure(figsize=(3.9,4.3))  #设置生成柱状图图片大小
        plt.bar(attr,v1,0.5,color='green')  #设置柱状图属性,attr为x轴内容,v1为x轴内容相对的数据
        #设置数字标签
        for a,b in zip(attr,v1):
            plt.text(a,b,'%.0f'%b,ha='center',va='bottom',fontsize=7)
        plt.title('每月收入统计')  #设置柱状图标题
        plt.ylim((0,max(v1)+50))  #设置y轴范围
        plt.savefig('file/income.png')  #生成图片

3.创建text8()方法,在点击了“收入统计”按钮之后,加载柱状图图片以及总收入

# 收入统计
def text8(screen):
    # 计算price列的和
    sum_price=pi_info_table['price'].sum()

    # 使用系统字体
    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))

main.py文件整体代码展示如下:

import time

import pygame

import pandas as pd
from pandas import DataFrame
import os
import cv2

import btn
import ocrutil
import timeutil
import matplotlib.pyplot as plt

size=1000,484              # 窗体大小
FPS=60                     # 设置帧率(屏幕每秒的刷新次数)
# 设置背景颜色
DARKBLUE=(73,119,142)
BG=DARKBLUE
#定义颜色
BLAK=(0,0,0)
WHITE=(255,255,255)
GREEN=(0,255,0)
BLUE=(72,61,139)
GRAY=(96,96,96)
RED=(220,20,60)
YELLOW=(255,255,0)

#信息内容
txt1=''
txt2=''
txt3=''

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)



# 1.初始化
pygame.init()
# 2.设置窗体名称
pygame.display.set_caption('智能停车场车牌识别计费系统')
# 3.加载图片,设置图标
ic_launcher=pygame.image.load('file/ic_launcher.jpg')
pygame.display.set_icon(ic_launcher)
# 4.设置窗体大小、背景颜色
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)  # 绘制内容


#车位文字
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)  # 绘制内容


#停车场车辆信息
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
    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)


#最长停放的车辆和时间
def text4(screen):
    cars = pi_table[['carnumber', 'date', 'state']].values
    #print(len(cars))
    if len(cars)>0:
        longcar=cars[0][0]
        cartime=cars[0][1]
        #print(cartime)
        xtfont=pygame.font.SysFont('SimHei',15)
        #转换当前时间2020-8-5 19:07
        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)

#在信息框中显示信息
def text5(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)


# 收入统计
def text8(screen):
    # 计算price列的和
    sum_price=pi_info_table['price'].sum()

    # 使用系统字体
    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))


# 游戏循环帧率设置(控制程序运行时间)
clock=pygame.time.Clock()

# 主线程
while True:

    # 从摄像头读取图片
    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)  # 最长停放的车辆和时间
    text5(screen, txt1, txt2, txt3)  # 在信息框中显示信息

    # 创建识别按钮
    btn.Button(screen, (640, 480), 150, 60, BLUE, WHITE, "识别", 25)
    # 创建收入统计按钮
    btn.Button(screen, (990, 480), 100, 40, RED, WHITE, "收入统计", 18)

    if income_switch:
        text8(screen)

    for event in pygame.event.get():
        # 关闭页面游戏退出
        if event.type==pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type==pygame.MOUSEBUTTONDOWN:
            print(str(event.pos[0])+':'+str(event.pos[1]))
            # 识别按钮
            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()  # 获取识别的车牌号
                    # 格式化当前时间
                    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]:
                                y = timeutil.DtCalc(car[1], localtime)  # 计算时间差,停车时间
                                break
                            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:
                        # print('输出:'+str(carn))
                        if carn < Total:
                            # 添加车辆信息
                            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 - 1:
                                # state=2表示停车场没有车位
                                pi_info_table = pi_info_table.append({'carnumber': carnumber,
                                                                      'date': localtime,
                                                                      'state': 2}, ignore_index=True)
                            else:
                                # state=0表示停车场还有车位
                                pi_info_table = pi_info_table.append({'carnumber': carnumber,
                                                                      'date': localtime,
                                                                      'state': 0}, ignore_index=True)
                            carn += 1
                            DataFrame(pi_info_table).to_excel(path + '停车场信息表.xlsx',
                                                              sheet_name='data', index=False, header=True)
                            # 有停车位的提示信息
                            txt1 = '车牌号:' + carnumber
                            txt2 = '有空余车位,可以进入停车场'
                            txt3 = '进停车场时间:' + localtime
                        else:
                            # 没有停车位的提示信息
                            txt1 = '车牌号:' + carnumber
                            txt2 = '没有空余车位,不可以进入停车场'
                            txt3 = '时间:' + localtime

                except Exception as e:
                    print('错误原因:', e)
                    continue
                pass

            # 收入统计按钮
            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 = 1500, 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('2020-' + str(k))]  # 筛选每月数据
                        kk = kk['price'].sum()  # 计算每月的价格和
                        v1.append(kk)
                    print(v1)

                    plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置字体可以显示中文
                    plt.figure(figsize=(3.9, 4.3))  # 设置生成柱状图图片大小
                    plt.bar(attr, v1, 0.5, color='green')  # 设置柱状图属性,attr为x轴内容,v1为x轴内容相对的数据
                    # 设置数字标签
                    for a, b in zip(attr, v1):
                        plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=7)
                    plt.title('每月收入统计')  # 设置柱状图标题
                    plt.ylim((0, max(v1) + 50))  # 设置y轴范围
                    plt.savefig('file/income.png')  # 生成图片

    pygame.display.flip()        # 更新界面
    clock.tick(FPS)              # 控制游戏最大帧率为60


运行效果如图:
在这里插入图片描述

实现满预警功能:

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

  1. 创建text6()方法,读取 停车场信息表.xlsx 文档信息,根据state字段(state=2表示停车场车辆满了)判断离现在最近的停车场车辆满预警是星期几(调用timeutil.py的get_week_numbeer()方法),在下个相同的星期几的提前一天进行满预警提示
  2. 创建text7()方法,显示满预警提示内容

main.py文件代码如下:

import time

import pandas as pd
import pygame
import cv2

from pandas import DataFrame
import os

import btn
import ocrutil
import timeutil
import matplotlib.pyplot as plt

size=1000,484                  # 窗体大小
FPS=60                         # 设置帧率(屏幕每秒的刷新次数)
#设置背景颜色
DARKBLUE=(73,119,142)
BG=DARKBLUE
#定义颜色
BLAK=(0,0,0)
WHITE=(255,255,255)
GREEN=(0,255,0)
BLUE=(72,61,139)
GRAY=(96,96,96)
RED=(220,20,60)
YELLOW=(255,255,0)
#信息内容
txt1=''
txt2=''
txt3=''

Total =100            # 一共有多少车位
income_switch=False  # 月收入统计分析界面开关

#获取文件的路径
cdir=os.getcwd()
#print(cdir)
#文件路径
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')
#print(pi_table)
pi_info_table=pd.read_excel(path+'停车场信息表.xlsx', sheet_name='data')
cars=pi_table[['carnumber','date','state']].values #停车场车辆
#print(cars)
carn=len(cars) # 已进入停车场数量
#print('总数量:'+str(carn))


pygame.init()                                                  # 初始化
pygame.display.set_caption('智能停车场车牌识别计费系统')        # 设置窗体名称

ic_launcher=pygame.image.load('file/ic_launcher.jpg')          # 加载图片
pygame.display.set_icon(ic_launcher)                           # 设置图标

screen=pygame.display.set_mode(size)                           # 设置窗体大小
screen.fill(BG)                                                # 设置背景颜色

try:
    cam=cv2.VideoCapture(0) # 创建摄像头实例
    #print(cam.isOpened())
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)  # 绘制内容


#车位文字
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)  # 绘制内容


#停车场车辆信息
def text3(screen):
    xtfont=pygame.font.SysFont('SimHei',12)
    cars = pi_table[['carnumber', 'date', 'state']].values  # 获取停车场车辆信息
    if len(cars)>10:  # 页面绘制10辆车信息
        cars=pd.read_excel(path+'停车场车辆表.xlsx',skiprows=len(cars)-10,sheet_name='data').values
    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)


#最长停放的车辆和时间
def text4(screen):
    cars = pi_table[['carnumber', 'date', 'state']].values
    #print(len(cars))
    if len(cars)>0:
        longcar=cars[0][0]
        cartime=cars[0][1]
        #print(cartime)
        xtfont=pygame.font.SysFont('SimHei',15)
        #转换当前时间2020-8-5 19:07
        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)

#在信息框中显示信息
def text5(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)


#满预警
def text6(screen):
    # state=2表示当时停车场满了
    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_number(k)
    # 转换当前时间
    localtime=time.strftime('%Y-%m-%d %H:%M',time.localtime())
    # 根据时间返回周标记 0代表周一
    week_localtime=timeutil.get_week_number(localtime)

    if week_number==0:  # 特殊情况
        if week_number==6:
            text7(screen,'根据数据分析,明天可能出现车位紧张的情况,请提前做好调度!')
        elif week_localtime==0:
            text7(screen, '根据数据分析,今天可能出现车位紧张的情况,请做好调度!')
    else:
        if week_localtime+1==week_number:
            text7(screen, '根据数据分析,明天可能出现车位紧张的情况,请提前做好调度!')
        elif week_localtime==week_number:
            text7(screen, '根据数据分析,今天可能出现车位紧张的情况,请做好调度!')

#显示满预警提示内容
def text7(screen,week_info):
    pygame.draw.rect(screen,YELLOW,((2,2),(640,40)))

    xtfont = pygame.font.SysFont('SimHei', 15)
    textweek_day=xtfont.render(week_info,True,RED)
    text_rect=textweek_day.get_rect()
    text_rect.centerx=322
    text_rect.centery=20
    screen.blit(textweek_day,text_rect)

# 收入统计
def text8(screen):
    # 计算price列的和
    sum_price=pi_info_table['price'].sum()

    # 使用系统字体
    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))


clock=pygame.time.Clock() #游戏循环帧率设置

#执行死循环,确保窗口一直显示
while True:

    sucess,img=cam.read() #从摄像头读取图片
    #print(sucess)
    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)  #最长停放的车辆和时间
    text5(screen, txt1, txt2, txt3)  #在信息框中显示信息
    text6(screen)  #满预警


    #创建识别按钮
    btn.Button(screen,(640,480),150,60,BLUE,WHITE,"识别",25)
    #创建收入统计按钮
    btn.Button(screen,(990,480),100,40,RED,WHITE,"收入统计",18)

    if income_switch:
        text8(screen)

    for event in pygame.event.get():
        #关闭页面游戏退出
        if event.type==pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type==pygame.MOUSEBUTTONDOWN:
            print(str(event.pos[0])+':'+str(event.pos[1]))
            #识别按钮
            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()  #获取识别的车牌号
                    #格式化当前时间
                    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]:
                                y=timeutil.DtCalc(car[1],localtime)  #计算时间差,停车时间
                                break
                            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:
                        #print('输出:'+str(carn))
                        if carn<Total:
                            #添加车辆信息
                            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-1:
                                #state=0表示停车场还有车位
                                pi_info_table = pi_info_table.append({'carnumber': carnumber,
                                                                      'date': localtime,
                                                                      'state': 2}, ignore_index=True)
                            else:
                                # state=2表示停车场没有车位
                                pi_info_table = pi_info_table.append({'carnumber': carnumber,
                                                                      'date': localtime,
                                                                      'state': 0}, ignore_index=True)
                            carn += 1
                            DataFrame(pi_info_table).to_excel(path + '停车场信息表.xlsx',
                                                              sheet_name='data', index=False, header=True)
                            #有停车位的提示信息
                            txt1='车牌号:'+carnumber
                            txt2='有空余车位,可以进入停车场'
                            txt3='进停车场时间:'+localtime
                        else:
                            # 没有停车位的提示信息
                            txt1 = '车牌号:' + carnumber
                            txt2 = '没有空余车位,不可以进入停车场'
                            txt3 = '时间:' + localtime

                except Exception as e:
                    print('错误原因:',e)
                    continue
                pass

            #收入统计按钮
            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=1500,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('2020-'+str(k))]  #筛选每月数据
                        kk=kk['price'].sum()   #计算每月的价格和
                        v1.append(kk)
                    print(v1)

                    plt.rcParams['font.sans-serif']=['SimHei']  #设置字体可以显示中文
                    plt.figure(figsize=(3.9,4.3))  #设置生成柱状图图片大小
                    plt.bar(attr,v1,0.5,color='green')  #设置柱状图属性,attr为x轴内容,v1为x轴内容相对的数据
                    #设置数字标签
                    for a,b in zip(attr,v1):
                        plt.text(a,b,'%.0f'%b,ha='center',va='bottom',fontsize=7)
                    plt.title('每月收入统计')  #设置柱状图标题
                    plt.ylim((0,max(v1)+50))  #设置y轴范围
                    plt.savefig('file/income.png')  #生成图片


    pygame.display.flip() #更新界面
    clock.tick(FPS) #控制游戏最大帧率为60
#关闭摄像头
cam.release()

一下就拉长了篇幅!

timeutil.py代码如下:

import datetime

#计算停车时间四舍五入
def DtCalc(stTime,edTime):
    st=datetime.datetime.strptime(stTime,"%Y-%m-%d %H:%M")
    ed=datetime.datetime.strptime(edTime,"%Y-%m-%d %H:%M")
    rtn=ed-st
    y=round(rtn.total_seconds()/60/60)
    return y

#返回星期几标记0代表星期一,1代表星期二   6代表星期天
def get_week_number(date):
    date = datetime.datetime.strptime(date,"%Y-%m-%d %H:%M")
    day = date.weekday()
    return day

运行效果如下:

在这里插入图片描述
由于之前停车场出现过明天车辆满的情况,所以今天会出现满预警的提示信息

转载请注明链接出处,谢谢!

自己完成的一个小项目,记录一下吧。

有什么问题或者需要源代码的,可以评论。我看到的就会回复!!!

  • 5
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值