tianyalu / NeVehicleLicensePlateRecognition

车牌识别C++项目

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

车牌识别C++项目

[TOC]

一、车牌识别流程

车牌识别总体分为三步:车牌定位-->车牌检测-->车牌字符识别

1.1 车牌定位

车牌定位,即定位到车牌在图片中的位置区域。

本文使用了两种方式:sobel定位和颜色定位,最后综合两种方式实现定位。

1.1.1 sobel定位

sobel定位步骤如下:

  1. 高斯模糊
  2. 灰度化
  3. Sobel运算 --> 16位转8位
  4. 二值化
  5. 形态学操作(闭操作)
  6. 求轮廓
  7. 尺寸判断(初步过滤掉不符合要求的矩形)
  8. 矩形矫正(旋转角度、安全矩形处理、调整大小)

最后得到的是包含可能车牌的旋转后的矩形矩阵向量:vector<Mat>

1.1.2 颜色定位

颜色定位步骤如下:

  1. RGB颜色空间转换为HSV颜色空间
  2. HSV分离
  3. 二值化(V颜色空间)
  4. 形态学操作(闭操作)
  5. 求轮廓
  6. 尺寸判断(初步过滤掉不符合要求的矩形)
  7. 矩形矫正(旋转角度、安全矩形处理、调整大小)

最后得到的是包含可能车牌的旋转后的矩形矩阵向量:vector<Mat>

1.1.3 综合

将以上两种方式获取的集合综合到新的向量中:

vector<Mat> plates;//2合1的候选车牌集合
plates.insert(plates.end(), sobel_plates.begin(), sobel_plates.end());
plates.insert(plates.end(), color_plates.begin(), color_plates.end());

1.2 车牌检测

车牌检测是通过SVM支持向量机来做的,训练资料参考2.1。

识别步骤如下:

  1. 灰度化(对于1.1.3得到的数据)
  2. 二值化
  3. 提取Hog特征
  4. Hog特征交给SVM测评得到结果

最终得到的结果是车牌矩形Mat

1.3 车牌文字识别

车牌文字识别分为字母数字识别和汉字识别两种,本文是通过ANN神经网络做的,训练资料参考2.1。

1.3.1 字母数字识别

识别步骤如下:

  1. 灰度化(对于1.2得到的数据)
  2. 二值化
  3. 清除铆钉像素(行扫描、看跳变次数)
  4. 求字符轮廓
  5. 尺寸判断(初步过滤掉不符合要求的矩形)
  6. 排序(轮廓矩形x坐标从左到右)
  7. 获取城市字符框的索引(车牌矩形1/7 ~ 2/7位置)
  8. 获取轮廓矩形Hog特征
  9. 将城市字符框及其之后的5个矩形Hog特征交给ANN测评,得到字符结果

1.3.2 汉字识别

由于汉字比较特殊,识别到的矩形未必包含整个字符,所以这里采取的是根据1.3.1得到的城市字符框索引,以其为基准,向左取稍微宽一点的矩形框,作为汉字的识别样本,步骤同1.3.1。

image

二、目录说明及参考资料

2.1 目录说明

svm_train目录下的是如何进行车牌识别训练的代码,resources/svm_train目录下是车牌识别的训练文件;

ann_train目录 下是如何进行字符识别训练的代码,resources/ann_train目录下是字符识别的训练文件。

2.2 参考资料

车牌定位资料,简书地址:Opencv 车牌定位相关资料

车牌检测资料,简书地址:OpenCV 车牌检测资料

About

车牌识别C++项目


Languages

Language:C++ 95.7%Language:CMake 4.3%