python实现小区车牌识别计费程序

   更新日期:2024.05.15
示例简介python利用百度文字识别功能,实现小区车辆进出识别,并显示进出信息和收费信息;可查看停车信息,也可查看历史数据;
开发环境:Windows7python3.7pycharm2018.2.4(开发工具);
目录机构:
最终效果:由于涉及隐私,不能上传动态效果;左边为摄像头的画面(这里是视频播放页面),右上角显示车位情况和最近十条车辆信息,右下角显示识别信息、收费信息或提示信息;
百度端创建应用
创建过程参考《微信小程序利用百度AI实现扫描身份证获取信息功能》(把“图像识别”换为“文字识别”)。
实现过程
1、文件“settings.py”用来设置该程序的基础信息;
classSettings():def__init__(self):初始化设置#屏幕设置(宽、高、背景色、线颜色)self.screen_width=1000self.screen_height=484self.bg_color=(255,255,255)#停车位self.total=100#识别颜色、车牌号、进来时间、出入场信息self.ocr_color=(212,35,122)self.carnumber=self.comeInTime=self.message=2、文件“timeutil.py”有两个函数:
函数time_cmp主要用来比较出场时间跟卡有效期,判断业主是否需要收费;
函数priceCalc用来计算停车时间,里面存在两种情况,一种是外来车,只需要比较出入场时间差;另一种是业主车,入场时,卡未到期,但出场时间已经到期,所以需要比较卡有效期和出场时间的差值;
Tips:由于读取Excel的卡有效期字段,会多“.xxxx”这部分,所以需要经过split(.)处理。
importdatetimeimportmath#计算两个日期大小deftime_cmp(first_time,second_time):#由于有效期获取后会有小数数据firstTime=datetime.datetime.strptime(str(first_time).split(.)[0],%Y-%m-%d%H:%M:%S)secondTime=datetime.datetime.strptime(str(second_time),%Y-%m-%d%H:%M)number=1iffirstTimesecondTimeelse0returnnumber#计算停车时间四舍五入defpriceCalc(inDate,outDate):if.instr(inDate):inDate=str(inDate).split(.)[0]inDate=datetime.datetime.strptime(inDate,%Y-%m-%d%H:%M:%S)print(特殊处理)else:inDate=datetime.datetime.strptime(inDate,%Y-%m-%d%H:%M)outDate=datetime.datetime.strptime(str(outDate),%Y-%m-%d%H:%M)rtn=outDate-inDate#计算停车多少小时(往上取整)y=math.ceil(rtn.total_seconds()/60/60)returny3、文件“button.py”用来绘制按钮,这里用来绘制“识别”按钮;
importpygame.fontclassButton():def__init__(self,screen,msg):初始化按钮的属性self.screen=screenself.screen_rect=screen.get_rect()#设置按钮的尺寸和其他属性self.width,self.height=100,50self.button_color=(0,120,215)self.text_color=(255,255,255)self.font=pygame.font.SysFont(SimHei,25)#创建按钮的rect对象,并使其居中self.rect=pygame.Rect(0,0,self.width,self.height)#创建按钮的rect对象,并设置按钮中心位置self.rect.centerx=640-self.width/22self.rect.centery=480-self.height/22#按钮的标签只需创建一次self.prep_msg(msg)defprep_msg(self,msg):将msg渲染为图像,并使其在按钮上居中self.msg_image=self.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rect=self.msg_image.get_rect()self.msg_image_rect.center=self.rect.centerdefdraw_button(self):#绘制一个用颜色填充的按钮,再绘制文本self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)4、文件“textboard.py”用来绘制背景和文字;
importpygame.font#线颜色line_color=(0,0,0)#显示文字信息时使用的字体设置text_color=(0,0,0)defdraw_bg(screen):#背景文图案bgfont=pygame.font.SysFont(SimHei,15)#绘制横线pygame.draw.aaline(screen,line_color,(662,30),(980,30),1)#渲染为图片text_image=bgfont.render(识别信息:,True,text_color)#获取文字图像位置text_rect=text_image.get_rect()#设置文字图像中心点text_rect.left=660text_rect.top=370#绘制内容screen.blit(text_image,text_rect)#绘制文字(text-文字内容、xpos-x坐标、ypos-y坐标、fontSize-字体大小)defdraw_text(screen,text,xpos,ypos,fontsize,tc=text_color):#使用系统字体xtfont=pygame.font.SysFont(SimHei,fontsize)text_image=xtfont.render(text,True,tc)#获取文字图像位置text_rect=text_image.get_rect()#设置文字图像中心点text_rect.left=xpostext_rect.top=ypos#绘制内容screen.blit(text_image,text_rect)5、文件“ocrutil.py”用来调用百度文字识别SDK,获取图片中的车牌信息;
Tips:文件“test.jpg”为从摄像头读取的图片,每次循环获取一次,这里为了测试方便使用视频;
fromaipimportAipOcrimportos#百度识别车牌#申请地址https://login.bce.baidu.com/filename=file/key.txt#记录申请的Key的文件位置ifos.path.exists(filename):#判断文件是否存在withopen(filename,r)asfile:#打开文件dictkey=eval(file.readlines()[0])#读取全部内容转换为字典#以下获取的三个Key是进入百度AI开放平台的控制台的应用列表里创建应用得来的APP_ID=dictkey[APP_ID]#获取申请的APIIDAPI_KEY=dictkey[API_KEY]#获取申请的APIKEYSECRET_KEY=dictkey[SECRET_KEY]#获取申请的SECRETKEYelse:print(请先在file目录下创建key.txt,并且写入申请的Key!格式如下:\n{APP_ID:申请的APIID,API_KEY:申请的APIKEY,SECRET_KEY:申请的SECRETKEY})#初始化AipOcr对象client=AipOcr(APP_ID,API_KEY,SECRET_KEY)#读取文件defget_file_content(filePath):withopen(filePath,rb)asfp:returnfp.read()#根据图片返回车牌号defgetcn():#读取图片image=get_file_content(images/test.jpg)#调用车牌识别results=client.licensePlate(image)[words_result][number]#输出车牌号returnresults6、文件“procedure_functions.py”存放跟程序相关的业务逻辑函数;
里面比较复杂的就是点击“识别”按钮后的逻辑处理(event.type==pygame.MOUSEBUTTONDOWN):
1)当停车场没有停车时,只需要识别后,把车辆信息存入“停车场车辆表”并把相关信息显示到界面右下角;
2)当停车场已有停车时,会出现两种情况,一种是入场,一种是出场:
入场需判断是否停车场已满,已满则不给进入并显示提示信息;未满则把车辆信息存入“停车场车辆表”并把相关信息显示到界面右下角;
出场分业主有效、业主过期、外来车三种情况收费,并删除车辆表相应的车辆信息,并把车辆信息和收费信息等存入“停车场历史表”(可用于后面数据的汇总统计);
importsysimportpygameimporttimeimportpandasaspdimportocrutilimporttimeutil#事件defcheck_events(settings,recognition_button,ownerInfo_table,carInfo_table,history_table,path):响应按键和鼠标事件foreventinpygame.event.get():ifevent.type==pygame.QUIT:sys.exit()elifevent.type==pygame.MOUSEBUTTONDOWN:mouse_x,mouse_y=pygame.mouse.get_pos()button_clicked=recognition_button.rect.collidepoint(mouse_x,mouse_y)ifbutton_clicked:try:#获取车牌carnumber=ocrutil.getcn()#转换当前时间2018-12-1116:18localtime=time.strftime(%Y-%m-%d%H:%M,time.localtime())settings.carnumber=车牌号码:carnumber#判断进入车辆是否业主车辆#获取业主车辆信息(只显示卡未过期)ownerInfo_table=ownerInfo_table[ownerInfo_table[validityDate]localtime]owner_carnumbers=ownerInfo_table[[carnumber,validityDate]].valuescarnumbers=ownerInfo_table[carnumber].values#获取车辆表信息carInfo_carnumbers=carInfo_table[[carnumber,inDate,isOwner,validityDate]].valuescars=carInfo_table[carnumber].values#增加车辆信息append_carInfo={carnumber:carnumber}#增加历史信息append_history={carnumber:carnumber}carInfo_length=len(carInfo_carnumbers)#车辆表未有数据ifcarInfo_length==0:print(未有车辆数据入场)in_park(owner_carnumbers,carnumbers,carInfo_table,append_carInfo,carnumber,localtime,settings,path)#车辆表有数据else:ifcarnumberincars:#出停车场i=0forcarInfo_carnumberincarInfo_carnumbers:ifcarnumber==carInfo_carnumber[0]:ifcarInfo_carnumber[2]==1:iftimeutil.time_cmp(carInfo_carnumber[3],localtime):print(业主车,自动抬杠)msgMessage=业主车,可出停车场parkPrice=业主卡else:print(业主车,但卡已过期,收费抬杠)#比较卡有效期时间price=timeutil.priceCalc(carInfo_carnumber[3],localtime)msgMessage=停车费用:str(5int(price))(提醒业主,卡已到期)parkPrice=5int(price)else:print(外来车,收费抬杠)#比较入场时间price=timeutil.priceCalc(carInfo_carnumber[1],localtime)msgMessage=停车费用:str(5price)parkPrice=5int(price)print(i)carInfo_table=carInfo_table.drop([i])#增加数据到历史表append_history[inDate]=carInfo_carnumber[1]append_history[outData]=localtimeappend_history[price]=parkPriceappend_history[isOwner]=carInfo_carnumber[2]append_history[validityDate]=carInfo_carnumber[3]history_table=history_table.append(append_history,ignore_index=True)settings.comeInTime=出场时间:localtimesettings.message=msgMessage#更新车辆表和历史表pd.DataFrame(carInfo_table).to_excel(path停车场车辆表.xlsx,sheet_name=data,index=False,header=True)pd.DataFrame(history_table).to_excel(path停车场历史表.xlsx,sheet_name=data,index=False,header=True)breaki=1else:#入停车场print(有车辆表数据入场)ifcarInfo_lengthsettings.total:in_park(owner_carnumbers,carnumbers,carInfo_table,append_carInfo,carnumber,localtime,settings,path)else:print(停车场已满)settings.comeInTime=进场时间:localtimesettings.message=停车场已满,无法进入exceptExceptionase:print(错误原因:,e)continuepass#车辆入停车场defin_park(owner_carnumbers,carnumbers,carInfo_table,append_carInfo,carnumber,localtime,settings,path):ifcarnumberincarnumbers:forowner_carnumberinowner_carnumbers:ifcarnumber==owner_carnumber[0]:print(业主车,自动抬杠)msgMessage=提示信息:业主车,可入停车场append_carInfo[isOwner]=1append_carInfo[validityDate]=owner_carnumber[1]#退出循环breakelse:print(外来车,识别抬杠)msgMessage=提示信息:外来车,可入停车场append_carInfo[isOwner]=0append_carInfo[inDate]=localtimesettings.comeInTime=进场时间:localtimesettings.message=msgMessage#添加信息到车辆表carInfo_table=carInfo_table.append(append_carInfo,ignore_index=True)#更新车辆表pd.DataFrame(carInfo_table).to_excel(path停车场车辆表.xlsx,sheet_name=data,index=False,header=True)7、文件“main.py”为程序的主函数,用来初始化程序,并同步更新程序的信息。
importpygameimportcv2importosimportpandasaspd#引入自定义模块fromsettingsimportSettingsfrombuttonimportButtonimporttextboardimportprocedure_functionsaspfdefrun_procedure():#获取文件的路径cdir=os.getcwd()#文件夹路径path=cdir/file/#读取路径ifnotos.path.exists(path停车场车辆表.xlsx):#车牌号进入时间离开时间价格是否业主carnfile=pd.DataFrame(columns=[carnumber,inDate,outData,price,isOwner,validityDate])#生成xlsx文件carnfile.to_excel(path停车场车辆表.xlsx,sheet_name=data)carnfile.to_excel(path停车场历史表.xlsx,sheet_name=data)settings=Settings()#初始化并创建一个屏幕对象pygame.init()pygame.display.set_caption(智能小区车牌识别系统)ic_launcher=pygame.image.load(images/icon_launcher.png)pygame.display.set_icon(ic_launcher)screen=pygame.display.set_mode((settings.screen_width,settings.screen_height))try:#cam=cv2.VideoCapture(0)#开启摄像头cam=cv2.VideoCapture(file/test.mp4)except:print(请连接摄像头)#循环帧率设置clock=pygame.time.Clock()running=True#开始主循环whilerunning:screen.fill(settings.bg_color)#从摄像头读取图片sucess,img=cam.read()#保存图片,并退出。ifsucess:cv2.imwrite(images/test.jpg,img)else:#识别不到图片或者设备停止,则退出系统running=False#加载图像image=pygame.image.load(images/test.jpg)#设置图片大小image=pygame.transform.scale(image,(640,480))#绘制视频画面screen.blit(image,(2,2))#创建识别按钮recognition_button=Button(screen,识别)recognition_button.draw_button()#读取文件内容ownerInfo_table=pd.read_excel(path住户车辆表.xlsx,sheet_name=data)carInfo_table=pd.read_excel(path停车场车辆表.xlsx,sheet_name=data)history_table=pd.read_excel(path停车场历史表.xlsx,sheet_name=data)inNumber=len(carInfo_table[carnumber].values)#绘制背景textboard.draw_bg(screen)#绘制信息标题textboard.draw_text(screen,共有车位:str(settings.total)剩余车位:str(settings.total-inNumber),680,0,20)#绘制信息表头textboard.draw_text(screen,车牌号进入时间,700,40,15)#绘制停车场车辆前十条信息carInfos=carInfo_table.sort_values(by=inDate,ascending=False)i=0forcarInfoincarInfos.values:ifi=10:breaki=1textboard.draw_text(screen,str(carInfo[1])str(carInfo[2]),700,40i30,15)#绘制识别信息textboard.draw_text(screen,settings.carnumber,660,400,15,settings.ocr_color)textboard.draw_text(screen,settings.comeInTime,660,422,15,settings.ocr_color)textboard.draw_text(screen,settings.message,660,442,15,settings.ocr_color)响应鼠标事件pf.check_events(settings,recognition_button,ownerInfo_table,carInfo_table,history_table,path)pygame.display.flip()#控制游戏最大帧率为60clock.tick(60)#关闭摄像头cam.release()run_procedure()

  • 19813199336 :基于python的车牌识别系统 能作为毕业设计吗
    陆殷肿2633 :答:可以。毕业设计,基于OpenCV和Python语言的人脸识别,里面包含代码,适合毕业设计,代码简洁,易于修改移植,可以做普通的人脸识别。
  • 19813199336 :想实现人工智能,车牌识别,自动驾驶用什么编程语言比较好
    陆殷肿2633 :答:目前主流的人工智能以及指纹识别、人脸识别等等都是用的Python语言在做
  • 19813199336 :100个Python实战项目(附全部源码),无论你是练手还是做毕业设计,拿走就...
    陆殷肿2633 :答:火车票分析助手 - 查询、分析实时票务信息,出行无忧。甜橙音乐网 - 享受音乐,体验Python打造的个性化界面。微信机器人 - 笑话、天气、文字游戏,日常生活的小助手。智能停车场车牌识别计费系统 - 结合百度AI,便捷计费,轻松停车。工资计算系统 - 自动导入数据,快速计算薪酬,提高效率。轨道交通客流预测系...
  • 19813199336 :摄像头自动识别车号填进excel
    陆殷肿2633 :答:摄像头自动识别车号并填进Excel的原因是利用计算机视觉和图像识别技术,通过摄像头捕捉车辆的图像,并对图像进行处理和分析,从中提取出车牌号码信息。然后,将提取到的车牌号码自动填写进Excel表格中。这样做的好处是提高了工作效率和准确性。相比手动录入车牌号码,摄像头自动识别车号可以大大节省时间和人力...
  • 19813199336 :ITSMS Official 交通场景智能监控综合系统GUI设计与使用说明书_百度知 ...
    陆殷肿2633 :答:参数设置与识别</:包括目标设定、帧保存、视频保存和检测模式选择 限速检测</:视频面板启动,实时进行速度监控 图像识别</:提供额外的高级功能 视频检测步骤</:详细流程图24-26展示操作过程 强制终止</:在需要时随时中断任务 导出信息</:提供导出数据示例 车牌识别</:功能受限,但...
  • 19813199336 :车牌识别系统算法代码怎么编写?
    陆殷肿2633 :答:立林智能网络车牌自动识别还采用先进的目标跟踪,以及识别结果最佳化等方法,来确保从车流中一个一个地甄别出序列化的车牌。要实现对视频流逐帧识别,必须采用行之有效的高速识别算法,即神经网络算法和模糊算法相结合,否则无法达到实用的效果。对于常用的768×288高分辨率图像,立林智能网络车牌自动识别可以...
  • 19813199336 :小区道闸车牌识别系统
    陆殷肿2633 :答:小区道闸车牌识别系统是一种基于图像处理和计算机视觉技术的智能交通管理系统,用于自动识别进出小区车辆的车牌号码,并控制道闸的升降,以实现车辆通行的自动化管理。该系统主要由图像采集设备、车牌识别算法和控制道闸的硬件设备组成。图像采集设备通常安装在小区入口或出口处,用于捕捉经过车辆的图像。车牌识别...
  • 19813199336 :我想用matlab做一个车牌识别系统,能不能直接用ocr()函数?
    陆殷肿2633 :答:首先,OCR函数需要训练模型来识别特定字体的字符。对于车牌识别,需要训练OCR模型来识别车牌上的字符。如果您没有训练好的模型,需要先收集一组车牌图像和相应的字符标签,然后使用OCR训练器进行训练。这个过程可能需要大量的时间和计算资源。其次,车牌识别还需要进行图像处理和字符分割等预处理工作。车牌图像...
  • 19813199336 :停车场中的核心技术“车牌识别系统”是如何工作的?
    陆殷肿2633 :答:车牌识别技术结合电子不停车收费系统(ETC)识别车辆,过往车辆通过道口时无须停车,即能够实现车辆身份自动识别、自动收费。在车场管理中,为提高出入口车辆通行效率,车牌识别针对无需收停车费的车辆(如月卡车、内部免费通行车辆),建设无人值守的快速通道,免取卡、不停车的出入体验,正改变出入停车场的管理...
  • 19813199336 :车牌识别程序
    陆殷肿2633 :答:智能化多媒体网络车牌识别系统广泛应用在过往车辆自动登记、验证,公路收费,车辆安全核查,小区、停车场管理等方面。系统采用视频实时触发方式进行检测抓拍,能够自动侦测、准确识别及验证行驶或停泊中车辆的整车车牌号码。可对已抓拍图像与数据库资料及时进行比对,当发现应拦截车辆时,系统能在本地机和中心机...
  • 相关链接

    欢迎反馈与建议,请联系电邮
    2024 © 视觉网