当前位置:首页 > 资讯 > 正文

【opencv】车牌定位及倾斜较正

目录

一. 车牌定位

0 流程

1 将原图像二值化得到黑白图像

基于颜色特征

基于边缘特征

2 筛选车牌区域

第一轮筛选(利用几何特征)

第二轮筛选(利用支持向量机)

3 车牌倾斜斜矫正

二. 车牌预处理

0 流程

1 车牌预处理 方法一:基于颜色特征和大津法二值化

1.1 蓝色车牌预处理

1.2 绿色车牌预处理

1.3 黄色车牌预处理

2 车牌预处理 方法二:基于k-means聚类

3 去除边框

4 二次校正(左右偏斜)

三. 字符分割

1 方法一:垂直投影找波峰

2 方法二:

3 两种方法对比

四. 字符识别

五 输出演示


 

输入:原图像

输出:得到分割出车牌列表

得到原图二值化图像 -> 轮廓检测 -> 长宽面积等筛选 -> svm筛选 -> 倾斜矫正

四次检测: 1 按照蓝色 2 按照绿色 3 按照黄色 4 按照边缘 得到四个车牌列表

基于颜色特征

以寻找蓝色车牌为例:选用BGR掩膜与S通道掩膜叠加 进行横向分量大的膨胀 得到二值图像

 

效果演示: mask_gbr 为 GBR通道掩膜所得二值图像

                    mask_s 为饱和度通道掩膜所得二值图像

                    image_bin 为 mask_gbr 和 mask_s与操作经腐蚀后最终结果

                    src 为原图像  【opencv】车牌定位及倾斜较正

【opencv】车牌定位及倾斜较正

 

 

【opencv】车牌定位及倾斜较正

基于边缘特征

增加一个颜色列表 判别按照边缘检测找出的车牌颜色 ,存入列表

(不同颜色车牌进行二值化操作、字符数目不同,需记录)

 

【opencv】车牌定位及倾斜较正

【opencv】车牌定位及倾斜较正

问题

如果膨胀力度大,容易造成车牌字符与背景边缘粘连,识别失败。

膨胀力度较小,容易出现下图车牌分裂,只检测到右半部分的情况。

【opencv】车牌定位及倾斜较正

【opencv】车牌定位及倾斜较正

解决:

加大膨胀力会直接造成车牌失败,不予采取。

对于膨胀力度较小,车牌缺失,只能得到车牌右半部分的情况:

roimg为旋转校正图片,rect0(x0,y0,w0,h0) 为当前检测轮廓的位置信息

若 w0/h0<3:直接视为为非车牌区域,舍去

若 w0/h0>3.5:直接将rect0对应的区域投入支持向量机判断是否为车牌

若 3<=w0/h0<=3.5 :向左拓展当前区域,拓展长度为w/2,在拓展区域进行轮廓检测,若能找到轮廓外接矩形满足:

                                 高>2/3h0, max(长/宽,宽/长)<1.5的轮廓,则将rect1(x0-int(w0/2),y0,w0+int(w0/2),h0), 位

                                  置信息对应区域投入支持向量机判断是否为车牌。

例:

【opencv】车牌定位及倾斜较正

红色框代表rect0位置信息,绿色框为向左拓展区域,绿色框内容部

在二值图像上 获取轮廓,并求得外接矩形

第一轮筛选(利用几何特征)

通过外接矩形长、宽、长宽比、轮廓包含面积占矩形面积占比,排除一部分轮廓

第二轮筛选(利用支持向量机)

准备若干车牌图像和非车牌图像用于SVM模型的训练, 将一轮筛选后保留下的轮廓,利用训练好的模型,判别当前区域是否为车牌

过程记录在 csdn :https://blog.csdn.net/afeiererer/article/details/88534905

效果演示: 从左到右依次为 原二值图像、一轮筛选后结果、二轮筛选后结果

【opencv】车牌定位及倾斜较正

车牌字符能够正确分割的前提是车牌图像能够水平,以至于水平投影和垂直投影能够正常进行。

对于下面这种图像,我们可以明显看到车牌有倾斜角度,需要将图像校正,提取车牌。

【opencv】车牌定位及倾斜较正

得到 选出的车牌区域 的 最小外接矩形 ,得到偏转角度 ,旋转原图像 (旋转操作前需扩张原图,以防旋转出边界,造成车牌缺失及数组越界错误)

旋转效果:【opencv】车牌定位及倾斜较正

抠取车牌图像 ,添加至车牌列表

【opencv】车牌定位及倾斜较正

ps: 经过旋转,大体保证上下平齐,但由于拍摄角度,可能如下图出现左右歪斜情况。

(后期将进行二次校正)

【opencv】车牌定位及倾斜较正

输入:车牌原图像

输出:用于字符分割的二值图

二值化 (不同颜色车牌处理方式不同)-> 去除边框->二次校正(左右倾斜)

1.1 蓝色车牌预处理

采用了对比度增强的方法,车牌和数字的对比度得到提高。但部分图像对于汉字部分容易出现模糊情况

【opencv】车牌定位及倾斜较正

采用锐化方法汉字更加清晰,但图像杂质较多

【opencv】车牌定位及倾斜较正

改进方案:将经过锐化预处理的车牌二值化图像和经过对比度增强预处理的车牌二值化图像进行与操作。保留了锐 化的清晰优点,灰度拉伸的杂质少优点。

对比: 第一列为增强对比度后OTSU二值结果,第二列为锐化后OTSU二值结果,第三列为前二者进行与操作的最 终结果

【opencv】车牌定位及倾斜较正

 

 

1.2 绿色车牌预处理

选用提取图像G通道进行大津法(OTSU)二值化的方法

效果:

【opencv】车牌定位及倾斜较正

 

1.3 黄色车牌预处理

选用将图像灰度化后进行大津法(OTSU)二值化的方法

效果:

【opencv】车牌定位及倾斜较正

 

牌照主要分为背景色和文字颜色,其中蓝、黑、黄牌照背景色为单色,一般k=2的聚类即可;绿色牌照背景为白、绿双色,更适用于k=3的聚类(字符更突显)。

【opencv】车牌定位及倾斜较正

但由于光线、杂质等因素,部分车牌进行K=2的k-means聚类可能出现如下状况:

【opencv】车牌定位及倾斜较正

假定车牌原图 SRC 高宽分别为h、w, 我们设定一个高为h/2,宽为w/2的窗口,以一定步长在原图上滑动,若出现窗口中白色像素数量>窗口面积*90, 或窗口中黑色像素数量>窗口面积*90 ,视为失败聚类,将对此类车牌进行k=3的像素聚类。改进效果如下:

【opencv】车牌定位及倾斜较正

对于K=2的聚类,我们统计两类像素:像素值为0的像素个数n0、像素值为255的像素个数n255,认为两类像素中个数多的为背景。所以若n0<n255,将聚类得到的图像取反,保证字符为白色,背景为黑色。

对于K=3的聚类,我们统计三类像素:像素值为0的像素个数n0、像素值为255的像素个数n255,像素值为128的像素个数n128,首先抛除n0,n255,n128中最大值对应的像素种类,视为背景。再从剩余的两种像素中选择出字符代表的像素种类的值,根据这个值进行掩膜运算,筛选出字符去除背景,得到二值图像。

 

【opencv】车牌定位及倾斜较正

 

去除上下边框:查找水平直方图波峰,认为水平方向,最大的波峰为车牌区域

 

去边框效果:

【opencv】车牌定位及倾斜较正

 

 

利用霍夫直线检测,求检测到的直线的平均值作为车牌偏斜角度,进行仿射变换【opencv】车牌定位及倾斜较正

 

阈值选取:

 

如果得到波峰小于6(新能源汽车车牌小于7)则舍去

 

输出波峰:

【opencv】车牌定位及倾斜较正

 

分割效果:

绿线为每个波峰左端,红线为每个波峰右端。

两条线所夹区域为分割出的数字(汉字、字母),将用于投入支持向量机进行预测。

 

【opencv】车牌定位及倾斜较正

 

 

找到确定的分界,然后补全界限。比如找到了 第1个字符与第2个字符分界,第3个和第4个分界 ,但是没找到 第2个和第3个分界,则取前两个界限中间。

过程:

1.找到不是字符的列

2.找到跳变

3.去杂线

4.找到分界

 

效果:

【opencv】车牌定位及倾斜较正

 

取每两条线之间区域,做轮廓检测,找到轮廓包含面积最大的,取其外接矩形部分,投入支持向量机进行预测。

上方为方法一分割效果,下方为方法二分割效果。

【opencv】车牌定位及倾斜较正

可见,对于【opencv】车牌定位及倾斜较正方法一的分割效果更好

而对于【opencv】车牌定位及倾斜较正方法二的分割效果更好

可见两种方法各有优劣,可以互相补充。

 

  • 采用RCNN方法。
  • 分别训练数字字母模型和汉字模型 ,每个车牌分割出的第一位用汉字模型预测,其余用数字字母模型预测。

        数字模型需要两套(7位车牌和8位车牌的数字 ‘2’ ,‘4’,‘6’ 字体不同)

  • 采用三种方案对提取出的车牌原图进行预处理、分割、识别。效果各有优劣,互为补充。

       Plan A:车牌预处理1+分割1 得到识别结果 r0

       Plan B:车牌预处理1+分割2 得到识别结果 r1

       Plan C:车牌预处理2+分割1 得到识别结果 r2

  • 将得到的三个识别结果 r0 ,r1 ,r2 进行比较,得到最终结果。【opencv】车牌定位及倾斜较正【opencv】车牌定位及倾斜较正

 

比较规则

设目标结果长度为n (新能源汽车车牌n=8,蓝黄等其余车牌n=7)

串长度 小于n-1 或 大于n+1 视为无效 ,不参与比较 ,所有有效串长度均为 n-1 或 n+1 或 n 。

若三个串最大长度<n ,返回空,识别失败

若三个串中只有一个长度为n ,返回长度为n的串

剩余情况,每位取出现频率最高的字符,返回前n位

 

CNN:

 

【opencv】车牌定位及倾斜较正

 

 

【opencv】车牌定位及倾斜较正