车牌识别算法实践(一):先验知识

article/2025/10/6 6:28:08

一般来说,一个完整的车牌识别系统的处理流程包括图像输入、车牌提取、字符分割、字符识别和结果输出这五部分。其中车牌提取、字符分割和字符识别是较重要的部分,而车牌提取尤为关键,采用哪种算法或算法组合决定了整个系统的性能。

本人从多年前就开始研究车牌识别的各种算法,以资源需求低、运行高效和鲁棒性强为目标,在嵌入式系统中以C/C++实现了车牌识别的整个流程。本系统能同时识别出车牌类型和车牌号,能适应阴雨雪雾等低照度条件,对于倾斜、脏污、损伤、变形等车牌的识别率也很高。当时为了验证和演示,用VS2005做了一个测试工具。今以这个测试工具的源码为基础,分步骤地将我设计的车牌识别系统软件的重要算法分享出来。源代码还含有不少调试的痕迹以及没有实际用到的算法在里面,待整理后会开放下载。欢迎技术探讨,WX:15380886180或Email:bhw98@sina.com。

为提高效率和准确率,在车牌识别流程的各个部分,要充分利用先验知识对算法的参数范围进行限制,例如车牌长宽比、车牌背景色、字符颜色、字符字体、字符行数、字符间隔分布特征、每个字符所属的字符集等。举个例子,车牌中的汉字个数很有限,做识别时只要在那么几十个字中搜索就行了,而没有必要在整个GB-2312字符集中进行搜索。

关于中国的车辆号牌种类的简明介绍,可参考百度百科:https://baike.baidu.com/item/%E8%BD%A6%E7%89%8C/8347320?fr=aladdin。更详细、更专业的资料请参照公安部发布的GA36-2018标准文件。

对于颜色来说,理论上红、绿、蓝、黄、黑、白等,其RGB或HSV值都有标准定义。但对于实际拍摄的图像,由于受环境光和拍摄手法的影响,颜色都会或多或少带有“污染”。例如,下图左边的车牌受强光刺激,底色变为青色(绿色分量较多);右边的车牌在弱光环境中受车灯影响,底色和字符色都含有相当多的红色分量。那么判断底色为“蓝色”的标准是什么?这就需要根据足够多的样本来确定阈值(机器学习的训练过程不包含在本车牌识别系统中)。这种阈值也是一种先验知识。

泛泛地说,各种常量定义都可以理解为先验知识的合理运用。在后续章节中也会有一些先验知识(常量定义)的介绍。

对于车牌样式(种类)的参数,定义了如下的结构:

typedef struct PARAMS
{int num_row;				// 字符行数int num_charset;			// 字符集个数int alpha_style;			// 字母、数字样式int hanzi_style;			// 汉字样式int ratio0;					// 正常字符间距之间的比例的下限int ratio1;					// 正常字符间距之间的比例的上限,分隔点前、后两字符间距与正常字符间距的比例的下限int ratio2;					// 分隔点前、后两字符间距与正常字符间距的比例的上限,正常字符倍间距与倍间距的比例的下限int ratio3;					// 正常字符倍间距与倍间距的比例上限,分隔点前、后两字符加字符间距与正常字符间距的比例的的下限int ratio4;					// 分隔点前、后两字符加字符间距与正常字符间距的比例的的上限,正常字符倍间距与倍间距的比例的下限int ratio5;					// 正常字符倍间距与倍间距的比例的上限struct {int num_sym;				// 字符个数(不含分隔符)int septor_pos;				// 分隔符的位置int septor_style;			// 分隔符样式int back_color0;			// 分隔符前的背景颜色int back_color;				// 分隔符后的背景颜色int fore_color;				// 主要的字符颜色int fore_color1;			// 最末位字符颜色int width;					// 字符宽度int height;					// 字符高度int x_space;				// 正常字符间距int x_dot_space;			// 分隔点前、后两字符间距int y_center;				// 中央y坐标int x_center[NUM_SYMBOL];	// 各字符中央x坐标int charset[NUM_SYMBOL];	// 各字符所属字符集int sequence[NUM_SYMBOL];	// 易识别字符的序号, 以结束} row[2];						// 每行的参数			char chars[NUM_CHARSET][64];	// 字符集的定义
} PARAMS;

有关常量定义如下:

const int NUM_SYMBOL = 12;		// 车牌中字符个数的最大值
const int NUM_CHARSET = 4;		// 车牌中字符集个数的最大值

车牌提取处理后,车牌区域的图像会归一化到相同的尺寸(像素值),定义如下:

const int WP = 384;				// 透视变换的车牌宽度
const int HP = 116;				// 透视变换的车牌高度

以小型汽车(蓝底白字)的参数定义为例,加以说明。

static const PARAMS params[] = 
{… …{	// 小型汽车,蓝底白字1,			// 字符行数3,			// 字符集个数ALPHA_OLD,	// 字母、数字样式HANZI_OLD,	// 汉字样式80,			// 正常字符之间间距的比例的下限120,		// 正常字符之间间距的比例的上限,分隔点前、后两字符间距与正常字符间距的比例的下限170,		// 分隔点前、后两字符间距与正常字符间距的比例的上限,正常字符倍间距与倍间距的比例的下限220,		// 正常字符倍间距与倍间距的比例上限,分隔点前、后两字符加字符间距与正常字符间距的比例的的下限270,		// 分隔点前、后两字符加字符间距与正常字符间距的比例的的上限,正常字符倍间距与倍间距的比例的下限320,		// 正常字符倍间距与倍间距的比例的上限{{7,				// 字符个数(不含分隔符)2,				// 分隔符的位置SEPTOR_DOT,		// 分隔符样式BLUE,			// 分隔符前的背景颜色BLUE,			// 分隔符后的背景颜色WHITE,			// 主要的字符颜色WHITE,			// 最末位字符颜色40,				// 字符宽度80,				// 字符高度51,				// 正常字符间距71,				// 分隔点前、后两字符间距58,				// 中央y坐标{30, 81, 152, 203, 254, 305, 356},	// 各字符中央x坐标{2, 0, 1, 1, 1, 1, 1},	// 各字符所属字符集{3, 2, 4, 6, 0, 1, 5},		// 易识别字符的序号},		// 第一行的参数},{"ABCDEFGHJKLMNPQRSTUVWXYZ","0123456789ABCDEFGHJKLMNPQRSTUVWXYZ","\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E",},	// 字符集的定义},… …
};

有关常量定义如下:

enum
{BLACK,		// 黑色WHITE,		// 白色RED,		// 红色GREEN,		// 绿色BLUE,		// 蓝色YELLOW,		// 黄色
};enum   
{HANZI_OLD,		// 汉字字体
};enum   
{ALPHA_OLD,		// 英数字体, 蓝底白字、黄底黑字等车牌的英数字体ALPHA_NEW,		// 英数字体,新能源车牌的英数字体
};enum   
{SEPTOR_NONE,	// 空白分隔符SEPTOR_DOT,		// 圆点分隔符SEPTOR_DASH,	// 横杠分隔符SEPTOR_PLUG,	// 插头分隔符
};

字符行数num_row为1,这很明显。后面每行的参数row就只需要定义row[0]就行了,也就是第一行。

字符集个数num_charset为3。后面的二维数组chars有这3个字符集的定义(字符列表): "ABCDEFGHJKLMNPQRSTUVWXYZ", "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ", "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E",分别是纯字母、字母加数字和汉字。注意字母表中是没有‘I’和‘O’的。汉字用的自定义单字节编码,从’\x80’开始,定义如下所示(”京”对应’\x80’,”津”对应’\x81’……)。

static WCHAR hanzi[] = L"京津冀晋蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新港澳使领学警渣挂";

各字符所属字符集charset为{2, 0, 1, 1, 1, 1, 1},是说首字符属于字符集2(汉字),下一个字符属于字符集0(纯字母),后面5个字符都属于字符集1(字母加数字)。

字符个数(不含分隔符)num_sym为7,共7个字符。

分隔符的位置septor_pos为2,是指在两个字符之后(或者说序号从0开始的第2个字符之前)。

分隔符样式septor_style为SEPTOR_DOT,是圆点分隔符。

分隔符前的背景颜色back_color0分隔符后的背景颜色back_color均为BLUE。如果是大型新能源汽车号牌,分隔符前后的背景颜色就不同了。

主要的字符颜色fore_color和最末位字符颜色fore_color1均为WHITE。如果是警车号牌,主要的字符颜色是黑色,最末位字符颜色是红色。

字符宽度width为40,字符高度height为80,正常字符间距x_space为51,分隔点前、后两字符间距x_dot_space为71,中央y坐标y_center为58,各字符中央x坐标x_center为{30, 81, 152, 203, 254, 305, 356}。这些参数都是基于车牌归一化尺寸384 x 116而定义的。

上述间距的参数是”标准”定义,实际处理时允许在一定的范围内波动,或者在一定范围内执行搜索。这就是ratio0到ratio5的意义所在了。ratio0代表正常字符间距之间的比例的下限,ratio1代表正常字符间距之间的比例的上限以及分隔点前、后两字符间距与正常字符间距的比例的下限,ratio2代表分隔点前、后两字符间距与正常字符间距的比例的上限以及正常字符倍间距与倍间距的比例的下限,ratio3代表正常字符倍间距与倍间距的比例上限以及分隔点前、后两字符加字符间距与正常字符间距的比例的下限,ratio4代表分隔点前、后两字符加字符间距与正常字符间距的比例的上限以及正常字符倍间距与倍间距的比例的下限,ratio5代表正常字符倍间距与倍间距的比例的上限。听着很拗口,其实好理解,就是正常字符间距、正常字符间距2倍、分隔点前后字符间距、分隔点前后字符间距2倍的下限、上限与相应间距的百分比。这些数值都是百分数取整。如ratio1为120表示120%,是说正常字符间距最大允许在51的基础上乘以120%,等于61。而这个数值同时也是分隔点前、后两字符间距与正常字符间距的比例的最小值(”标准值”是71,见上)。

字母、数字样式alpha_style为ALPHA_OLD。如果是新能源汽车号牌,就要用ALPHA_NEW了。

汉字样式hanzi_style为HANZI_OLD。实际上目前也就这一种字体。

 


http://chatgpt.dhexx.cn/article/rAEdJeiR.shtml

相关文章

基于matlab车牌识别算法

牌照自动识别是一项利用车辆的动态视频或静态图像进行牌照号码、牌照颜色自动识别的模式识别技术。其硬件基础一般包括触发设备、摄像设备、照明设备、图像采集设备、识别车牌号码的处理机等,其软件核心包括车牌定位算法、车牌字符分割算法和光学字符识别算法等。某…

【毕业设计】深度学习 YOLO 实现车牌识别算法

文章目录 0 前言1 课题介绍2 算法简介2.1网络架构 3 数据准备4 模型训练5 实现效果5.1 图片识别效果5.2视频识别效果 6 部分关键代码7 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往…

LPRNet车牌识别算法?其实没有想象那么难

在停车场、小区的出入口,高速公路收费站,我们经常看到自动识别车辆车牌信息的机器,那么车牌识别是如何工作的呢?车牌识别系统应用主要用于记录车辆的车牌号码,出入时间,可实现自动化、规范化管理&#xff0…

车牌识别算法 matlab,车牌识别算法及其MATLAB实现

一.算法 读取拍摄图像-->截取车牌部分 --> 识别车牌 图像预处理: 将图像经过图像灰度化、图像增强、边缘提取、二值化等操作,转换成便于车牌定位的二值化图像; 车牌定位: 利用车牌的边缘、形状等特征,再结合Roberts 算子边缘检测、数字…

【最强最全车牌识别算法】支持13种中文车牌识别的云端API部署(可直接获取源码使用)

项目简介 在城市交通管理、视频监控、车辆识别和停车场管理中车辆检测与车牌识别是一项富有挑战而重要的任务。利用深度学习识别不同条件下的车辆及其车牌信息。更具体地说,实时目标检测网络(Yolov5)用于从车辆图像中提取特征并且通过训练对…

【老生谈算法】基于matlab的车牌识别算法详解及程序源码——车牌识别算法

基于matlab的车牌识别系统设计与算法原理 大家好,今天给大家介绍基于matlab的车牌识别系统设计与原理。 车牌识别系统(License Plate Recognition ,简称LPR)是智能交通系统(ITS)的核心组成部分&#xff0c…

一套基于java的开源车牌识别算法

简介 这是一个基于spring boot maven opencv 实现的图像识别及训练的项目包含车牌识别、人脸识别等功能,贯穿样本处理、模型训练、图像处理、对象检测、对象识别等技术点java语言的深度学习项目,在整个开源社区来说都相对较少;拥有完整的训…

车牌识别算法实践(二):基础算法

本篇将涉及到的一些基础算法集中介绍一下。由于以贴代码为主,有些算法可能只提个名字,有些算法的原理可能会一两句话带过。 原来的VLPR工程中车牌识别的一些组件是分成好几个类的,现将它们全部塞到一个类CPlate中。这样虽有违C OOP的精神&am…

高精度车牌识别算法

一 车牌识别概述 车牌识别属于OCR的一种,但它也有自己的特点。考虑到边缘设备部署,我们没有用lstm,仅用普通的卷积层便实现了高精度的车牌识别方案。车牌识别的应用场景也十分广泛,常见的停车场收费系统,车牌识别算法…

车牌识别传统算法分析

车牌识别算法原理 车牌识别是基于图像分割和图像识别理论,对含有车辆号牌的图像进行分析处理,从而确定牌照在图像中的位置,并进一步提取和识别出文本字符。车牌识别过程包括图像采集、预处理、车牌定位、字符分割、字符识别、结果输出等一系列算法运算,其运行流程如下图所…

车牌识别的N种办法——从OCR到深度学习

一、车牌识别简介 随着科学技术的发展,人工智能技术在我们的生活中的应用越来越广泛,人脸识别、车牌识别、目标识别等众多场景已经落地应用,给我们的生活品质得到很大的提升,办事效率大大提高,同时也节约了大量的劳动…

基于MATLAB的车牌识别基本原理及算法讲解

来源丨古月居 点击进入—>3D视觉工坊学习交流群 一:GUI界面预览 二:选择图片 使用uigetfile函数打开一个模态对话框,其中列出了当前文件夹中的文件。 在这里选择或输入文件的名称。选择文件点击打开时,uigetfile将返回文件名。…

如何将JavaScript中的JSON字符串转换为JSON对象数组?

来源 | web前端开发(ID:web_qdkf) 如果给定一个JSON字符串,需要你将JSON字符串转换为JSON对象数组。请问你会怎么做? 此数组包含在JavaScript下从JSON字符串获得的JavaScript对象的值。在这里分享两种解决此问题的方法&#xff0c…

nodejs字符串如何转成json数据

var str {"a":"1","b":"2"}; var jsonstr JSON. parse( str); console. log( jsonstr); console. log( jsonstr. a); console. log( jsonstr. b); 输出结果:

JavaScript中JSON字符串转JSON对象遇到的问题

今天遇到一个奇怪的问题,解析二维码后获得了一个JSON字符串,将JSON字符串转换成JSON对象的时候报错了。 报错如下: 代码如下: 检查了无数次数据,数据是JSON字符串,引号也都是英文的,就是莫名其妙的转换不了。 最后无奈…

C# 字符串转JSON格式

C# 字符串转JSON格式 首先打开菜单栏项目菜单,找到管理NuGet程序包选项并打开。如下图: 在凑所框中搜索Newtonsoft.Json开发包,安装。 安装完成后,添加USING指令集。如下: using Newtonsoft.Json; 然后新建一个类。 p…

js字符串转与json对象类型转换

js字符串转与json对象类型转换 js字符串转化成json对象,使用JSON.parse()需要注意的地方 1、使用方法 JSON.parse(text[, reviver])参数说明: text:必需, 一个有效的 JSON 字符串。reviver: 可选,一个转换结果的函数&#xff…

如何利用python制作几个简单的游戏?(简单易上手版)

好像有很多小伙伴对python制作游戏非常感兴趣~ 那么我们今天就来从python游戏方面入手 利用python写 “猜数字”,“猜词语”,“谁是卧底” 这三个游戏, 从而快速掌握python编程的入门知识,包括 python语法/列表/元组/字典/流程…

python做的游戏有哪些

比较大型的,使用Python的游戏有两个,一个是《EVE》,还有一个是《文明》。另外GitHub上有很多开源的小游戏,下面给大家介绍一下: 1. Github上面有个项目Free Python Games,里面集合了不少的Python开发的小游…