ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

OpenCV实战:从零构建车牌识别系统(无需深度学习)

OpenCV实战:从零构建车牌识别系统(无需深度学习) 简介基于OpenCV的车牌识别系统面向计算机视觉初学者及有课程设计、毕业设计需求的开发者提供一套可直接运行的完整识别方案。系统围绕车牌定位、倾斜校正、字符分割、字符识别四个核心步骤展开在定位阶段采用Canny边缘检测、HSV/YCrCb颜色空间与形态学处理车牌倾斜时使用仿射变换校正字符分割利用连通组件分析或轮廓检测字符识别则结合SVM或CNN模型训练与推理。压缩包共125个文件、仅2.64MB包含88个bmp车牌及字符样本、13个h头文件与9个cpp源代码、dll动态库和exe可执行程序以及sln工程文件便于在Visual Studio环境直接打开、运行和二次开发。bmp样本可用于验证识别效果或重新训练分类器代码注释清晰适合逐模块理解机器视觉流程。目前已有6164人学习下载是入门OpenCV车牌识别、熟悉图像预处理与模式识别链路的高性价比参考项目。 去年做停车场道闸识别项目时甲方预算不够买商用SDK硬件也只有一台不带GPU的工控机最终我被迫用OpenCV从零手写了一套车牌识别系统并且直接部署到了客户现场。今天这篇就把这套“可直接运行”的方案完整拆开讲核心原理、核心代码、怎么避坑全部放在台面上。你不需要懂深度学习不需要GPU只要装了Python和OpenCV基础环境照着文章搭一遍就能跑起来。整个系统解决的就是三件事图片里车牌在哪、字符怎么切出来、每个字符是什么。别小看这三个问题任何一个环节出错最终识别结果都会崩所以后面的每个细节都值得细看。1. 车牌识别系统的整体设计与方案取舍1.1 先理清车牌识别的核心问题车牌识别系统LPR本质上是一条图像处理流水线由三个关键环节串联车牌定位、字符分割、字符识别。车牌定位要解决的是“车牌在哪”。一张图里可能有车、有树、有栏杆、有光斑系统要在一堆干扰中锁定车牌矩形区域。字符分割要解决的是“字符在哪”把车牌区域内的汉字、字母、数字一个个切开。字符识别要解决的是“这是哪个字”对每个切好的字符做分类最后输出完整的车牌字符串。这三个环节是串联关系误差会逐级放大。定位框偏了切出来的ROI带着过多背景分割就乱分割切歪了字符被裁掉一半识别再怎么优化也无济于事。所以整个系统设计的第一原则是宁可多留冗余也不把信息丢掉。定位时把车牌框适当外扩分割时把阈值放宽哪怕多切出几个候选块也尽量不裁掉字符边缘这个思想贯穿后面所有代码。1.2 为什么选纯OpenCV方案而不是深度学习现在做车牌识别技术路线大致分三类纯OpenCV图像处理、传统机器学习SVM/HOG、深度学习YOLO/LPRNet。我最终选了第一类原因有三个。第一部署环境限制。客户工控机没有GPU深度学习模型在CPU上跑推理延迟不可控还要额外处理模型分发和依赖库兼容问题。纯OpenCV方案依赖极少把脚本和模板目录拷过去就能跑这对“可直接运行”这个目标来说是最关键的。第二调试效率。颜色筛选、轮廓分析、模板匹配都是确定性算法出问题可以直接看中间结果定位是哪一步错了。深度学习的调试链路太长一个小参数错了就得重新训练不适合两周交付的项目周期。第三可解释性。客户现场报问题时我能直接告诉他“逆光导致颜色筛选失效”还是“汉字模板不够全”。换成深度学习模型客户问一句“为什么识别错了”你很难给一个让人信服的答案。当然纯OpenCV方案的精度天花板有限整体准确率大概在70%到85%之间和商用SDK的99%差距明显。所以这套方案适合个人项目、教学演示、低成本原型以及预算敏感的中低流量场景。真要商用级建议后续把识别环节替换成轻量CNN文章最后我会给出扩展思路。1.3 系统整体工作流程整套系统的流程可以拆成以下步骤读取图片统一缩放到合适尺寸转换到HSV颜色空间按蓝色阈值生成掩膜形态学闭运算把车牌区域连接成完整连通域轮廓查找用面积和宽高比过滤候选区域从原图裁剪车牌ROI并做外扩处理灰度化、去噪、二值化垂直投影配合连通域分析分割单个字符字符归一化到统一尺寸模板匹配识别每个字符拼接成结果这套流程每一步都有参数要调下面我会给出每个参数的含义和调优思路而不是直接扔一段代码让你自己去试错。2. OpenCV环境准备与可直接运行的工程搭建2.1 环境安装一条命令解决大部分问题先把环境搞定。Python端安装OpenCV非常简单pip install opencv-python numpy装完在终端验证python -c import cv2; print(cv2.__version__)能打印版本号就说明安装成功。很多人卡在 ModuleNotFoundError: No module named cv2原因通常只有两个一是包根本没装上二是当前Python解释器和pip不属于同一套环境。尤其用过conda或系统装了多个Python的经常出现“pip明明装好了代码运行却找不到”。排查方法很单一先确认终端里 python -c 能通过再检查IDE里配置的解释器路径是否指向同一个Python。有人问conda环境怎么装其实和pip没有区别conda activate myenv pip install opencv-python唯一要注意的是别在conda环境里混用系统级pip否则包会装到系统路径conda环境依旧找不到。这个坑我见过太多人踩了。2.2 版本坑与GUI报错OpenCV版本相关的坑非常多这里只说最常见的两个。第一个是GUI报错。如果你在无桌面服务器环境运行 cv2.imshow经常会碰到“The function is not implemented”这类错误原因是你装的是 opencv-python-headless不带GUI模块。解决办法是统一安装完整版 opencv-python同时在无显示器环境下不要调用imshow改用 cv2.imwrite 把结果图写到磁盘。我自己调试时的习惯是建一个 debug 目录把每步中间结果全部存图即使没有窗口也能完整看到处理链路这个习惯帮我在现场排查了不少问题。第二个是findContours返回值的变化。OpenCV 4.x之后findContours只返回 contours 和 hierarchy 两个值OpenCV 3.x则返回三个值第一个是修改后的图像。很多老教程还按三个值写直接把新代码带崩。判断方法很简单跑一段最小demo确认版本后再按对应方式解包。顺带说一句网上有人搜“C版OpenCV中绘制极线的函数”那是指 cv::drawEpiline属于立体视觉模块和车牌识别没关系别混在一起学。2.3 工程目录组织一个最小可运行的工程目录如下license_plate/ ├── main.py ├── templates/ │ ├── 京.png │ ├── A.png │ ├── 0.png │ └── ... └── test.jpgmain.py 放全部核心代码templates 目录放字符模板test.jpg 放测试图片。模板目录是整个工程能否“直接运行”的关键每个模板的文件名就是对应字符内容是字符的黑白二值图。模板来源有两种一是从真实车牌上截取二是用字体渲染生成。数字和字母用字体渲染问题不大因为车牌字符是标准印刷体但汉字强烈建议从真实车牌截取个中原因在识别章节会详细解释。工程里还有个容易忽视的细节模板目录路径不要写成绝对路径用相对路径或基于脚本所在目录动态拼接。这样整个文件夹拷到任何机器上都能直接跑不至于一换环境就路径报错。3. 核心实现车牌定位、字符分割与字符识别3.1 车牌定位HSV颜色筛选加轮廓分析车牌定位的核心代码如下import cv2 import numpy as np def resize_image(img, target_height600): h, w img.shape[:2] ratio target_height / h return cv2.resize(img, ( p a hrefhttps://download.csdn.net/download/qq_40872511/10791671 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表