本文和下文用于开源项目OpenCV的车牌识别的学习!!!
车牌识别的过程可分为四步:1)车牌图像切割;2)车牌图像分类;3)车牌字符切割;4)车牌字符分类;
1)车牌图像切割:
a.将原图转化为灰度图,可去除多通道产生的外界噪声;
b. sobel滤波 ,车牌分割的一个重要特征是车牌中的垂直边缘比较多,为了提取垂直边缘,采用sobel一阶垂直方向导数;
c. 阈值化处理,应用一个OSTU法自动获取阈值滤波器来获得一个二值图像;
d. 闭运算形态学 ,连接含有边缘数量很多的所有区域,删除边缘之间的空白区域,将车牌区域连接起来;
e. 漫水填充, 所有的车牌都有统一的背景颜色。使用漫水填充算法来获取旋转矩阵的精确修剪。漫水填充函数用颜色把连通区域填充到掩码图像,填充从种子开始。填充的像素点都是与种子点进行比较,如果像素值为x,seed-low<=x<=seed+up,则该位置将被填充。一旦得到了用来剪切的掩码图像,进而可得到掩码图像点的最小外接矩形,再次检查矩形大小。对于每一个掩码,白色像素获得位置用minAreaRect函数重新得到最相近的修剪区域;
f. 仿射变换,用来去掉检测矩形区域的旋转;
g. 提取矩形;
h. 调整为统一大小,直方图均衡化,提取的矩形图像不能很好的在训练和分类中使用,因为他们没有相同的大小。并且,每个图像包含不同的光照条件,增加了他们之间的差别。
/* imageSlicer.cpp */
#include <iostream>
#include <opencv2/opencv.hpp>
#include <time.h>
using namespace std;
using namespace cv;
//筛选旋转矩形的面积和宽高比
bool areaDetection(RotatedRect rectArea)
{
float error = 0.4;//允许错误率
const float width_height = 4.7272;//获得西班牙车牌的宽高比 57200
int min_area = 25 * 25 * width_height;//获得允许矩形的最大最小面积
int max_area = 100 * 100 * width_height;
float min_value = width_height*(1 - error);//获得允许矩形的最大最小宽高比 1.890-6.6180
float max_value &#