OpenCV实例(八)车牌字符识别技术(二)字符识别

车牌字符识别技术(二)字符识别

  • 1.字符识别原理及其发展阶段
  • 2.字符识别方法
  • 3.英文、数字识别
  • 4.车牌定位实例

1.字符识别原理及其发展阶段

匹配判别是字符识别的基本思想,与其他模式识别的应用非常类似。字符识别的基本原理就是对字符图像进行预处理、模式表达、判别和字典学习。

字符识别一般可分为三个阶段:

第一阶段为初级阶段,主要是应用一维图像的处理方法实现对二维图像的识别。此阶段主要涉及相关函数的构造以及特征向量的抽取。目前,该阶段的字符识别方法仍然在匹配方法的庞大家族中扮演着很重要的角色。

第二阶段为对基础理论进行相关研究的阶段。细化思想、链码法以及对一些离散图形上的拓扑性研究在这一阶段进行,其中细化思想主要用于结构的分析,链码法主要用于边界的表示。本阶段实现了抽取大范围的孔、凹凸区域、连通性以及抽取局部特征等算法,同时还实现了对K-L展开法“特征抽取理论”作为核心相关工作的研究。

第三阶段为发展阶段。本阶段在依据实际系统的要求以及设备难以提供的条件的基础上提出更为复杂的技术,主要研究工作是将技术与实际结合起来。另外,在以构造解析法以及相关法为主的基础上,许多各具特色且不同类的实用系统得以研究出来。
在这里插入图片描述

2.字符识别方法

目前字符识别方法主要有基于神经网络的识别方法、基于特征分析的匹配方法和基于模板的匹配方法。

(1)基于神经网络的识别方法

基于神经网络的识别方法主要包括4个步骤:预处理样本字符、提取字符的特征、对神经网络进行训练、神经网络接受经过相关预处理和特征提取的字符并对这些字符进行识别。

(2)基于特征分析的匹配方法

基于特征分析的匹配方法,主要利用特征平面来进行字符匹配。与其他匹配方法进行比较可知,它不但对噪声具有不明显的反应,而且可以获得效果更好的字符特征。

(3)基于模板的匹配方法

基于模板的匹配方法也是字符识别的一种方法,主要权衡输入模式与标准模式之间的相似程度。因此,从结果来看,输入模式的类别其实也是标准模式,单从与输入模式相似度的程度来讲,这里提到的标准模式最高。对于离散输入模式分类的实现,此方法所起的作用非常明显也非常奏效。

组成汽车牌照的字符大约有50个汉字、20多个英文字符和10个阿拉伯数字,相对而言,字符数比较少,所以可以使用模板匹配法识别这些字符。其中,用于匹配的模板的标准形式可由前面所述的字符制作而成。与其他的字符识别的方法进行比较可知,模板匹配法具有相对来说较为简单的识别过程和较快的字符识别速度,只不过准确率不是很高。
在这里插入图片描述

3.英文、数字识别

目前,小波识别法、模板匹配法与神经网络法等常被作为汽车牌照字符识别的主要方法。数字字符是在汽车牌照的字符集中具有最小规模、最简单结构的子集。虽然字母字符相对于数字字符而言并不复杂,但是单从字符的结构上来讲,不难看出车牌字符集中的数字字符要相对简单一些。一般采用模板匹配法来识别字母字符以及数字字符,只是有时采用模板匹配法不一定能取得理想的识别效果,例如字符存在划伤破损、褪色、污迹等问题时。本章采用的匹配模式为两级模板匹配,首先通过一级模板实现对字母数字字符的匹配,然后基于边缘霍斯多夫距离对一级模板匹配不成功的字符进行匹配。

真实的汽车图像的采集主要通过CCD工业相机进行的,输入的汽车牌照的字符图像在经过汽车牌照的定位以及汽车牌照内字符的分割之后形成,其中约有50%的高质量的字符包含在3000个字符组成的字符集中,剩下的汽车牌照内的字符质量都有一定程度的降低。相较于传统的模板匹配法和基于细化图像霍斯多夫距离的模板匹配法,准确率在基于边缘霍斯多夫距离的模板匹配识别方法中表现得更高(为98%,字符的错误识别率只有2%)。

4.车牌定位实例

测试照片:
在这里插入图片描述

代码实例:

# -*- coding: utf-8 -*-import cv2
import numpy as npdef stretch(img):'''图像拉伸函数'''maxi=float(img.max())mini=float(img.min())for i in range(img.shape[0]):for j in range(img.shape[1]):img[i,j]=(255/(maxi-mini)*img[i,j]-(255*mini)/(maxi-mini))return imgdef dobinaryzation(img):'''二值化处理函数'''maxi=float(img.max())mini=float(img.min())x=maxi-((maxi-mini)/2)#二值化,返回阈值ret  和  二值化操作后的图像threshret,thresh=cv2.threshold(img,x,255,cv2.THRESH_BINARY)#返回二值化后的黑白图像return threshdef find_rectangle(contour):'''寻找矩形轮廓'''y,x=[],[]for p in contour:y.append(p[0][0])x.append(p[0][1])return [min(y),min(x),max(y),max(x)]def locate_license(img,afterimg):'''定位车牌号'''contours,hierarchy=cv2.findContours(img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#找出最大的三个区域block=[]for c in contours:#找出轮廓的左上点和右下点,由此计算它的面积和长度比r=find_rectangle(c)a=(r[2]-r[0])*(r[3]-r[1])   #面积s=(r[2]-r[0])*(r[3]-r[1])   #长度比block.append([r,a,s])#选出面积最大的3个区域block=sorted(block,key=lambda b: b[1])[-3:]#使用颜色识别判断找出最像车牌的区域maxweight,maxindex=0,-1for i in range(len(block)):b=afterimg[block[i][0][1]:block[i][0][3],block[i][0][0]:block[i][0][2]]#BGR转HSVhsv=cv2.cvtColor(b,cv2.COLOR_BGR2HSV)#蓝色车牌的范围lower=np.array([100,50,50])upper=np.array([140,255,255])#根据阈值构建掩膜mask=cv2.inRange(hsv,lower,upper)#统计权值w1=0for m in mask:w1+=m/255w2=0for n in w1:w2+=n#选出最大权值的区域if w2>maxweight:maxindex=imaxweight=w2return block[maxindex][0]def find_license(img):'''预处理函数'''m=400*img.shape[0]/img.shape[1]#压缩图像img=cv2.resize(img,(400,int(m)),interpolation=cv2.INTER_CUBIC)#BGR转换为灰度图像gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#灰度拉伸stretchedimg=stretch(gray_img)'''进行开运算,用来去除噪声'''r=16h=w=r*2+1kernel=np.zeros((h,w),np.uint8)cv2.circle(kernel,(r,r),r,1,-1)#开运算openingimg=cv2.morphologyEx(stretchedimg,cv2.MORPH_OPEN,kernel)#获取差分图,两幅图像做差  cv2.absdiff('图像1','图像2')strtimg=cv2.absdiff(stretchedimg,openingimg)#图像二值化binaryimg=dobinaryzation(strtimg)#canny边缘检测canny=cv2.Canny(binaryimg,binaryimg.shape[0],binaryimg.shape[1])'''消除小的区域,保留大块的区域,从而定位车牌'''#进行闭运算kernel=np.ones((5,19),np.uint8)closingimg=cv2.morphologyEx(canny,cv2.MORPH_CLOSE,kernel)#进行开运算openingimg=cv2.morphologyEx(closingimg,cv2.MORPH_OPEN,kernel)#再次进行开运算kernel=np.ones((11,5),np.uint8)openingimg=cv2.morphologyEx(openingimg,cv2.MORPH_OPEN,kernel)#消除小区域,定位车牌位置rect=locate_license(openingimg,img)return rect,imgdef cut_license(afterimg,rect):'''图像分割函数'''#转换为宽度和高度rect[2]=rect[2]-rect[0]rect[3]=rect[3]-rect[1]rect_copy=tuple(rect.copy())rect=[0,0,0,0]#创建掩膜mask=np.zeros(afterimg.shape[:2],np.uint8)#创建背景模型  大小只能为13*5,行数只能为1,单通道浮点型bgdModel=np.zeros((1,65),np.float64)#创建前景模型fgdModel=np.zeros((1,65),np.float64)#分割图像cv2.grabCut(afterimg,mask,rect_copy,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT)mask2=np.where((mask==2)|(mask==0),0,1).astype('uint8')img_show=afterimg*mask2[:,:,np.newaxis]return img_showdef deal_license(licenseimg):'''车牌图片二值化'''#车牌变为灰度图像gray_img=cv2.cvtColor(licenseimg,cv2.COLOR_BGR2GRAY)#均值滤波  去除噪声kernel=np.ones((3,3),np.float32)/9gray_img=cv2.filter2D(gray_img,-1,kernel)#二值化处理ret,thresh=cv2.threshold(gray_img,120,255,cv2.THRESH_BINARY)return threshdef find_end(start,arg,black,white,width,black_max,white_max):end=start+1for m in range(start+1,width-1):if (black[m] if arg else white[m])>(0.98*black_max if arg else 0.98*white_max):end=mbreakreturn endif __name__=='__main__':img=cv2.imread('car.jpg',cv2.IMREAD_COLOR)#预处理图像rect,afterimg=find_license(img)#框出车牌号cv2.rectangle(afterimg,(rect[0],rect[1]),(rect[2],rect[3]),(0,255,0),2)cv2.imshow('afterimg',afterimg)#分割车牌与背景cutimg=cut_license(afterimg,rect)cv2.imshow('cutimg',cutimg)#二值化生成黑白图thresh=deal_license(cutimg)cv2.imshow('thresh',thresh)cv2.imwrite("cp.jpg",thresh)cv2.waitKey(0)#分割字符'''判断底色和字色'''#记录黑白像素总和white=[]black=[]height=thresh.shape[0]  #263width=thresh.shape[1]   #400#print('height',height)#print('width',width)white_max=0black_max=0#计算每一列的黑白像素总和for i in range(width):line_white=0line_black=0for j in range(height):if thresh[j][i]==255:line_white+=1if thresh[j][i]==0:line_black+=1white_max=max(white_max,line_white)black_max=max(black_max,line_black)white.append(line_white)black.append(line_black)print('white',white)print('black',black)#arg为true表示黑底白字,False为白底黑字arg=Trueif black_max<white_max:arg=Falsen=1start=1end=2while n<width-2:n+=1#判断是白底黑字还是黑底白字  0.05参数对应上面的0.95 可作调整if(white[n] if arg else black[n])>(0.02*white_max if arg else 0.02*black_max):start=nend=find_end(start,arg,black,white,width,black_max,white_max)n=endif end-start>5:cj=thresh[1:height,start:end]cv2.imshow('cutlicense',cj)cv2.waitKey(0)cv2.waitKey(0)cv2.destroyAllWindows()

输出结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/91533.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【佳佳怪文献分享】MVFusion: 利用语义对齐的多视角 3D 物体检测雷达和相机融合

标题&#xff1a;MVFusion: Multi-View 3D Object Detection with Semantic-aligned Radar and Camera Fusion 作者&#xff1a;Zizhang Wu , Guilian Chen , Yuanzhu Gan , Lei Wang , Jian Pu 来源&#xff1a;2023 IEEE International Conference on Robotics and Automat…

【Mariadb高可用MHA】

目录 一、概述 1.概念 2.组成 3.特点 4.工作原理 二、案例介绍 1.192.168.42.3 2.192.168.42.4 3.192.168.42.5 4.192.168.42.6 三、实际构建MHA 1.ssh免密登录 1.1 所有节点配置hosts 1.2 192.168.42.3 1.3 192.168.42.4 1.4 192.168.42.5 1.5 192.168.42.6 …

【深入理解ES6】块级作用域绑定

1. var声明及变量提升机制 提升&#xff08;Hoisting&#xff09;机制&#xff1a;通过关键字var声明的变量&#xff0c;都会被当成在当前作用域顶部生命的变量。 function getValue(condition){if(condition){var value "blue";console.log(value);}else{// 此处…

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具&#xff0c;点击Network&#xff0c;点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口&#xff08;不行&#xff0c;认证不通…

Android Settings 无障碍设置显示大小页面重复加载问题

基于Android 11&#xff0c;跟踪源码 显示大小页面 packages/apps/Settings/src/com/android/settings/display/PreviewSeekBarPreferenceFragment.java 通过commit() 提交更新页面显示大小。该方法是是在其父类PreviewSeekBarPreferenceFragment 实现调用。 基类预览滑动进度…

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考…

修改第三方组件默认样式

深度选择器 修改el-input的样式&#xff1a; <el-input class"input-area"></el-input>查看DOM结构&#xff1a; 原本使用 /deep/ 但是可能不兼容 使用 :deep .input-area {:deep(.el-input__inner){background-color: blue;} }将 input 框背景色改为…

龙蜥社区安全联盟(OASA)正式成立,启明星辰、绿盟、360 等 23 家厂商重磅加入

7 月 28 日&#xff0c;由启明星辰、绿盟、360、阿里云、统信软件、浪潮信息、中兴通讯&#xff5c;中兴新支点、Intel、中科院软件所等 23 家单位共同发起的龙蜥社区安全联盟&#xff08;OASA&#xff0c;OpenAnolisSecurityAlliance&#xff09;&#xff08;以下简称“安全联…

tensorflow / tensorflow-gpu cuda cudNN tensorRT 安装,启用显卡加速

tensorflow / tensorflow-gpu cuda cudNN tensorRT 安装,启用显卡加速 说明 Tensorflow-GPU 已被移除。请安装 tensorflow 。 tensorflow 通过 Nvidia CUDA 支持 GPU 加速操作。 自 2019 年 9月发布 的 TensorFlow2.1 以来&#xff0c;tensorFlow 和 tensorflow-GPU 一直是同…

如何进行游戏平台搭建?

游戏平台搭建涉及多个步骤和技术&#xff0c;下面是一个大致的指南&#xff1a; 市场调研和定位&#xff1a;首先&#xff0c;要了解游戏市场和受众的需求&#xff0c;选择适合的游戏类型和定位。 选择平台类型&#xff1a;决定是要搭建网页平台、移动应用平台还是其他类型的…

SCF金融公链新加坡启动会 创新驱动未来

新加坡迎来一场引人瞩目的金融科技盛会&#xff0c;SCF金融公链启动会于2023年8月13日盛大举行。这一受瞩目的活动将为金融科技领域注入新的活力&#xff0c;并为广大投资者、合作伙伴以及关注区块链发展的人士提供一个难得的交流平台。 在SCF金融公链启动会上&#xff0c; Wil…

grafana 的 ws websocket 连接不上的解决方式

使用了多层的代理方式&#xff0c;一层没有此问题 错误 WebSocket connection to ‘wss://ip地址/grafana01/api/live/ws’ failed: 日志报错 msg“Request Completed” methodGET path/api/live/ws status403 解决方式 # allowed_origins is a comma-separated list of o…

数据治理:打造可信赖的BI环境

章节一&#xff1a;引言 随着信息时代的不断发展&#xff0c;数据已经成为企业决策的重要支撑。而在大数据时代&#xff0c;海量的数据需要被整理、分析&#xff0c;以便为企业提供正确的指导。商业智能&#xff08;BI&#xff09;系统的兴起为企业提供了强大的数据分析能力&am…

基于Bsdiff差分算法的汽车OTA升级技术研究(学习)

摘要 针对汽车OTA整包升级时&#xff0c;用户下载时间长&#xff0c;升级时间长&#xff0c;设备服务器端压力大等问题&#xff0c;本文提出了一种基于Bsdiff差分算法的汽车OTA升级技术。该算法能够对比新旧版本的差异&#xff0c;进行差分文件下载&#xff0c;减少软件包的下…

Mariadb高可用MHA

本节主要学习了Mariadb高可用MHA的概述&#xff0c;案例如何构建MHA 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、概述 1、概念 MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。…

【图像分类】理论篇 (4)图像增强opencv实现

随机旋转 随机旋转是一种图像增强技术&#xff0c;它通过将图像以随机角度进行旋转来增加数据的多样性&#xff0c;从而帮助改善模型的鲁棒性和泛化能力。这在训练深度学习模型时尤其有用&#xff0c;可以使模型更好地适应各种角度的输入。 原图像&#xff1a; 旋转后的图像&…

复习1-2天【80天学习完《深入理解计算机系统》】第六天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

Ubuntu 连接海康智能相机步骤(亲测,成功读码)

ubuntu20.04下连接海康智能相机 Ubuntu 连接海康智能相机步骤(亲测&#xff0c;已成功读码)输出的结果 Ubuntu 连接海康智能相机步骤(亲测&#xff0c;已成功读码) (就是按照海康的提供的步骤和源码连接相机&#xff0c;流水账) 安装Ubuntu20.04安装gcc和g&#xff0c;IDmvs只…

OpenHarmony Meetup 广州站 OpenHarmony正当时—技术开源

招募令 OpenHarmony Meetup 广州站 火热招募中&#xff0c;等待激情四射的开发者&#xff0c;线下参与OpenHarmonyMeetup线下交流 展示前沿技术、探讨未来可能、让你了解更多专属OpenHarmony的魅力 线下参与&#xff0c;先到先得,仅限20个名额&#xff01; 报名截止时间8月23日…