opencv车牌字符分割网络识别字符巴尔扎克

最近在复习OPENCV的知识,学习caffe的深度神经网络,正好想起以前做过的车牌识别项目,可以拿出来研究下

以前的环境是VS2013和OpenCV2.4.9,感觉OpenCV2.4.9是个经典版本啊!不过要使用caffe模型的话,还是要最新的OpenCV3.3更合适!

一、车牌图片库

里面有数字 “0-9”,字母“A-Z”的训练图片各50张。

测试车牌图片当时是从他人得到已经定位到车牌的图片,类似如下:

目标当然就是对这些车牌图片进行预处理,单字符分割,单字符识别!

二、预处理

图像的预处理做来做去就是滤波去噪,光照补偿,灰度/二值化,形态学基本操作等等。这些图片都是自然场景得到所以基本的去噪操作可以做一下,然后为了单字符分割,灰度化和形态学可以结合效果调整。

光照补偿其实一直是个问题,大多数有直方图均衡化,亮度参考白,利用公式统计补偿图片。这方面也可以结合图像增强方法来做!笔者当时觉得前两者对大多数场景已经适用。

二值化可以使用 cv::threshold函数,如:

第一行imread(),由于flag设为1所以读的是彩图,采用cvtColor函数转化为灰度图。如果你读入就是灰度图可以省略第二行代码。第三行就是转化为二值化函数,阈值100可以修改,在灰度对比不明显是有必要!

如果预处理做的好,某些小的白色区域是可以去掉的。这个效果也可以识别。

同时可以发现车牌外围被一圈白色包围,如若能去除外围白色,对于单字符分割更有益。但其实通过寻找列像素之间的变化,白色区域只是影响了阈值不会对结果太大影响。

如果想要使用直方图均衡化,OPENCV有equalizeHist(inputmat, outputmat);非常方便,但是效果不好。

使用直方图均衡化后的上述车牌二值化图片:

效果更惨烈了,因为均衡化就是让直方图的像素分布更加平衡,上图黑色多,均衡之后自然白色多了,反而不好!

二、单字符分割

单字符分割主要策略就是检测列像素的总和变化,因为没有字符的区域基本是黑色,像素值低;有字符的区域白色较多,列像素和就变大了!

列像素变化的阈值是个问题,看到很多博客是固定的阈值进行检测,除非你处理后的二值化图像非常完美,不然有的图片混入了白色区域就会分割错误!而且对于得到分割宽度如果太小也应该使用策略进行剔除,没有一定的宽度限制分割后的图片可能是很多个窄窄的小区域。。。

笔者思路也很简单:

首先统计所有列像素的总和,取其列像素的均值作为参考标准之一(也可以选用其他数学指标参考),列像素的阈值Tsum设置为列像素均值的百分比(如60%,是情景定)。

利用cutLeft()函数对图片进行列扫描,将列像素超过阈值的列标记为左边,再继续寻找右边,将满足阈值的右边进行标记。左右相减即可得到宽度分割字符。

考虑到车牌中只有7个字符,所以先判断得到宽度大小,如果小于总宽的七分之一视为干扰放弃;其实也可以加大到总宽的8分之一(因为车牌中间可能有连接符)。

getColSum()函数是求一列的像素和,这里用到了.at<> 方式,其实还有别的方法也可以,只要获得当前的像素值,并累加整列即可!

上图车牌的分割效果:

因为第三张有车牌的连接符,所以导致第三张和第四张稍有瑕疵,但总体分割还是满意的!

三、单字符识别

只论字符识别其实有不少选择方案,一开始笔者尝试了ORB特征,想利用特征匹配计算相似度来判断最优的字符结果。ORB特征相比SURF/SIFT更加快速,而且特征不变性也不错。但是在匹配时发现单字符的图片像素点太少,提取的特征点数极少,无法得到较好的匹配结果,只能放弃!

其实也有模板匹配来做字符识别的,但是OPENCV提供的模板匹配对于从同一副图片提取的模板图去匹配样本图效果很好,不是同一副图片时效果很一般。因为笔者用OPENCV的模板匹配一般用来找重复区域。

OCR识别是可以完全用在此处的,OCR识别甚至可以识别汉字,安装OCR的库之后就可以尝试一番!

笔者最后选择了神经网络ANN来做字符分类识别,利用SVM也可以都是分类器之一。使用神经网络可以和caffe的mnist模型有所对比的感觉!

ann10函数主要完成读取图片训练ANN网络的功能。

注意点:

修改图片文件类型  fileform;

修改训练图片路径  perfileReadPath等;

修改训练图片数量  sample_mun_perclass;

修改训练类别数  class_mun;(34类是因为IO与10很像,所以少了两类);

image_cols和image_rows根据自己图片情况修改;

predictann函数就是调用ann10函数生成的网络模型文件,进行预测分类的功能。

上述车牌的单字符识别效果如下:

可以看到有的相似度很高,有的却很低,也有一些识别错误的,我不再显示。。。

相比之前使用的caffe  mnist识别率真的是差距有点大,以后有机会将mnist的模型来识别车牌字符试试~~

度盘失效了,附上我的github地址,里面会传数据集和完整代码!欢迎大家star 和 fork 我~~

THE END
0.训练车牌数据集(umpy.ndarray格式数据)实现车牌照片字符识别并利用CNN-OCR算法训练车牌数据集评估模型并实现车牌照片字符识别,训练中的车牌数据集是Numpy.ndarray格式数据,当然也可以进一步生成图片,方便直接查看。 输出结果 gen_sample之后 1、训练感悟 22:58训练记录:我勒个去,跑了半天,准确度还没上来,啊啊啊,要疯了…… jvzq<84yyy4489iqe0ipo8hqpvkov87312?3:86:19=27A569a?:9>55357/uqyon
1.CNN——基于CNN的车牌号识别cnn车牌识别CNN——基于CNN的车牌号识别 本文介绍了一个基于卷积神经网络(CNN)的车牌识别系统。该系统将车牌识别任务分解为省份、发牌单位及字母数字识别三个子任务,并详细描述了数据集构建、图像预处理、CNN模型设计与训练过程。 car-board-reg 基于CNN的车牌号识别jvzquC41dnuh0lxfp0tfv8ooj3?:88ftvkimg8igvcomu8=:;778;@4
2.构建高效中文车牌识别系统的全面数据资源简介:车牌字符集是开发和优化车牌识别系统的关键资源。本文探讨了包括数字、英文字母和中国各省份简称在内的最全中文车牌字符集的内容和用途,以及如何利用这些数据进行模型训练和车牌识别。介绍了数据集格式、训练深度学习模型的方法、模型评估与优化过程,以及中文车牌字符集在智能交通系统等领域的广泛应用。 jvzquC41dnuh0lxfp0tfv8|gkzooa<:977;748ftvkimg8igvcomu866466::<<
3.Python+Tensorflow+CNN实现车牌识别的示例代码python在噪声干扰情况下,车牌字符分割较困难,此次车牌识别是将车牌7个字符同时训练,字符包括31个省份简称、10个阿拉伯数字、24个英文字母('O'和'I'除外),共有65个类别,7个字符使用单独的loss函数进行训练。 (运行环境:tensorflow1.14.0-GPU版) 二、生成车牌数据集 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 jvzquC41yy}/lk:30pku1jwvkerf1:<3847/j}r
4.36个省车牌名称和字母国内并没有36个省,而是34个省级行政区,包括23个省、5个自治区、4个直辖市、2个特别行政区;其34个行政区的车牌简称和字母代表如下: 1、北京市(京) 京A(含公交)、京B(出租车)、京C、京D(警车)、京E、京F、京G、京H、京J、京K、京L、京M 、京N、京P、京Q(城区)、京Y (远郊区) jvzquC41yy}/{xtlkc4dqv4cum5266637;967;=:23:97>7;454ivvq
5.TensorFlow基于MNIST数据集实现车牌识别(初步演示版)python现在我们不妨酝酿一个大胆的想法:在TensorFlow中通过卷积神经网络+mnist数字集实现车牌识别。 实际上车牌字符除了数字0-9,还有字母A-Z,以及各省份的简称。只包含数字0-9的mnist是不足以识别车牌的。故本文所做实验仅出于演示目的。 由于车牌数字是正体,而mnist是手写体,为提高识别率,需要从mnist图片集中挑选出形状jvzquC41yy}/lk:30pku1jwvkerf1:;8;68/j}r
6.t83cv101出入口车牌识别网络一体化摄像机操作手册.pdft83-cv101出入口车牌识别网络一体化摄像机操作手册.pdf,T83-CV101 出入 口车牌识别高清网 络一体化摄像机操 作手册 T83-CV101 出入口车牌识别高清网络一体化摄像机操作手册 非常感谢您购买我司产品,如您有任何疑问或需求请随时联系我们。 本手册适用于以下产品: 序号 产品jvzquC41oc~/dxtm33>/exr1jvsm1;5431633>4:2861996582642=<0ujzn
7.56个省车牌简称,全国车牌号识别地区大全车牌号是由省的简称+各个地级市的字母代码+5位车牌号组成。车牌号的第一位就是省的简称,以上就是各个省的简称。车牌号的第二位是英文字母,代表的是该车辆所在的地级市。地级市会根据排名来划分ABCDEFG等,5位车牌号是有三种规则来进行编码的,全部都使用阿拉伯数字、2位英文字母加3位阿拉伯数字,但是O和I不可以jvzquC41yy}/{xtlkc4dqv4cum54/B8966943?7947925:5;0jznn
8.TensorFlow车牌识别完整版(含车牌数据集)车牌字符数据集博主分享了如何使用TensorFlow进行完整的车牌识别,包括省份简称和字母,提供了车牌数据集(约4000张图片)及训练识别代码,通过训练可以实现高准确率的车牌号码识别。 在之前发布的一篇博文《MNIST数据集实现车牌识别--初步演示版》中,我们演示了如何使用TensorFlow进行车牌识别,但是,当时采用的数据集是MNIST数字手写体,只能分类jvzquC41dnuh0lxfp0tfv8XjcfuxP:ljv1gsvrhng1jfvjnnu1=97@63:9
9.【南京车牌识别停车场系统丨车牌识别道闸机丨车牌识别收费系统它是一个以特定目标为对象的专用计算机视觉系统,能从一幅图像中自动提取车牌图像,自动分割字符,进而对字符进行识别,它运用***的图像处理、模式识别和人工智能技术,对采集到的图像信息进行处理,能够实时准确地自动识别出车牌的数字、字母及汉字字符,并直接给出识别结果,使得车辆的电脑化监控和管理成为现实。 图为:车牌识别原理 识别核心汲取 jvzquC41yy}/eqnpc0io1lmwtwqpwsn15:>27A>;674ivvq
10.使用深度学习进行自动车牌检测和识别这可以通过人工代理或特殊智能设备实现,这些设备将允许在真实环境中通过车辆牌照识别车辆。在智能设备中,,提到了车辆牌照检测和识别系统。车辆牌照检测和识别系统用于检测车牌,然后识别车牌,即从图像中提取文本,所有这一切都归功于使用定位算法的计算模块,车牌分割和字符识别。车牌检测和读取是一种智能系统,由于其在以下jvzquC41yy}/gnuy0eun0ls1|j{bpufp14654B;0jvsm