a-a-sheet-href=https-python-example.com-answer-recognition-用Python启动答题卡识别!如今就学习吧! (aa式叠词)
答题卡素材图片:
思绪
1.读入图片,做一些预处置上班。
2.启动轮廓检测,而后找到该图片最大的轮廓,就是答题卡局部。
3.启动透视变换,以去除除答题卡外的多余局部,并且可以对答题卡启动校对。
4.再次检测轮廓,定位每个选项。
5.对选项圆圈先依照竖坐标排序,再依照行坐标排序,这样就从左到右从上到下的取得了每个选项轮廓。
6.对每个选项轮廓启动审核,假设某个选项轮廓中的红色点多,说明该选项被选中,否则就是没被选上。细节局部看环节:
1、预处置(去噪,灰度,二值化)
img=cv2.imread("1.png",1)#高斯去噪img_gs=cv2.GaussianBlur(img,[5,5],0)#转灰度img_gray=cv2.cvtColor(img_gs,cv2.COLOR_BGR2GRAY)#自顺应二值化_,binary_img=cv2.threshold(img_gray,0,255,cv2.THRESH_OTSU|cv2.THRESH_BINARY)-----------------------------------©著述权归作者一切:来自51CTO博客作者千锋IT教育的原创作品,请咨询作者失掉转载授权,否则将清查法律责任用/target=_blankclass=infotextkey>Python成功答题卡识别!
注:cv2.THRESH_OTSU|cv2.THRESH_BINARY,该参数指的是自顺应阈值+反二值化,做自顺应阈值的时刻阈值要设置为0
2、轮廓检测
注:findContours函数,传入的图像应该是二值图像,cv2.RETR_EXTERNAL指的是只检测外部轮廓,cv2.CHAIN_APPROX_NONE指的前往轮廓上的一切点。
这里做轮廓近似的目的是,之前检测到的轮廓看似是一个多边形,其实实质上是只是点集。
cv2.approxPolyDP(contour,epsilon,True),多边形迫近,第一个参数是点集,第二个参数是精度(原始轮廓的边界点与拟合多边形之间的最大距离),第三个参数指新发生的轮廓能否须要闭合,前往值approxCurve为多边形的点集(依照逆时针排序)。与该函数相似的函数还有cv2.boundingRect(矩形解围框)cv2.minAreaRect(最小解围矩形框),cv2.minEnclosingCircle(最小解围圆形)cv2.filtEllipse(最优拟合椭圆)cv2.filtLine(最优拟合直线),cv2.minEnclosingTriangle(最小外包三角形)
3、透视变换
透视变换的计算步骤:
4、轮廓检测,检测每个选项
5、画轮廓的外接圆,排序,定位每个选项
每个选项依照圆心从左到右,从上到下的顺序保留在了A中。
6、选项检测
思绪:关于A中的每个选项圆,计算它有所笼罩的坐标,而后判别这些坐标在二值图像中对应的值,统计红色点的个数,假设红色点所占的比例比拟大的话,说明该选项被选中。
这样每个答题卡就转换成了一个二维数组,接上去在做一些便捷的收尾上班就可以了。
零基础学Python应该学习哪些入门知识
关于零基础怎么样能快速学好Python的问题,网络提问和解答的都很多,你可以网络下看看。我觉得从个人自学的角度出发,应从以下几个方面来理解:
1 为什么选择学python?
据统计零基础或非专业的人士学python的比较多,据HackerRank开发者调查报告2018年5月显示(见图),Python排名第一,成为最受欢迎编程语言。Python以优雅、简洁著称,入行门槛低,可以从事Linux运维、Python Web网站工程师、Python自动化测试、数据分析、人工智能等职位,薪资待遇呈上涨趋势。
2 入门python需要那些准备?
2.1 心态准备。编程是一门技术,也可说是一门手艺。如同书法、绘画、乐器、雕刻等,技艺纯熟的背后肯定付出了长时间的反复练习。不要相信几周速成,也不能急于求成。编程的世界浩瀚无边,所以请保持一颗敬畏的心态去学习,认真对待写下的每一行代码,甚至每一个字符。收拾好自己的心态,向着编程的世界出发。第一步至关重要,关系到初学者从入门到精通还是从入门到放弃。选一条合适的入门道路,并坚持走下去。
2.2 配置 Python 学习环境。选Python2 还是 Python3?入门时很多人都会纠结。二者只是程序不兼容,思想上并无大差别,语法变动也并不多。选择任何一个入手,都没有大影响。如果你仍然无法抉择,那请选择 Python3,毕竟这是未来的趋势。
编辑器该如何选?同样,推荐 pycharm 社区版,配置简单、功能强大、使用起来省时省心,对初学者友好,并且完全免费!其他编辑器如:notepad++、sublimeText 3、vim 和 Emacs等不推荐了。
操作环境?Python 支持现有所有主流操作平台,不管是 windows 还是 mac 还是 linux,都能很好的运行 Python。并且后两者都默认自带 Python 环境。
2.3 选择自学的书籍。我推荐的书的内容由浅入深,建议按照先后顺序阅读学习:
2.3.1《Python简明教程》。这是一本言简意赅的 Python 入门教程,简单直白,没有废话。就算没有基础,你也可以像读小说一样,花两天时间就可以读完。适合入门快速了解语法。
2.3.2 廖雪峰编写的《Python教程》。廖先生的教程涵盖了 Python 知识的方方面面,内容更加系统,有一定深度,有一定基础之后学习会有更多的收获。
2.4 学会安装包。Python中有很多扩展包,想要安装这些包可以采用两种方法:
2.4.1 使用pip或easy_install。
1)在网上找到的需要的包,下载下来。eg. ;
2)解压缩该文件;
3)命令行工具cd切换到所要安装的包的目录,找到文件,然后输入python install
2.4.2 不用pip或easy_install,直接打开cmd,敲pip install rsa。
3 提升阶段需要恒心和耐力。
完成入门阶段的基础学习之后,常会陷入一个瓶颈期,通过看教程很难进一步提高编程水平。这时候,需要的是反复练习,大量的练习。可以从书上的例题、作业题开始写,再写小程序片段,然后写完整的项目。我们收集了一些练习题和网站。可根据自己阶段,选择适合的练习去做。建议最好挑选一两个系列重点完成,而不是浅尝辄止。
3.1 多做练习。推荐网站练习:
crossin编程教室实例:相对于编程教室基础练习着重于单一知识点,
编程实例训练对基础知识的融会贯通;
hackerrank:Python 部分难度循序渐进,符合学习曲线
实验楼:提升编程水平从做项目开始;
codewar:社区型编程练习网站,内容由易到难;
leetcode:为编程面试准备,对初学者稍难;
牛客网:提供 BAT 等大厂笔试题目;
codecombat:提供一边游戏一边编程;
projecteuler:纯粹的编程练习网站;
菜鸟教程100例:基于 py2 的基础练习;
3.2 遇到问题多交流。
3.2.1 利用好搜索引擎。
3.2.2 求助于各大网站。推荐
stackoverflow:这是一个程序员的知识库;
v2ex:国内非常不错的编程社区,不仅仅是包含程序,也包含了程序员的生活;
segmentfault:一家以编程问答为主的网站;
CSDN、知乎、简书等
3.2.3 加入相关的QQ、微信群、网络知道。不懂的可以随时请教。
python实现小区车牌识别计费程序
示例简介python利用网络文字识别功能,实现小区车辆进出识别,并显示进出信息和收费信息;可查看停车信息,也可查看历史数据;开发环境:Windows7python3.7pycharm2018.2.4(开发工具);目录机构:最终效果:由于涉及隐私,不能上传动态效果;左边为摄像头的画面(这里是视频播放页面),右上角显示车位情况和最近十条车辆信息,右下角显示识别信息、收费信息或提示信息;网络端创建应用创建过程参考《微信小程序利用网络AI实现扫描身份证获取信息功能》(把“图像识别”换为“文字识别”)。
实现过程1、文件“”用来设置该程序的基础信息;classSettings():def__init__(self):初始化设置#屏幕设置(宽、高、背景色、线颜色)_width=_height=_color=(255,255,255)#停车位=100#识别颜色、车牌号、进来时间、出入场信息_color=(212,35,122)===2、文件“”有两个函数:函数time_cmp主要用来比较出场时间跟卡有效期,判断业主是否需要收费;函数priceCalc用来计算停车时间,里面存在两种情况,一种是外来车,只需要比较出入场时间差;另一种是业主车,入场时,卡未到期,但出场时间已经到期,所以需要比较卡有效期和出场时间的差值;Tips:由于读取Excel的卡有效期字段,会多“”这部分,所以需要经过split(.)处理。
importdatetimeimportmath#计算两个日期大小deftime_cmp(first_time,second_time):#由于有效期获取后会有小数数据firstTime=(str(first_time)(.)[0],%Y-%m-%d%H:%M:%S)secondTime=(str(second_time),%Y-%m-%d%H:%M)number=1iffirstTimesecondTimeelse0returnnumber#计算停车时间四舍五入defpriceCalc(inDate,outDate)(inDate):inDate=str(inDate)(.)[0]inDate=(inDate,%Y-%m-%d%H:%M:%S)print(特殊处理)else:inDate=(inDate,%Y-%m-%d%H:%M)outDate=(str(outDate),%Y-%m-%d%H:%M)rtn=outDate-inDate#计算停车多少小时(往上取整)y=(_seconds()/60/60)returny3、文件“”用来绘制按钮,这里用来绘制“识别”按钮;():def__init__(self,screen,msg):初始化按钮的属性=_rect=_rect()#设置按钮的尺寸和其他属性,=100,_color=(0,120,215)_color=(255,255,255)=(SimHei,25)#创建按钮的rect对象,并使其居中=(0,0,,)#创建按钮的rect对象,并设置按钮中心位置=/=/22#按钮的标签只需创建一次_msg(msg)defprep_msg(self,msg):将msg渲染为图像,并使其在按钮上居中_image=(msg,True,_color,_color)_image_rect=__rect()_image_=_button(self):#绘制一个用颜色填充的按钮,再绘制文本(_color,)(_image,_image_rect)4、文件“”用来绘制背景和文字;#线颜色line_color=(0,0,0)#显示文字信息时使用的字体设置text_color=(0,0,0)defdraw_bg(screen):#背景文图案bgfont=(SimHei,15)#绘制横线(screen,line_color,(662,30),(980,30),1)#渲染为图片text_image=(识别信息:,True,text_color)#获取文字图像位置text_rect=text__rect()#设置文字图像中心点text_=660text_=370#绘制内容(text_image,text_rect)#绘制文字(text-文字内容、xpos-x坐标、ypos-y坐标、fontSize-字体大小)defdraw_text(screen,text,xpos,ypos,fontsize,tc=text_color):#使用系统字体xtfont=(SimHei,fontsize)text_image=(text,True,tc)#获取文字图像位置text_rect=text__rect()#设置文字图像中心点text_=xpostext_=ypos#绘制内容(text_image,text_rect)5、文件“”用来调用网络文字识别SDK,获取图片中的车牌信息;Tips:文件“”为从摄像头读取的图片,每次循环获取一次,这里为了测试方便使用视频;fromaipimportAipOcrimportos#网络识别车牌#申请地址记录申请的Key的文件位置(filename):#判断文件是否存在withopen(filename,r)asfile:#打开文件dictkey=eval(()[0])#读取全部内容转换为字典#以下获取的三个Key是进入网络AI开放平台的控制台的应用列表里创建应用得来的APP_ID=dictkey[APP_ID]#获取申请的APIIDAPI_KEY=dictkey[API_KEY]#获取申请的APIKEYSECRET_KEY=dictkey[SECRET_KEY]#获取申请的SECRETKEYelse:print(请先在file目录下创建,并且写入申请的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)()#根据图片返回车牌号defgetcn():#读取图片image=get_file_content(images/)#调用车牌识别results=(image)[words_result][number]#输出车牌号returnresults6、文件“procedure_”存放跟程序相关的业务逻辑函数;里面比较复杂的就是点击“识别”按钮后的逻辑处理(==):1)当停车场没有停车时,只需要识别后,把车辆信息存入“停车场车辆表”并把相关信息显示到界面右下角;2)当停车场已有停车时,会出现两种情况,一种是入场,一种是出场:入场需判断是否停车场已满,已满则不给进入并显示提示信息;未满则把车辆信息存入“停车场车辆表”并把相关信息显示到界面右下角;出场分业主有效、业主过期、外来车三种情况收费,并删除车辆表相应的车辆信息,并把车辆信息和收费信息等存入“停车场历史表”(可用于后面数据的汇总统计);importsysimportpygameimporttimeimportpandasaspdimportocrutilimporttimeutil#事件defcheck_events(settings,recognition_button,ownerInfo_table,carInfo_table,history_table,path):响应按键和鼠标事件()==()==:mouse_x,mouse_y=_pos()button_clicked=recognition_(mouse_x,mouse_y)ifbutton_clicked:try:#获取车牌carnumber=()#转换当前时间2018-12-1116:18localtime=(%Y-%m-%d%H:%M,())=车牌号码:carnumber#判断进入车辆是否业主车辆#获取业主车辆信息(只显示卡未过期)ownerInfo_table=ownerInfo_table[ownerInfo_table[validityDate]localtime]owner_carnumbers=ownerInfo_table[[carnumber,validityDate]]=ownerInfo_table[carnumber]#获取车辆表信息carInfo_carnumbers=carInfo_table[[carnumber,inDate,isOwner,validityDate]]=carInfo_table[carnumber]#增加车辆信息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]==_cmp(carInfo_carnumber[3],localtime):print(业主车,自动抬杠)msgMessage=业主车,可出停车场parkPrice=业主卡else:print(业主车,但卡已过期,收费抬杠)#比较卡有效期时间price=(carInfo_carnumber[3],localtime)msgMessage=停车费用:str(5int(price))(提醒业主,卡已到期)parkPrice=5int(price)else:print(外来车,收费抬杠)#比较入场时间price=(carInfo_carnumber[1],localtime)msgMessage=停车费用:str(5price)parkPrice=5int(price)print(i)carInfo_table=carInfo_([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_(append_history,ignore_index=True)=出场时间=msgMessage#更新车辆表和历史表(carInfo_table)_excel(path停车场车辆表,sheet_name=data,index=False,header=True)(history_table)_excel(path停车场历史表,sheet_name=data,index=False,header=True)breaki=1else:#入停车场print(有车辆表数据入场)ifcarInfo_:in_park(owner_carnumbers,carnumbers,carInfo_table,append_carInfo,carnumber,localtime,settings,path)else:print(停车场已满)=进场时间=停车场已满,无法进入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]==进场时间=msgMessage#添加信息到车辆表carInfo_table=carInfo_(append_carInfo,ignore_index=True)#更新车辆表(carInfo_table)_excel(path停车场车辆表,sheet_name=data,index=False,header=True)7、文件“”为程序的主函数,用来初始化程序,并同步更新程序的信息。
importpygameimportcv2importosimportpandasaspd#引入自定义模块fromsettingsimportSettingsfrombuttonimportButtonimporttextboardimportprocedure_functionsaspfdefrun_procedure():#获取文件的路径cdir=()#文件夹路径path=cdir/file/#读取路径(path停车场车辆表):#车牌号进入时间离开时间价格是否业主carnfile=(columns=[carnumber,inDate,outData,price,isOwner,validityDate])#生成xlsx文件_excel(path停车场车辆表,sheet_name=data)_excel(path停车场历史表,sheet_name=data)settings=Settings()#初始化并创建一个屏幕对象()_caption(智能小区车牌识别系统)ic_launcher=(images/icon_)_icon(ic_launcher)screen=_mode((_width,_height))try:#cam=(0)#开启摄像头cam=(file/4)except:print(请连接摄像头)#循环帧率设置clock=()running=True#开始主循环(_color)#从摄像头读取图片sucess,img=()#保存图片,并退出。
(images/,img)else:#识别不到图片或者设备停止,则退出系统running=False#加载图像image=(images/)#设置图片大小image=(image,(640,480))#绘制视频画面(image,(2,2))#创建识别按钮recognition_button=Button(screen,识别)recognition__button()#读取文件内容ownerInfo_table=_excel(path住户车辆表,sheet_name=data)carInfo_table=_excel(path停车场车辆表,sheet_name=data)history_table=_excel(path停车场历史表,sheet_name=data)inNumber=len(carInfo_table[carnumber])#绘制背景_bg(screen)#绘制信息标题_text(screen,共有车位:str()剩余车位:str(-inNumber),680,0,20)#绘制信息表头_text(screen,车牌号进入时间,700,40,15)#绘制停车场车辆前十条信息carInfos=carInfo__values(by=inDate,ascending=False)i=:ifi=10:breaki=_text(screen,str(carInfo[1])str(carInfo[2]),700,40i30,15)#绘制识别信息_text(screen,,660,400,15,_color)_text(screen,,660,422,15,_color)_text(screen,,660,442,15,_color)响应鼠标事件_events(settings,recognition_button,ownerInfo_table,carInfo_table,history_table,path)()#控制游戏最大帧率为(60)#关闭摄像头()run_procedure()
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。