引言
随着智能交通系统的快速发展,车牌识别技术已成为车辆管理、交通监控等领域的核心技术之一。在众多车牌识别系统中,EasyPR以其开源、中文识别能力强、识别率高等特点脱颖而出,成为众多开发者与研究人员的首选工具。本文将对EasyPR进行深入解析,探讨其技术框架、特点、更新内容及未来发展方向,并结合实际案例展示其应用效果。
一、项目简介与特点
1.1 项目背景
EasyPR是一个专为中文车牌设计的开源识别系统,旨在提供一个简单、高效、准确的车牌识别引擎。它基于OpenCV这一强大的开源计算机视觉库,使得开发者能够轻松获取全部源代码,并灵活移植到Java、C#等多种平台。
1.2 主要特点
- 开源性
:EasyPR的源代码完全开放,开发者可以自由获取、修改和分发。
- 中文识别
:支持中文车牌识别,如“苏EUK722”等,满足国内市场需求。
- 高识别率
:在图片清晰的情况下,车牌检测与字符识别精度可达80%以上。
- 跨平台性
:支持Windows、Linux、Android、iOS、Mac等多种操作系统。
二、技术框架与更新内容
2.1 技术框架
EasyPR的技术框架主要基于OpenCV库,通过车牌检测、字符分割、字符识别等步骤实现车牌识别功能。其识别流程如下:
- 车牌检测
:利用图像处理技术检测图片中的车牌区域。
- 字符分割
:将车牌区域中的字符进行分割,以便后续识别。
- 字符识别
:采用机器学习算法对分割后的字符进行识别。
2.2 更新内容
最新版本的EasyPR(1.6版)在原有基础上进行了多项优化和更新,主要包括:
-
修正了多项README文本提示,提高文档可读性。
-
增加了C#调用EasyPR的项目链接,方便C#开发者使用。
-
针对OpenCV 3.2及以上版本可能遇到的编译问题,提供了解决方案。
-
推荐Linux系统使用OpenCV 3.2以上版本,以提高识别稳定性。
三、待做工作与未来发展方向
3.1 待做工作
尽管EasyPR已经取得了显著的成果,但仍存在一些待改进的地方,主要包括:
-
完成一个CNN框架,以替换当前的ANN框架,提高识别精度和速度。
-
增加新能源车的识别功能,满足新能源汽车市场的需求。
-
增加两行车牌的识别功能,适应不同地区的车牌格式。
3.2 未来发展方向
未来,EasyPR将继续深化技术研究,优化算法性能,提高识别精度和速度。同时,将积极拓展应用场景,推动车牌识别技术在更多领域的应用落地。
四、应用案例与效果展示
4.1 应用案例
以一张包含车牌的原始图片为例,展示EasyPR的车牌识别过程及效果。首先,通过车牌检测步骤,EasyPR能够准确提取出图片中的车牌区域。接着,通过字符识别步骤,EasyPR能够识别出车牌字符及颜色信息,如“蓝牌:苏EUK722”。
例子
假设我们有如下的原始图片,需要识别出中间的车牌字符与颜色:
经过EasyPR的第一步处理车牌检测(PlateDetect)以后,我们获得了原始图片中仅包含车牌的图块:
接着,我们对图块进行OCR过程,在EasyPR中,叫做字符识别(CharsRecognize)。我们得到了一个包含车牌颜色与字符的字符串:
“蓝牌:苏EUK722”
4.2 效果展示
通过实际应用案例,我们可以看到EasyPR在车牌识别方面的强大能力。无论是车牌检测还是字符识别,都表现出了较高的精度和稳定性。这为智能交通系统、车辆管理等领域提供了有力的技术支持。
五、代码示例
EasyPR的调用非常简单,下面是一段示例代码:
CPlateRecognize pr;
pr.setResultShow(false);
pr.setDetectType(PR_DETECT_CMSER);
vector<CPlate> plateVec;
Mat src = imread(filepath);
int result = pr.plateRecognize(src, plateVec);
我们首先创建一个CPlateRecognize的对象pr,接着设置pr的属性。
pr.setResultShow(false);
这句话设置EasyPR是否打开结果展示窗口,如下图。设置为true就是打开,否则就是关闭。在需要观看定位结果时,建议打开,快速运行时关闭。
pr.setDetectType(PR_DETECT_CMSER);
pr.setDetectType(PR_DETECT_COLOR | PR_DETECT_SOBEL);
除此之外,还可以有一些其他的属性值设置:
pr.setLifemode(true);
这句话设置开启生活模式,这个属性在定位方法为SOBEL时可以发挥作用,能增大搜索范围,提高鲁棒性。
pr.setMaxPlates(4);
这句话设置EasyPR最多查找多少个车牌。当一副图中有大于n个车牌时,EasyPR最终只会输出可能性最高的n个。
下面来看pr的方法。plateRecognize()这个方法有两个参数,第一个代表输入图像,第二个代表输出的车牌CPlate集合。
vector<CPlate> plateVec;
Mat src = imread(filepath);
int result = pr.plateRecognize(src, plateVec);
当返回结果result为0时,代表识别成功,否则失败。
CPlate类包含了车牌的各种信息,其中重要的如下:
CPlate plate = plateVec.at(i);
Mat plateMat = plate.getPlateMat();
RotatedRect rrect = plate.getPlatePos();
string license = plate.getPlateStr();
plateMat代表车牌图像,rrect代表车牌的可旋转矩形位置,license代表车牌字符串,例如“蓝牌:苏EUK722”。
这里说下如何去阅读如下图的识别结果。
第1行代表的是图片的文件名。
第2行代表GroundTruth车牌,用后缀(g)表示。第3行代表EasyPR检测车牌,用后缀(d)表示。两者形成一个配对,第4行代表两者的字符差距。
下面同上。本图片中有3个车牌,所有共有三个配对。最后的Recall等指标代表的是整幅图片的定位评价,考虑了三个配对的结果。
有时检测车牌的部分会用“无车牌”与“No string”替代。“无车牌”代表“定位不成功”,“No string”代表“定位成功但字符分割失败”。
六、项目目录结构
以下表格是本工程中所有目录的解释:
目录 |
解释 |
---|---|
src |
所有源文件 |
include |
所有头文件 |
test |
测试程序 |
model |
机器学习的模型 |
resources/text |
中文字符映射表 |
resources/train |
训练数据与说明 |
resources/image |
测试用的图片 |
resources/doc |
相关文档 |
tmp |
训练数据读取目录,需要自建 |
以下表格是resources/image目录中子目录的解释:
目录 |
解释 |
---|---|
general_test |
GDTS(通用数据测试集) |
native_test |
NDTS(本地数据测试集) |
tmp |
Debug模式下EasyPR输出中间图片的目录,需要自建 |
以下表格是src目录中子目录的解释:
目录 |
解释 |
---|---|
core |
核心功能 |
preprocess |
SVM预处理 |
train |
训练目录,存放模型训练的代码 |
util |
辅助功能 |
以下表格是src目录下一些核心文件的解释与关系:
文件 |
解释 |
---|---|
plate_locate |
车牌定位 |
plate_judge |
车牌判断 |
plate_detect |
车牌检测,是车牌定位与车牌判断功能的组合 |
chars_segment |
字符分割 |
chars_identify |
字符鉴别 |
chars_recognise |
字符识别,是字符分割与字符鉴别功能的组合 |
plate_recognize |
车牌识别,是车牌检测与字符识别的共有子类 |
feature |
特征提取回调函数 |
plate |
车牌抽象 |
core_func.h |
共有的一些函数 |
以下表格是test目录下文件的解释:
文件 |
解释 |
---|---|
main.cpp |
主命令行窗口 |
accuracy.hpp |
批量测试 |
chars.hpp |
字符识别相关 |
plate.hpp |
车牌识别相关 |
以下表格是train目录下文件的解释:
文件 |
解释 |
---|---|
ann_train.cpp |
训练二值化字符 |
annCh_train.hpp |
训练中文灰度字符 |
svm_train.hpp |
训练车牌判断 |
create_data.hpp |
生成合成数据 |
七、结论与展望
EasyPR作为一款中文开源车牌识别系统,以其开源性、中文识别能力强、高识别率等特点,在智能交通领域展现出了巨大的应用潜力。通过不断的技术更新和优化,EasyPR将进一步提升识别精度和速度,拓展应用场景,为更多领域提供智能化的解决方案。未来,我们有理由相信,EasyPR将成为车牌识别技术领域的佼佼者,为推动智能交通系统的发展做出更大的贡献。