EasyPR车牌检测 Java

近期处理项目中遇到车牌识别的需求, 最终选择使用EasyPR进行车牌检测 该部分包括:SVM训练、车号定位、车牌判断。

流程说明

在这里插入图片描述
在这里插入图片描述

车牌定位—Plate Locate 之一

高斯模糊 1

一、高斯模糊的目标:对图像去噪,为边缘检测算法做准备。 
二、车牌定位中的第一步就是高斯模糊处理

//高斯模糊。Size中的数字影响车牌定位的效果。
GaussianBlur( src,
src_blur,
Size(m_GaussianBlurSize, m_GaussianBlurSize), 0, 0, BORDER_DEFAULT );
Size字段的参数指定了高斯模糊的半径。值是CPlateLocate类的m_GaussianBlurSize变量。
由于opencv的高斯模糊仅接收奇数的半径,因此变量为偶数值会抛出异常
在这里插入图片描述
在这里插入图片描述

高斯模糊 2

1、不使用高斯模糊
如果不使用高斯模糊而直接用边缘检测算法,我们得到的候选“车牌”会增多!
还会影响闭操作时,候选“车牌”图块的质量。
这样不仅会增加车牌判断的处理时间,还增加了判断出错的概率。由于得到的车牌图块中车牌是斜着的,如果我们的字符识别算法需要一个水平的车牌图块,那么几乎肯定我们会无法得到正确的字符识别效果

2、高斯模糊中的半径
半径也会给结果带来明显的变化。有的图片,高斯模糊半径过高了,车牌就定位不出来。有的图片,高斯模糊半径偏低了,车牌也定位不出来。因此、高斯模糊的半径既不宜过高,也不能过低。
CPlateLocate类中推荐的高斯模糊的半径DEFAULT_GAUSSIANBLUR_SIZE =5。
这个值是对于近千张图片经过测试后得出的综合定位率最高的一个值。在CPlateLocate类的构造函数中,m_GaussianBlurSize被赋予了DEFAULT_GAUSSIANBLUR_SIZE的值,因此,默认的高斯模糊的半径就是5。如果不是特殊情况,不需要修改它

如需要修改,请参考:
CPlateLocate plate;
plate.setGaussianBlurSize(3);
在这里插入图片描述

车牌定位—Plate Locate 之二

灰度化处理

EasyPR的处理步骤是先进行高斯模糊,再进行灰度化。从目前的实验结果来看,

1、先高斯模糊、后灰度
2、先灰度,后高斯模糊

以上两种,1、先高斯模糊、后灰度过程更容易检测到边缘点

灰度目标:为边缘检测算法准备灰度化环境。
为什么要灰度化处理?
(1)对于计算机而言,色彩图像相对于灰度图像难处理多了,
(2)很多图像处理算法只适用于灰度图像,例如Sobel算子。在这种情况下,除了把图片转成灰度图像再进行处理别无它法,除非重新设计算法灰度图像,就必须借助水平,垂直求导等方法。
在这里插入图片描述

车牌定位—Plate Locate 之三

Sobel算子

Sobel目标:检测图像中的垂直边缘,便于区分车牌。
为什么要Sobel处理?
(1)没有Sobel算子,也就没有垂直边缘的检测,也就无法得到车牌的可能位置,也就没有后面的一系列的车牌判断、字符识别过程,
(2)通过Sobel算子,可以很方便的得到车牌的一个相对准确的位置
(3)通过Sobel算子,将车牌中的字符与车的背景明显区分开来
Soble算子原理是对图像求一阶的水平与垂直方向导数,根据导数值的大小来判断是否是边缘
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

车牌定位—Plate Locate 之四

二值化 1

通过二值化处理将Sobel生成的灰度图像转变为二值图像,二值化算法非常简单,就是对图像的每个像素做一个阈值处理
为后续的形态学算子Morph等准备二值化的图像,二值化图像中的白色是没有颜色强与暗的区别的。

在灰度图像中,每个像素的值是0-255之间的数字,代表灰暗的程度。如果设定一个阈值T,规定像素的值x满足如下条件时则:
如此,每个像素的值仅有 {0, 1} 两种取值,0代表黑、1代表白,图像就被转换成了二值化的图像。

在上面的公式中,阈值T应该取多少?由于不同图像的光造程度不同,导致作为二值化区分的阈值T也不一样。
因此一个简单的做法是直接使用opencv的二值化函数时加上自适应阈值参数。如:

CV_THRESH_OTSU : 代表自适应阈值,
CV_THRESH_BINARY : 代表正二值化

正二值化意味着像素的值越接近0,越可能被赋值为0,反之则为1。而另外一种二值化方法表示反二值化,其含义是像素的值越接近0,越可能被赋值1,,
计算公式如下:
if x < t then x = 1; if x >= t then x = 0,

如果想使用反二值化,可以使用参数 CV_THRESH_BINARY_INV 代替 CV_THRESH_BINARY 即可。
在后面的字符识别中我们会同时使用到正二值化与反二值化两种例子。
因为中国的车牌最常见的是蓝牌和黄牌。其中蓝牌字符浅,背景深(正二值化处理蓝牌),黄牌则是字符深,背景浅(反二值化处理黄牌)。

二值化 2

threshold(src, dest, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);

CV_THRESH_OTSU : 代表自适应阈值, CV_THRESH_BINARY : 代表正二值化
CV_THRESH_BINARY_INV : 代表反二值化
蓝牌字符浅,背景深(正二值化处理蓝牌),黄牌则是字符深,背景浅(反二值化处理黄牌)。
在这里插入图片描述

车牌定位——Plate Locate 之五

闭操作

目标: 将车牌字母连接成为一个连通域,便于取轮廓。
在做闭操作的说明前,必须简单介绍一下腐蚀和膨胀两个操作。在图像处理技术中,有一些的操作会对图像的形态发生改变,这些操作一般称之为形态学操作。形态学操作的对象是二值化图像。有名的形态学操作中包括腐蚀,膨胀,开操作,闭操作等。其中腐蚀,膨胀是许多形态学操作的基础

腐蚀操作:是将物体的边缘加以腐蚀。具体的操作方法是拿一个宽m,高n的矩形作为模板,对图像中的每一个像素x做如下处理:
像素x至于模板的中心,根据模版的大小,遍历所有被模板覆盖的其他像素,修改像素x的值为所有像素中最小的值。这样操作的结果是会将图像外围的突出点加以腐蚀

膨胀操作:膨胀操作与腐蚀操作相反,是将图像的轮廓加以膨胀。
操作方法与腐蚀操作类似,也是拿一个矩形模板,对图像的每个像素做遍历处理。不同之处在于修改像素的值不是所有像素中最小的值,而是最大的值。这样操作的结果会将图像外围的突出点连接并向外延伸

在这里插入图片描述

闭操作 2

开操作:开操作就是对图像先腐蚀,再膨胀。其中腐蚀与膨胀使用的模板是一样大小的。
在这里插入图片描述
闭操作:闭操作就是对图像先膨胀,再腐蚀。
闭操作的结果一般是可以将许多靠近的图块相连称为一个无突起的连通域。
在我们的图像定位中,使用了闭操作去连接所有的字符小图块,然后形成一个车牌的大致轮廓
在opencv中,调用闭操作的方法是首先建立矩形模板,矩形的大小是可以设置的,
由于矩形是用来覆盖以中心像素的所有其他像素,因此矩形的宽和高最好是奇数。通过以下代码设置矩形的宽和高。
Mat element = getStructuringElement(MORPH_RECT, Size(m_MorphSizeWidth, m_MorphSizeHeight) );
在这里,我们使用了类成员变量,这两个类成员变量在构造函数中被赋予了初始值。
宽是17,高是3.
morphologyEx(img_threshold, img_threshold, MORPH_CLOSE, element);
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

车牌定位——Plate Locate 之六

取轮廓

将连通域的外围勾画出来,便于形成外接矩形。

在图中,红色的线条就是轮廓,可以看到,有非常多的轮廓。
取轮廓操作就是将图像中的所有独立的不与外界有交接的图块取出来。然后根据这些轮廓,
求这些轮廓的最小外接矩形。这里面需要注意的是这里用的矩形是 RotatedRect,意思是可旋转的。
因此我们得到的矩形不是水平的,这样就为处理倾斜的车牌打下了基础。
在这里插入图片描述
在这里插入图片描述

车牌定位——Plate Locate 之七

尺寸判断

排除不可能是车牌的矩形。 
经过尺寸判断,会排除大量由轮廓生成的不合适尺寸的最小外接矩形。在原先的verifySizes方法中,使用的是针对西班牙车牌的检测。而我们的系统需要检测的是中国的车牌。因此需要对中国的车牌大小有一个认识。
中国车牌的一般大小是 [ 440mm140mm ],面积为 [ 440140 ],宽高比为 3.14。verifySizes 使用如下方法判断矩形是否是车牌:
1.设立一个偏差率 error,根据这个偏差率计算最大和最小的宽高比 rmax、rmin。判断矩形的 r 是否满足在 rmax、rmin之间。
2.设定一个面积最大值 max 与面积最小值 min。判断矩形的面积 area 是否满足在 max 与 min 之间。以上两个条件必须同时满足,任何一个不满足都代表这不是车牌。偏差率和面积最大值、最小值都可以通过参数设置进行修改,且他们都有一个默认值。如果发现 verifySizes 方法无法发现你图中的车牌,试着修改这些参数。另外,verifySizes 方法是可选的。也可以不进行 verifySizes 直接处理,但会大大加重后面的车牌判断的压力。
一般来说,合理的 verifySizes 能够去除90%不合适的矩形。
在这里插入图片描述

车牌定位——Plate Locate 之八

角度判断

排除不可能是车牌的矩形, 角度判断操作通过角度进一步排除一部分车牌。
通过 verifySizes 的矩形,还必须进行一个筛选,即角度判断。一般来说,在一副图片中,车牌不太会有非常大的倾斜,
我们做如下规定:如果一个矩形的偏斜角度大于某个角度(例如30度),则认为不是车牌并舍弃,对上面的尺寸判断结果的六个黄色矩形应用角度判断后结果如下图

原先的6个候选矩形只剩3个。车牌两侧的车灯的矩形被成功筛选出来。角度判断会去除verifySizes筛选余下的7%矩形,使得最终进入车牌判断环节的矩形只有原先的全部矩形的3%
在这里插入图片描述

车牌定位——Plate Locate 之九

旋转

旋转操作是为后面的车牌判断与字符识别提高成功率的关键环节。

旋转操作将偏斜的车牌调整为水平。
可以看出,没有旋转操作的车牌是倾斜,加大了后续车牌判断与字符识别的难度。因此最好需要对车牌进行旋转。
在角度判定阈值内的车牌矩形,我们会根据它偏转的角度进行一个旋转,保证最后得到的矩形是水平的。调用的opencv函数如下:
在这里插入图片描述

车牌定位——Plate Locate 之十

统一尺寸

我们把这些候选车牌导入机器学习模型之前,需要确保他们的尺寸一致。
机器学习模型在预测的时候,是通过模型输入的特征来判断的。我们的车牌判断模型的特征是所有的像素的值组成的矩阵。
因此,如果候选车牌的尺寸不一致,就无法被机器学习模型处理。因此需要用 resize 方法进行调整。
我们将车牌resize为 [ 宽度 136,高度36 ] 的矩形。

字符识别——Chars Recognition

通过Plate Detect 过程,从原图中获取可能是车牌的图块,再通过SVM模型, 判断该图块的集合, 从中找出符合车牌的图块。
将该车牌的图块,作为字符识别的输入。
在这里插入图片描述
在这里插入图片描述

训练数据——SVM、ANN模型

通过Plate Detect 过程,从原图中获取可能是车牌的图块,再通过SVM模型, 判断该图块的集合, 从中找出符合车牌的图块。
将该车牌的图块,作为字符识别的输入。
在这里插入图片描述

SVM训练

在这里插入图片描述

ANN训练

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值