HyperLPR车牌识别库代码分析(13)

2021SC@SDUSC

源代码下载地址:https://gitee.com/zeusees/HyperLPR

源码配置的详情见第一篇分析HyperLPR车牌识别库代码分析(13)_第1张图片

 本篇内容将总结之前所分析的demo.py和SimpleRecognizePlateByE2E()函数的前半部分:

一、demo.py是整个HyperLPR程序的入口文件

这部分首先用grr = cv2.imread("images_rec/2.jpg"),调用了opencv2imread函数导入图片,然后导入图像识别模型,这些模型是事先训练好的模型,接下来这部分代码调用了两个函数,一个是SimpleRecognizePlateByE2E,调用的第二个函数是drawRectBox,前者是输入图片,就能识别车牌上的文字及其置信度,后者的功能是将刚才生成的图片展示出来,并且打印出车牌文字以及置信度

二、SimpleRecognizePlateByE2E(self,image)函数

        SimpleRecognizePlateByE2E(self,image)函数是对车牌号进行识别的核心函数,它的算法思路是这样的:

1)、对导入的车牌文件(也就是图片)进行车牌粗定位,目的是找出图中所有的车牌,这部分是通过delectPlateRough函数实现的。

2)、找出所有车牌后,对图中所有车牌进行精定位,也就是沿着这些车牌的轮廓,将车牌裁剪下来,方便接下来对车牌内容进行识别,这项功能是通过finemappingVertical函数实现的。

3)、最后要对车牌进行文字识别,通过recognizeOne函数实现

detectPlateRough函数:

        首先是进行异常检测,如果top_bottom_padding_rate>0.2,会直接报错并且退出。

        接着定义了三个变量。height定义为输入图片的高度,padding定义为图片高度乘top_bottom_padding_rate,显然就是图片上下部分所占实际高度,scale是定义的一个比例系数,即图片的长除以图片的高。接着对图片进行了缩放,resize函数用于对图片进行缩放,缩放后高度统一。

        对图片进行裁剪,在高度这一维度上,将之前判定为上下边缘的部分裁剪掉,在长度这一维度上不进行裁剪,全部保留。padding是之前根据上下边缘占比乘以图片高度,算出来的上下边缘的实际高度,只选取图片从上边缘padding到下边缘resize_h-padding的部分,剩下的上下边缘予以舍弃。裁剪后的图片命名为image_color_cropped

        对图片进行格式转换,将刚才裁剪后的图片转换成灰度图片,这样就可以再用级联分类器进行模式识别。detectMultiScalecv2中进行模式识别的函数,它能够对输入的图片进行识别,识别出所有待识别模式(在这里是车牌)的位置坐标和大小,将其用矩vector表示并返回,存储在watches。最后一步就是对刚才模式识别出的结果进行处理。watches中存储的x,y,w,h,分别代表识别出的车牌的横坐标、纵坐标、水平宽度、竖直高度。对刚才识别出的每个车牌都进行处理,分别修改它们的横坐标、纵坐标,并扩大它们的宽度和高度,这样就扩大了识别出车牌的边框。最后用cropImage函数对它们进行裁剪,裁剪下来的就是粗识别出的车牌的边框。

modelFinemapping函数:

        首先它对输入的图片大小进行了调整,调整成为统一的大小,这样输入图片的大小就可以是任意的。接下来的部分,函数整体上就是一个卷积神经网络,它反复调用卷积(Conv2D)、激励(Activation)、池化(MaxPool2D)等函数,这说明在程序所建立的卷积神经网络中,卷积、激励和池化层都有多层并且间隔交错分布。处理完成后,最后用flatten函数对矩阵进行降维,转化为数组。

finemappingVertical函数:

        用modelFinemapping找出车牌左右边界的位置坐标,乘以原图的长image.shape[1],就找到了原图的车牌左右位置坐标,并分别用H,T表示。最后是输出裁剪后的图像,这样就完成了车牌精定位,精准裁剪了车牌有文字部分的左右边界之间的图像。

recognizeOne函数:

        recognizeOne的功能就是对车牌上的文字进行识别。在经历了前两个函数依次粗定位、精定位和裁剪之后,已经得到了比较精确的车牌图片,图片上只有车牌,不包含其他内容。recognizeOne输入的就是裁剪过的车牌照片,输出的是车牌上的文字。recognizeOne函数中调用的是modelSeqRec.predict函数进行预测,这个函数也是建立了一个卷积神经网络对图像进行处理,也进行了多次的卷积、激励和池化操作。此处的车牌字符信息识别不同于传统的字符识别方法,即先分割字符然后再逐一使用分类算法进行识别,而这里采用了OCR光学字符识别技术,不分割字符的前提下能够识别出车牌的七个字符。

你可能感兴趣的:(计算机视觉,图像处理,人工智能)