2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 智能停车场车牌识别系统(二)

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

时间:2023-03-19 11:20:40

相关推荐

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

在上一篇文章实现车牌识别功能的基础上,加入了实现收入统计功能和满预警功能

看这篇文章之前请先完成 智能停车场车牌识别系统(一) 的阅读

实现收入统计功能:

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

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 文件里面的内容生成柱状图图片,主要包括:

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

关键代码如下:

#收入统计按钮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=Falsesize=1000,484screen=pygame.display.set_mode(size)screen.fill(BG)else:income_switch=Truesize=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=iif i<10:k='0'+str(k)kk=pi_info_table[pi_info_table['date'].str.contains('-'+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 = 1200text_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 timeimport pygameimport pandas as pdfrom pandas import DataFrameimport osimport cv2import btnimport ocrutilimport timeutilimport matplotlib.pyplot as pltsize=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=675text_rect.centery=365screen.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=820text_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 = 820text_rect.centery = 70screen.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').valuesn=0# 循环显示车辆信息for car in cars:n+=1textstart=xtfont.render(''+str(car[0])+' '+str(car[1]),True,WHITE) # 显示车号和进入时间text_rect=textstart.get_rect() # 获取文字图像位置# 设置文字图像中心点text_rect.centerx=820text_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)#转换当前时间-8-5 19:07localtime = 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 = 820text_rect1.centery = 320text_rect2.centerx = 820text_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=820text_rect.centery=355+20screen.blit(texttxt1,text_rect)texttxt2 = xtfont.render(txt2, True, GREEN)text_rect = texttxt2.get_rect()text_rect.centerx = 820text_rect.centery = 355 + 40screen.blit(texttxt2, text_rect)texttxt3 = xtfont.render(txt3, True, GREEN)text_rect = texttxt3.get_rect()text_rect.centerx = 820text_rect.centery = 355 + 60screen.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 = 1200text_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 = '车牌号: ' + carnumbery = 0 # 时间差kcar = 0 # 获取行数用# 获取车辆信息cars = pi_table[['carnumber', 'date', 'state']].valuesfor car in cars:if carnumber == car[0]:y = timeutil.DtCalc(car[1], localtime) # 计算时间差,停车时间breakkcar = kcar + 1if y == 0:y = 1txt2 = '停车费: ' + 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 += 1DataFrame(pi_info_table).to_excel(path + '停车场信息表.xlsx',sheet_name='data', index=False, header=True)# 有停车位的提示信息txt1 = '车牌号:' + carnumbertxt2 = '有空余车位,可以进入停车场'txt3 = '进停车场时间:' + localtimeelse:# 没有停车位的提示信息txt1 = '车牌号:' + carnumbertxt2 = '没有空余车位,不可以进入停车场'txt3 = '时间:' + localtimeexcept Exception as e:print('错误原因:', e)continuepass# 收入统计按钮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 = Falsesize = 1000, 484screen = pygame.display.set_mode(size)screen.fill(BG)else:income_switch = Truesize = 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 = iif i < 10:k = '0' + str(k)kk = pi_info_table[pi_info_table['date'].str.contains('-' + 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

运行效果如图:

实现满预警功能:

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

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

main.py文件代码如下:

import timeimport pandas as pdimport pygameimport cv2from pandas import DataFrameimport osimport btnimport ocrutilimport timeutilimport matplotlib.pyplot as pltsize=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=675text_rect.centery=365screen.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=820text_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 = 820text_rect.centery = 70screen.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').valuesn=0for car in cars: # 循环显示车辆信息n+=1textstart=xtfont.render(''+str(car[0])+' '+str(car[1]),True,WHITE) # 显示车号和进入时间text_rect=textstart.get_rect() # 获取文字图像位置# 设置文字图像中心点text_rect.centerx=820text_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)#转换当前时间-8-5 19:07localtime = 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 = 820text_rect1.centery = 320text_rect2.centerx = 820text_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=820text_rect.centery=355+20screen.blit(texttxt1,text_rect)texttxt2 = xtfont.render(txt2, True, GREEN)text_rect = texttxt2.get_rect()text_rect.centerx = 820text_rect.centery = 355 + 40screen.blit(texttxt2, text_rect)texttxt3 = xtfont.render(txt3, True, GREEN)text_rect = texttxt3.get_rect()text_rect.centerx = 820text_rect.centery = 355 + 60screen.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=0for 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=322text_rect.centery=20screen.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 = 1200text_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='车牌号: '+carnumbery=0kcar=0#获取车辆信息cars = pi_table[['carnumber', 'date', 'state']].valuesfor car in cars:if carnumber==car[0]:y=timeutil.DtCalc(car[1],localtime) #计算时间差,停车时间breakkcar=kcar+1if y==0:y=1txt2='停车费: '+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 += 1DataFrame(pi_info_table).to_excel(path + '停车场信息表.xlsx',sheet_name='data', index=False, header=True)#有停车位的提示信息txt1='车牌号:'+carnumbertxt2='有空余车位,可以进入停车场'txt3='进停车场时间:'+localtimeelse:# 没有停车位的提示信息txt1 = '车牌号:' + carnumbertxt2 = '没有空余车位,不可以进入停车场'txt3 = '时间:' + localtimeexcept Exception as e:print('错误原因:',e)continuepass#收入统计按钮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=Falsesize=1000,484screen=pygame.display.set_mode(size)screen.fill(BG)else:income_switch=Truesize=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=iif i<10:k='0'+str(k)kk=pi_info_table[pi_info_table['date'].str.contains('-'+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-sty=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

运行效果如下:

由于之前停车场出现过明天车辆满的情况,所以今天会出现满预警的提示信息

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。