一辆车的照片如何提取车牌号码?(OCR仅仅是获取数字,怎么能确定该数字是车牌号呢)
通用 OCR 只负责 "识别文字内容",它不知道哪段文字属于车牌。 完整车牌识别 = 车牌检测(找到车牌在哪) + OCR 字符识别(读出号码) + 格式校验(判断是不是合法车牌) 三大块。
如果你直接把整张车照片丢给 PaddleOCR,图片里会识别出:车身贴纸、广告牌、地面文字、车窗贴纸、车牌字符一大堆文本。OCR 分不清哪个才是车牌。
完整流水线(一张车辆照片提取车牌)
1️⃣ 车牌检测(最重要:确定哪一块区域是车牌)
两种实现方式:
- 深度学习方案(工程最常用) 用 YOLO 训练一个专门检测车牌的模型,输出车牌的矩形框
x1,y1,x2,y2,类别就是license_plate,直接把车牌从整张图抠出来(ROI 裁剪)。
只把裁剪出来的车牌小图送给 OCR,其他区域全部丢弃。
- 传统 OpenCV 方案 通过轮廓、颜色(蓝 / 黄 / 绿底色)、宽高比(国内车牌宽高比大约 3:1)过滤候选矩形,筛选出疑似车牌区域。
2️⃣ 图像矫正
裁剪出来的车牌可能倾斜、透视畸变,做透视变换转正车牌图像。
3️⃣ OCR 识别(仅仅读出字符)
把转正后的车牌小图送入 OCR (PaddleOCR/EasyOCR/LPRNet),得到一串文字,例如:粤A12345。
这一步只做字符读取,不知道这是不是车牌。
4️⃣ 后处理校验:判断读到的数字文字到底是不是合法车牌号
这一步解决你的疑问:拿到一串字符,怎么确认它是车牌号码,而不是广告文字? 用规则约束过滤:
- 字符集合:第一位必须是国内省份简称汉字(粤、京、沪、陕......);后面只能是大写字母 + 数字,不能出现普通汉字。
- 长度校验:普通蓝牌 7 位;新能源车牌 8 位。
- 正则表达式匹配,过滤掉不符合车牌格式的 OCR 结果。
- 置信度过滤:OCR 输出置信度太低直接丢弃。
举例:OCR 识别出
ABC123超市特价,正则直接判定不是车牌,丢弃该结果。
通俗比喻
- OCR:就像一个识字的人,随便看到什么字都念出来;
- 车牌检测:用手指把车牌框出来:"看,就只看这一小块";
- 格式校验:拿一套车牌书写规范,检查读出来的文字符不符合车牌的写法,符合才输出为车牌号。
容易混淆的两个方案
- 通用 OCR (PaddleOCR 原版):通用文字识别,没有车牌概念,不能直接做车牌识别。
- LPRNet / YOLO‑plate + OCR:车牌专用方案,先检测车牌位置,裁剪后识别,再格式校验,输出车牌号码。