EasyPR

GitHub
6.4k 2.5k 较难 1 次阅读 5天前Apache-2.0图像数据工具开发框架
AI 解读 由 AI 自动生成,仅供参考

EasyPR 是一款专为中文车牌识别设计的开源系统,旨在解决复杂非限制场景下车牌自动检测与字符提取的难题。无论是光照变化、角度倾斜还是背景杂乱的环境,它都能基于 OpenCV 库实现高效、准确的识别,在图片清晰时综合精度可达 80% 以上。

该项目特别适合计算机视觉开发者、智能交通领域的研究人员以及需要集成车牌识别功能的工程师使用。其核心优势在于完全开源且跨平台,支持 Windows、Linux、Android、iOS 等多种环境,并允许用户获取全部源代码进行自定义移植。技术上,EasyPR 不仅支持中文字符的精准输出(如“苏 EUK722"),还灵活提供了多种定位算法(如颜色、边缘及纹理特征组合)和“生活模式”以增强鲁棒性。此外,项目规划了向 CNN 深度学习框架的演进,以进一步提升对新能源车及多行车牌的适应能力。遵循 Apache v2.0 协议,EasyPR 为构建智慧城市场景下的车辆管理应用提供了坚实且灵活的技术底座。

使用场景

某智慧社区物业团队正在开发一套自动放行系统,旨在通过摄像头识别进出车辆的中国车牌,以实现无人值守管理。

没有 EasyPR 时

  • 人工成本高昂:保安需 24 小时轮班,手动记录或核对每辆车的“苏 E"、“京 A"等中文车牌信息,效率极低且易疲劳出错。
  • 复杂场景失效:遇到雨天反光、夜间光线不足或车辆倾斜停放时,通用 OCR 工具无法定位车牌,导致系统频繁报错“无车牌”。
  • 中文识别空白:大多数开源方案仅支持英文和数字,面对包含汉字省份简称的车牌(如“苏 EUK722"),只能输出乱码或空字符串。
  • 跨平台部署困难:团队需要在 Linux 服务器和 Android 手持终端上同时运行,但缺乏统一库支持,需重复开发多套代码。

使用 EasyPR 后

  • 实现全自动通行:EasyPR 能准确输出“蓝牌:苏 EUK722"结构化数据,系统自动比对数据库开闸,完全替代人工登记环节。
  • 鲁棒性显著提升:利用其基于颜色与边缘的定位算法(Sobel/Color),即使在非限制场景下(如光照不均、角度倾斜),车牌检测精度仍保持在 80% 以上。
  • 原生中文支持:直接内置中文字符映射表,无需额外训练即可精准识别各省份简称,彻底解决中文车牌乱码问题。
  • 多端快速移植:基于 OpenCV 构建,团队轻松将同一套核心逻辑移植到 Linux 后端及 Android 移动巡检设备上,大幅缩短开发周期。

EasyPR 通过提供高精度、原生的中文车牌识别能力,将复杂的非限制场景车辆管理转化为简单高效的自动化流程。

运行环境要求

操作系统
  • Windows
  • Linux
  • macOS
GPU

未说明

内存

未说明

依赖
notes该项目主要基于 C++ 和 OpenCV 开发。Linux 系统强烈推荐使用 OpenCV 3.2 及以上版本,低版本可能导致识别结果为空;Windows 无此限制。若使用 OpenCV 3.2+ 遇到编译错误(如 ANN_MLP),需修改 config.h 中的版本宏定义。提供无需配置 OpenCV 的‘懒人版’,但仅支持 VS2013、Debug 模式及 x86 架构。另有 C#、Android、iOS 和 Java 等衍生版本。
python不适用 (主要基于 C++)
OpenCV >= 3.0 (推荐 3.2+)
Visual Studio 2013 (仅限懒人版)
EasyPR hero image

快速开始

EasyPR

EasyPR是一个开源的中文车牌识别系统,其目标是成为一个简单、高效、准确的非限制场景(unconstrained situation)下的车牌识别库。

相比于其他的车牌识别系统,EasyPR有如下特点:

  • 它基于openCV这个开源库。这意味着你可以获取全部源代码,并且移植到opencv支持的所有平台。
  • 它能够识别中文。例如车牌为苏EUK722的图片,它可以准确地输出std:string类型的"苏EUK722"的结果。
  • 它的识别率较高。图片清晰情况下,车牌检测与字符识别可以达到80%以上的精度。

更新

本次更新版本是1.6正式版本,主要有以下几点更新:

  1. 修正了多项readme的文本提示。

  2. 增加了C#调用EasyPR的一个项目的链接,感谢 @zhang-can 同学。

注意

  1. 对于Opencv3.2或以上版本,如果碰到编译问题,例如“ANN_MLP”相关的错误,尝试将config.h中将#define CV_VERSION_THREE_ZERO改为#define CV_VERSION_THREE_TWO试试.

  2. linux系统推荐使用Opencv3.2以上版本。3.2以下的版本例如3.0和3.1在识别时可能会出现车牌识别结果为空的情况。稳妥起见,建议都升级到最新的3.2版本。Windows版本没有这个问题。

待做的工作

  • 完成一个CNN框架
  • 替换ANN为CNN
  • 增加新能源车的识别(待定)
  • 增加两行车牌的识别(待定)

跨平台

目前除了windows平台以外,还有以下其他平台的EasyPR版本。一些平台的版本可能会暂时落后于主平台。

现在有一个无需配置opencv的1.5版本的懒人版。仅仅支持vs2013,也只能在debug和x86下运行,其他情况的话还是得配置opencv。感谢范文捷同学的帮助。页面里的两个文件都要下载,下载后用7zip解压。

版本 开发者 版本 地址
C# zhang-can 1.5 zhang-can/EasyPR-DLL-CSharp
android goldriver 1.4 linuxxx/EasyPR_Android
linux Micooz 1.6 已跟EasyPR整合
ios zhoushiwei 1.3 zhoushiwei/EasyPR-iOS
mac zhoushiwei,Micooz 1.6 已跟EasyPR整合
java fan-wenjie 1.2 fan-wenjie/EasyPR-Java
懒人版 fan-wenjie 1.5 git/oschina

兼容性

当前EasyPR是基于opencv3.0版本开发的,3.0及以上的版本应该可以兼容,以前的版本可能会存在不兼容的现象。

例子

假设我们有如下的原始图片,需要识别出中间的车牌字符与颜色:

EasyPR 原始图片

经过EasyPR的第一步处理车牌检测(PlateDetect)以后,我们获得了原始图片中仅包含车牌的图块:

EasyPR 车牌

接着,我们对图块进行OCR过程,在EasyPR中,叫做字符识别(CharsRecognize)。我们得到了一个包含车牌颜色与字符的字符串:

“蓝牌:苏EUK722”

示例

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就是打开,否则就是关闭。在需要观看定位结果时,建议打开,快速运行时关闭。

EasyPR 输出窗口

	pr.setDetectType(PR_DETECT_CMSER);

这句话设置EasyPR采用的车牌定位算法。CMER代表文字定位方法,SOBEL和COLOR分别代表边缘和颜色定位方法。可以通过"|"符号结合。

	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”。

这里说下如何去阅读如下图的识别结果。

EasyPR DetectResults

第1行代表的是图片的文件名。

第2行代表GroundTruth车牌,用后缀(g)表示。第3行代表EasyPR检测车牌,用后缀(d)表示。两者形成一个配对,第4行代表两者的字符差距。

下面同上。本图片中有3个车牌,所有共有三个配对。最后的Recall等指标代表的是整幅图片的定位评价,考虑了三个配对的结果。

有时检测车牌的部分会用“无车牌”与“No string”替代。“无车牌”代表“定位不成功”,“No string”代表“定位成功但字符分割失败”。

版权

EasyPR的源代码与训练数据遵循Apache v2.0协议开源。

EasyPR的resources/image/general_test文件夹下的图片数据遵循GDSL协议(通用数据共享协议)进行开放。

请确保在使用前了解以上协议的内容。

目录结构

以下表格是本工程中所有目录的解释:

目录 解释
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讨论QQ群号是:一群:366392603,二群:583022188,三群:637614031,四群:548362608,加前请注明EasyPR学习讨论。

Contributors

  • liuruoze:1.0-1.2,1.5版作者

  • 海豚嘎嘎(车主之家):1.3版算法贡献者,提升了车牌定位与字符识别的准确率

  • Micooz:1.3-1.4版架构重构,linux与mac支持,opencv3.0支持,utf-8编码转换

  • jsxyhelu:deface版本一

  • zhoushiwei:deface版本二

  • ahccom:新的plateLocate函数

  • 阿水:1.3版整合,数据标注等工作

  • fan-wenjie:1.5版opencv整合版提供者

  • Free:1.6版数据提供者

鸣谢

taotao1233,邱锦山,唐大侠,jsxyhelu,如果有一天(zhoushiwei),学习奋斗,袁承志,圣城小石匠,goldriver,Micooz,梦里时光,Rain Wang,任薛纪,ahccom,星夜落尘,海豚嘎嘎(车主之家),刘超,Free大神,以及所有对EasyPR贡献数据的热心同学。

版本历史

v1.5beta2016/07/06

相似工具推荐

openclaw

OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你

349.3k|★★★☆☆|1周前
Agent开发框架图像

stable-diffusion-webui

stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。

162.1k|★★★☆☆|1周前
开发框架图像Agent

everything-claude-code

everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上

159.6k|★★☆☆☆|今天
开发框架Agent语言模型

ComfyUI

ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。

108.3k|★★☆☆☆|1周前
开发框架图像Agent

gemini-cli

gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。

100.8k|★★☆☆☆|1周前
插件Agent图像

markitdown

MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器

93.4k|★★☆☆☆|1周前
插件开发框架