基于opencv的车牌识别解析

车牌识别太出名了,花几天来了解下这个系统,并结合opencv进行实现。下面是一些介绍:

车辆牌照识别(License Plate Recognition,LPR)技术作为交通管理自动化的重要手段和车辆检测系统的一个重要环节,在交通监视和控制中占有很重要的地位。LPR系统可以广泛应用于高速公路电子收费站、出入控制、公路流量监控、失窃车辆查询、停车场车辆管理、公路稽查、检测黑牌机动车、监控违章车辆的电子警察等需要车牌认证的重要场合,尤其是基于车牌识别技术的高速公路收费系统中,相对于射频卡等技术,可以实现不停车收费,提高了公路系统的运行效率。

车牌识别技术的研究最早出现在20世纪80年代,这个阶段的研究没有形成完整的系统体系,而是就某一具体的问题进行研究,通常采用简单的图像处理方法来解决。识别过程是使用工业电视摄像机拍下汽车的正前方图像,然后交给计算机进行简单处理,并且最终仍需要人工干预。进入20世纪90年代后,随着计算机视觉的发展和计算机性能的提高,开始出现了车牌识别的系统化研究。1990年A.S. Johnson等运用计算机视觉技术和图像处理技术实现了车辆牌照的自动识别。该系统分为图像分割、特征提取和模板构造等三个部分,利用不同的阈值对应的直方图的不同,经过大量的统计实验确定车牌位置的图像直方图的阈值范围,从而根据特定的阈值对应的直方图分割出车牌,再利用预先设置的标准字符模板进行模式匹配,识别出字符。1994年Young Sung Soh[2]开发出一套实时车牌识别系统,该系统的准确率达到99.2%。国外还有许多车牌识别系统的报道,由于他们起步早,总体来讲其技术水平高于国内,特别在产品化方面。但由于中国车牌的格式与外国的有很大的差异,并有汉字的识别问题,所以国外关于识别率的研究只是具有参考价值。

国内在90年代也开始了车牌识别的研究。目前比较成熟的产品有中科院自动化研究所汉王公司的“汉王眼”,亚洲视觉科技有限公司、深圳吉通电子有限公司、中国信息产业部下属的中智交通有限公司等也有自己的产品。另外西安交通大学的图像处理和识别实验室、上海交通大学的计算机科学与工程系、清华大学人工智能国家重点实验室、浙江大学的自动化系等也做过类似的研究。

目前车牌识别系统面临的一些问题:(1)、在全天候的情况下,如何获取车辆号牌的清晰图像,即无论是白天还是黑夜,强逆光还是强顺光,刮风还是下雨,都希望将车辆的号牌图像拍清晰;(2)、在图像中如何正确的识别出车牌,即算法如何在一个尽量大的范围内适应各种天气情况下的图片。

因为不是我的研究重点,只是打算用这个系统练练手,所以我也就不打算考虑它所面临的那些问题,只是进行一般的代码实现。

一个典型的车辆牌照识别系统一般包括以下4个部分:车辆图像获取、车牌定位、车牌字符分割和车牌字符识别,如下图所示

车辆图像获取

车辆图像获取是车牌识别的第一步,也是很重要的一步,车辆图像的好坏对后面的工作有很大的影响。如果车辆图像的质量太差,连人眼都没法分辨,那么肯定不会被机器所识别出来。车辆图像都是在实际现场拍摄出来的,实际环境情况比较复杂,图像受天气和光线等环境影响较大,在恶劣的工作条件下系统性能将显著下降。

现有的车辆图像获取方式主要有两种:一种是由彩色摄像机和图像采集卡组成,其工作过程是:当车辆检测器(如地感线圈、红外线等)检测到车辆进入拍摄范围时,向主机发送启动信号,主机通过采集卡采集一幅车辆图像,为了提高系统对天气、环境、光线等的适应性,摄像机一般采用自动对焦和自动光圈的一体化机,同时光照不足时还可以自动补光照明,保证拍摄图片的质量;另一种是由数码照相机构成,其工作过程是:当车辆检测器检测到车辆进入拍摄范围时,直接给数码照相机发送一个信号,数码相机自动拍摄一幅车辆图像,再传到主机上,数码相机的一些技术参数可以通过与数码相机相连的主机进行设置,光照不足时也需要自动开启补光照明,保证拍摄图片的质量。

车牌定位

车牌定位的主要工作是从摄入的汽车图像中找到汽车牌照所在位置,并把车牌从该区域中准确地分割出来,供字符分割使用。因此,牌照区域的确定是影响系统性能的重要因素之一,牌照的定位与否直接影响到字符分割和字符识别的准确率。目前车牌定位的方法很多,但总的来说可以分为以下4类:(1)基于颜色的分割方法,这种方法主要利用颜色空间的信息,实现车牌分割,包括彩色边缘算法、颜色距离和相似度算法等;(2)基于纹理的分割方法,这种方法主要利用车牌区域水平方向的纹理特征进行分割,包括小波纹理、水平梯度差分纹理等;(3)基于边缘检测的分割方法;(4)基于数学形态法的分割方法。

本文为了代码实现上的方便,我采用的是基于边缘检测的分割方法。主要是利用水平投影方法和垂直投影方法进行车牌定位。

车牌字符分割

要识别车牌字符,前提是先进行车牌字符的正确分割与提取。字符分割的任务是把多列或多行字符图像中的每个字符从整个图像中切割出来成为单个字符。车牌字符的正确分割对字符的识别是很关键的。传统的字符分割算法可以归纳为以下三类:直接分割法、基于识别基础上的分割法、自适应分割线类聚法。直接分割法简单,但它的局限是分割点的确定需要较高的准确性;基于识别基础上的分割法是把识别和分割结合起来,但是需要识别的高准确性,它根据分类和识别的耦合程度又有不同的划分;自适应分割线聚类法是要建立一个分类器,用它来判断图像的每一列是否是分割线,它是根据训练样本来进行自适应学习的神经网络分类器,但对于粘连字符训练困难。也有直接把字符组成的单词当作一个整体来识别的,诸如运用马尔科夫数学模型等方法进行处理,这些算法主要应用于印刷体文本识别。

本文的同样为了实现上的简单,采用的是垂直投影方法。

车牌字符识别

与一般印刷体字符识别相比,车牌字符识别尤其自身的特点,它是文字识别技术与车牌图像自身因素协调兼顾的综合技术,目前,车牌字符识别算法主要是基于模板匹配、特征匹配或神经网络的方法。我国的车牌字符包括50多个汉字,25个大写英文字母,10个数字,总共也就80多个字符,鉴于车牌识别系统的特殊性,如果照搬普通汉字识别的方法,对文字细化后再提取其结构或统计特征,非但得不到意想的结果,反而会降低识别率。

这一部分我没有实现。

// LPRmain.cpp : 快速车牌识别系统的主文件
// 本文件是系统的车牌定位和字符分割部分的代码,本系统引用的是OpenCV2.4.7,IDE是VS2012
// Author:LinJianmin
// Email: jianmin1990@outlook.com
// University:Huaqiao University
// Date:  2014-1
#include "LPR.h"
int main()
{
//
//第一部分:图像采集/图像载入(本系统直接读取图像)
 //若采用camera采集示例如下:
/*VideoCapture cap(0);
if (!cap.isOpened())
{
return -1;
}
Mat car_frame;
cap >> car_frame;
*/
 //图像载入
Mat car_img;
car_img = imread("E:\\LPR\\car.bmp");
 if (!car_img.data)
{
cout<<"Please check the input image"<(j,i);
num[v]++;
}
}
for (int i = 0; i < 256; i++)//存放图像各个灰度级的出现概率
{
p[i] = num[i] / wMulh;
}
for (int i = 0; i < 256; i++)//求存放各个灰度级之前的概率和
{
for (int k = 0; k <= i; k++)
{
p1[i]+=p[k];
}
}
for (int x = 0; x < gray_bi.cols; x++)
{
for (int y = 0; y < gray_bi.rows; y++)
{
int v = gray_bi.at(y,x);
gray_bi.at(y,x) = p1[v]*255 + 0.5;
}
}
//边缘增强
Mat gray_c;
Canny(gray_bi,gray_c,50,150,3);
 //水平投影和垂直投影
int imgR[400] = {0};
bool tag = false;
int imgTop =0;int imgBottom = 0;
int img_h1,img_h2;
for (int ht = 0; ht < gray_c.rows; ht++)
{
for (int wt = 0; wt < gray_c.cols; wt++)
{
if (gray_c.at(ht,wt) != 0)
{
imgR[ht]++;
}
}
if ( (!tag)&& imgR[ht] > 10)
{
img_h1 = ht;
tag = true;
}
if (tag && imgR[ht] <10)
{
img_h2 =ht;
tag = false;
}
if (img_h2-img_h1<50 && img_h2 - img_h1 >25)
{
imgTop = img_h1;
imgBottom = img_h2;
break;
}
}
int imgR_w[300] = {0};
int img_w1 = 0;
int img_w2 = 0;
int imgRight = 0;
int imgLeft = 0;
bool tag2 = false;
for (int wt_new = 2; wt_new < gray_c.cols; wt_new++)
{
for (int ht_new = imgTop; ht_new < imgBottom; ht_new++)
{
if (255 == gray_c.at(ht_new,wt_new))
{
imgR_w[wt_new]++;
}
}
 if ( (!tag2) && (imgR_w[wt_new-2] +imgR_w[wt_new-1] + imgR_w[wt_new])/3 > 5)
{
img_w1 = wt_new;
tag2 = true;
}
if (tag2 && (imgR_w[wt_new-2] +imgR_w[wt_new-1] + imgR_w[wt_new])/3 <5)
{
img_w2 =wt_new;
tag2 = false;
}
if (img_w2 - img_w1 <180 && img_w2-img_w1 > 70)
{
imgLeft = img_w1;
imgRight = img_w2;
break;
}
}
 Mat imgroi;
//imgroi = car_img( Rect(imgTop,imgLeft,imgRight-imgLeft,imgTop-imgBottom));
imgroi = car_img( Rect(imgLeft,imgTop+10,115,30));
 //
//第三部分:字符分割
//二值化
Mat roi_g, roi_bi;
cvtColor(imgroi,roi_g,CV_BGR2GRAY);
threshold(roi_g,roi_bi,0,255,CV_THRESH_OTSU);
 bool lab = false;//是否进入一个字符分割状态
bool black = false;//是否发现黑点
bool change = false;
int xnum = 0;
int rect_left;
int rect_right;
//Rect selection;
Mat fg1,fg2,fg3,fg4,fg5,fg6,fg7;
for (int wt = 0; wt < roi_bi.cols; wt++)
{
int count = 0;
for (int ht = 0; ht < roi_bi.rows; ht++)
{
if ((255==roi_bi.at(ht,wt)) && (!change))
{
count++;
change = true;
}
else if((0==roi_bi.at(ht,wt))&&(change))
{
count++;
change = false;
}
}
if (!lab&&(count>5))
{
rect_left = wt - 3;
lab = true;
}
if (lab&&(count<5)&&(wt>(rect_left+8))&& (xnum<7) )
{
rect_right = wt + 2;
lab = false;
CvPoint pt1,pt2;
pt1.x = rect_left;
pt1.y = 0;
pt2.x = rect_right;
pt2.y = roi_bi.cols-1;
int s_x = pt1.x + 1;
int s_y = pt1.y;
int s_width = rect_right - rect_left +1;
int s_height = roi_bi.rows -1;
if (xnum == 0)
{
fg1 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
if (xnum == 1)
{
fg2 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
if (xnum == 2)
{
fg3 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
if (xnum == 3)
{
fg4 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
if (xnum == 4)
{
fg5 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
if (xnum == 5)
{
fg6 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
if (xnum == 6)
{
fg7 = roi_bi(Rect(s_x,s_y,s_width,s_height));
}
xnum++;
}
}
cvWaitKey(50000);
return 0;
}
(0)

相关推荐

  • 车牌识别OCR算法的工作原理

    车牌识别OCR算法的工作原理

  • 【从零学习OpenCV 4】分割图像——Grabcut图像分割

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV探索之路(四):膨胀、腐蚀、开闭运算

    腐蚀和膨胀是最基本的形态学运算. 腐蚀和膨胀是针对白色部分(高亮部分)而言的. 膨胀就是对图像高亮部分进行"领域扩张",效果图拥有比原图更大的高亮区域:腐蚀是原图中的高亮区域被蚕食 ...

  • 如何利用图像预处理提高OCR的准确性?

    重磅干货,第一时间送达 OCR代表光学字符识别,将文档照片或场景照片转换为机器编码的文本.有很多工具可以在你们的系统中实现OCR,例如Tesseract OCR和Cloud Vision.他们使用AI ...

  • (9条消息) ocr图像预处理

    说明:文字方向校正(fft方式和放射变换方式)参考了网上的代码,只做了少量修改 只针对医疗影像图像,自然场景下的另说 因为处理的图像都很大很大,居然有11000*12000这种分辨率的,有90M大小, ...

  • 基于OpenCV的条形码区域分割

    重磅干货,第一时间送达 本期,我们将一起学习如何从图像中提取出含有条形码的区域.下面的代码,我们将在Anaconda中采用Python 2.7 完成,当然OpenCV中的图像处理库也是必不可少的. 分 ...

  • 弹幕君,别挡着我看小姐姐!

    某天代码写得老眼昏花,去B站上摸鱼,突然发现奇怪的现象: 哟呵,B站竟然做了视频前景提取,把弹幕藏到画面人物的后面.识别效果还意外地不错呢. 然后又翻了下,发现这是个叫做"智能防挡弹幕&qu ...

  • 用Python写一份独特的元宵节祝福

    今天是正月十五,首先祝大家元宵节快乐! 以前加过我个人微信号的朋友,可以在朋友圈看到我今天发的元宵节祝福图片: 这个祝福文字乍一看其貌不扬,不过点开大图有惊喜:是拿自己微信好友的头像拼成的! 这是通过 ...

  • 【从零学习OpenCV 4】两图像间的像素操作

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 实战:基于OpenCV 的车牌识别

    重磅干货,第一时间送达 车牌识别是一种图像处理技术,用于识别不同车辆.这项技术被广泛用于各种安全检测中.现在让我一起基于OpenCV编写Python代码来完成这一任务. 车牌识别的相关步骤 1.车牌检 ...

  • 基于OpenCV 的车牌识别

    重磅干货,第一时间送达 车牌识别是一种图像处理技术,用于识别不同车辆.这项技术被广泛用于各种安全检测中.现在让我一起基于OpenCV编写Python代码来完成这一任务. 车牌识别的相关步骤 1.车牌检 ...

  • 基于OpenCV实战:车牌检测

    重磅干货,第一时间送达 拥有思维导图或流程将引导我们朝着探索和寻找实现目标的正确道路的方向发展.如果要给我一张图片,我们如何找到车牌并提取文字? 一般思维步骤: 识别输入数据是图像. 扫描图像以查看由 ...

  • 基于OpenCV的实战:轮廓检测(附代码解析)

    重磅干货,第一时间送达 利用轮廓检测物体可以看到物体的各种颜色,在这种情况下放置在静态和动态物体上.如果是统计图像,则需要将图像加载到程序中,然后使用OpenCV库,以便跟踪对象. 每当在框架中检测到 ...

  • 基于OpenCV修复表格缺失的轮廓--如何识别和修复表格识别中的虚线

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者 Goog ...

  • 基于OpenCV的气体泵扫描仪数字识别系统

    重磅干货,第一时间送达 综述 燃料伴侣 技术 目标 数字分割 基本图像处理流程 原始图片 影像准备 调整曝光 灰阶 转换为灰度 模糊 稍微模糊 阈值图像转换为黑白图像 阈值为黑/白 填补空白 侵蚀出来 ...

  • 【图像识别】基于卷积神经网络CNN实现车牌识别matlab源码

    过去几年,深度学习(Deep learning)在解决诸如视觉识别(visual recognition).语音识别(speech recognition)和自然语言处理(natural langua ...

  • ​【好设计论文】基于自适应差分进化极限学习机的车牌识别算法

    摘要:针对目前车牌识别算法中存在的模型训练慢.字符识别准确率低等问题,研究了一种基于自适应差分进化极限学习机的车牌识别算法.综合利用边缘检测和颜色定位的优点来检测车牌区域,然后用改进后的垂直投影法对车 ...

  • 基于OpenCV实战的图像处理:色度分割

    重磅干货,第一时间送达 通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法.为什么大多数人偏爱色度而不是RGB / HSV分割? 可以获得RGB / HSV通道之间的比 ...