您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > NumberPlate
Chapter5主要内容•ANPR(AutomaticNumberPlateRecognition)•Platedetection•PlaterecognitionIntroductiontoANPR如果我们使用一个带有红外线投影结构和滤波的摄像机,我们使用带有红外线的摄像机重新获取,将得到一个非常高质量的照片用来分割和随后的检测和识别车牌数字。即不依赖于任何光线环境。ANPRalgorithmtwomainsteps:1.车牌的检测(platedetection)车牌检测就是检测车牌在整个图像帧中的位置。2.车牌的识别(platerecognition)用OCR算法来决定车牌上的字母数字的字符。车牌分割是否存在车牌区域SVM车牌分割是否存在车牌区域显示识别的车牌神经网络特征提取是否退出程序结束是不是车牌否是否车牌检测车牌识别PlatedetectionTwoSteps:1.Segmentation(分割)我们应用不同的滤波器,形态学操作,轮廓算法,确认获取图像的这些部分可能有一个车牌。2.Classification(分类)我们采用支持向量机(SVM)分类出每个图像部分.高斯滤波Sobel滤波Otsu阈值法wo:分开后前景像素点数占图像的比例uo:分开后前景像素点的平均灰度w1:分开后背景像素点数占图像的比例u1:分开后背景像素点的平均灰度u=w0*u0+w1*u1:图像总平均灰度从L个灰度级遍历t,使得t为某个值的时候,前景和背景的方差最大,则这个t值便是我们要求得的阈值。Segmentation先膨胀后腐蚀的过程称为闭运算膨胀就是求局部最大值的操作,计算核B覆盖的区域的像素点的最大值,并把这个最大值赋值给参考点指定的像素。这样就会使图像中的高亮区域逐渐增长(白色区域变大)。膨胀和腐蚀是相反的一对操作,所以腐蚀就是求局部最小值的操作。闭运算能够排除小型黑洞(黑色区域),连接断开区域。闭形态学算子SegmentationminAreaRect(提取轮廓的最小矩形边界框)。函数返回一个旋转矩形类对象:RotatedRect。接下来我们知道的车牌尺寸就派上用场了,车牌大小是520*110mm,如果宽高比大于为520/110=4.727272(车牌宽除以车牌高)(允许带有40%的误差)和边界在15像素和125像素高的区域,我们才认为是一个车牌区域。SegmentationboolDetectRegions::verifySizes(RotatedRectcandidate){floaterror=0.4;//Spaincarplatesize:52x11aspect4,7272constfloataspect=4.7272;//Setaminandmaxarea.Allotherpatchesarediscardedintmin=15*aspect*15;//minimumareaintmax=125*aspect*125;//maximumarea//Getonlypatchesthatmatchtoarespectratio.floatrmin=aspect-aspect*error;floatrmax=aspect+aspect*error;intarea=candidate.size.height*candidate.size.width;floatr=(float)candidate.size.width/(float)candidate.size.height;if(r1)r=1/r;if((areamin||areamax)||(rrmin||rrmax)){returnfalse;}else{returntrue;}}Segmentation由于每个车牌都包含白色背景属性。我们为了更精确的裁剪图像,可以使用floodfill算法【用指定颜色填充某一密闭区域,相当于油漆桶的功能】来提取那些旋转的矩形。算法的原理很简单,就是从一个点开始附近像素点,填充成新的颜色,直到封闭区域内的所有像素点都被填充新颜色为止。漫水填充法是一种用特定的颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的方法。漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析。所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色intfloodFill(InputOutputArrayimage,InputOutputArraymask,PointseedPoint,ScalarnewVal,Rect*rect=0,ScalarloDiff=Scalar(),ScalarupDiff=Scalar(),intflags=4)SegmentationSegmentationSegmentation检查新的漫水填充块是不是一个正确的块。(因为使用车牌,车牌有边界,漫水填充不会超过车牌的边界,而对于其他区域(检查出来的矩形)漫水填充会占据很多区域,形成的矩形也很大,再进入verifySizes函数时,可能就会被丢弃,得到更可能是车牌的区域)再次得到所有的最小旋转矩形(minAreaRect)Segmentation分割过程已经完成并且我们得到了有效的区域。我们能够修剪每一个检测到的区域,去掉那些可能存在的旋转,修剪图像区域Segmentation直方图均衡化直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。增强对比度,整体上丰富细节。SegmentationYourSubtopicsGoHereClassification我们预处理和分割图像的所有可能部分之后,我们现在需要判别每一个分割是不是一个车牌。我们使用SupportVectorMachine(SVM)算法来达成。支持向量机本身便是一种监督式学习的方法,监督式学习(Supervisedlearning),是一个机器学习中的方法,可以由训练资料中学到或建立一个模式,并依此模式推测新的实例。训练资料是由输入物件(通常是向量)和预期输出所组成。Classification支持向量就是离分界线最近的向量。也就是说分界面是靠这些向量确定的,他们支撑着分类面。Classification在任一分类之前的第一个任务是训练我们的分类器。这项工作的完成优先于开始主要的应用程序。它被称为离线训练。用大小为144*33的75张车牌和35非车牌来训练我们的系统。在实际的应用中,我们需要训练更多的数据。Classification在训练前,我们需要把正样本(即车牌)以及负样本存放起来用作后续调用。机器学习的Opencv算法训练的数据存储在一个N*M的矩阵中,N表示样本数,M表示特征数。每个数据集作为一行存储在训练矩阵中(就是N*M个像素点,展开成一行,作为训练矩阵的N*M个特征。类别存储在另外一个大小为N*1的矩阵中。每一个类通过一个浮点数来识别。Classification第一步得到的图片是144*33像素的。有N个样本(原工程使用的是111)。所以训练数据是一个111*4752的矩阵。类别存储矩阵是一个111*1的矩阵。Classification有了训练数据,接下来我们就要训练分类器了。我们需要设置SVM参数,定义最基本的参数来供SVM算法的使用。我们使用CvSVMParam结构来定义它。利用CvSVMParams类实现类内的成员变量svm_type表示SVM类型:CvSVM::C_SVCC-SVCCvSVM::NU_SVCv-SVCCvSVM::ONE_CLASS一类SVMCvSVM::EPS_SVRe-SVRCvSVM::NU_SVRv-SVR成员变量kernel_type表示核函数的类型:CvSVM::LINEAR线性:u‘vCvSVM::POLY多项式:(r*u'v+coef0)^degreeCvSVM::RBFRBF函数:exp(-r|u-v|^2)CvSVM::SIGMOIDsigmoid函数:tanh(r*u'v+coef0)ClassificationCvSVMsvmClassifier(SVM_TrainingData,SVM_Classes,Mat(),Mat(),SVM_params);我们的分类器准备好了,我们可以使用SVM类的predict函数来预测一个可能的修剪图像。这个函数返回类别i。在我们的实例中,我们标记每一个车牌类别为1,非车牌类别标记为0。对于每个检测到的区域,我们使用SVM来分出它是车牌还是非车牌,并且只保存正确的响应。Platerecognition车牌识别目标的第二步就是用光学字符识别来获取车牌上的字符。对于每个检测到的车牌,我开始分割车牌得到每个字符,并且使用人工神经网络机器学习算法来识别字符。处理方法与Segmentation类似输入为上面经由分割和SVM处理后得到的车牌。对输入的车牌二值化处理(threshold),求轮廓(findContours),计算矩形边界(boundingRect)因为数字和字符的尺寸为45*77,类似的,使用verifySizes排除非字符的元素。取出每个得到的矩形边界就得到了每个字符。OCRsegmentationFeatureextraction在上一步中,已经取出了车牌中单个的字符,接下来需要提取字符中的特征来训练神经网络算法。提取特征的步骤:1.对于每一个字符,我们用countNonZero计算每一行或者每一列的非零的个数,把他们存储在一个新的数据矩阵mhist中。intcvCountNonZero(constCvArr*arr);2.把得到的20*20的单个字符转化成15*15的字符。resize(in,lowData,Size(sizeData,sizeData));Featureextraction那么我们提取出的每一个字符的特征有多少个元素呢?20+20+15*15=265把每个得到的字符进行相应处理后,作为训练集来训练神经网络以进行字符的识别。存储的方法与之前类似。西班牙车牌共有30种字符'0','1','2','3','4','5','6','7','8','9','B','C','D','F','G','H','J','K','L','M','N','P','R','S','T','V','W','X','Y','Z'Featureextraction一共有671个训练样本,所以得到的矩阵为671*265,类别矩阵为671*1.OCRclassification在分类这一步,我们使用人工神经网络机器学习算法(多层感知器(MLP))。人工神经网络(artificialneuralnetwork,缩写ANN),简称神经网络(neuralnetwork,缩写NN),是一种模仿生物神经网络的结构和功能的数学模型或计算模型。神经网络由大量的人工神经元联结进行计算。OCRclassification单个神经元。a1~an为输入向量的各个分量w1~wn为神经元各个突触的权值b为偏置f为传递函数。t为神经元输出数学表示OCRclassificationMLP(Multi-layerPerceptron:多层感知器)神经网络有一个输入层,输出层和一个或多个隐层。每一层有一个活多个神经元连接着前向和后向层。下面的例子表示一个3层感知器。我们使用的就是这种结构。OCRclassification感知器学习OCRclassification这里只采用单隐层,包含10个神经元。输入层为671行,输出层为30行。Traindata(671*265)Trainclasses(671*30)Input(1*265)Output(1*30)OCRclassification当一对学习样本提供给网络后,神经元的激活值从输
本文标题:NumberPlate
链接地址:https://www.777doc.com/doc-2889945 .html