# Python opencv 车牌识别
## 原理简介
* 车牌字符识别使用的算法是 opencv 的 SVM
* opencv 的 SVM 使用代码来自于 opencv 附带的 sample,StatModel 类和 SVM 类都是 sample 中的代码
* 训练数据文件 `svm.dat` 和 `svmchinese.dat`
* 使用 `图像边缘` 和 `车牌颜色` 定位车牌,再识别 `字符`
![](https://www.writebug.com/myres/static/uploads/2021/11/20/fc210cbd2839f8c957057723a5fd3075.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/20/2fe667625f936474176ff80a2a79153b.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/11/20/1e70011597277522ed924adf966314cf.writebug)
```bash
# 主函数中初始化车牌识别需要的算法函数,并加载训练数据文件
self.predictor = predict.CardPredictor()
self.predictor.train_svm()
# lib下算法函数加载训练数据文件
class CardPredictor:
def __init__(self):
pass
# 加载训练数据文件
def train_svm(self):
# 识别英文字母和数字
self.model = SVM(C=1, gamma=0.5)
# 识别中文
self.modelchinese = SVM(C=1, gamma=0.5)
if os.path.exists("lib/svm.dat"):
self.model.load("lib/svm.dat")
if os.path.exists("lib/svmchinese.dat"):
self.modelchinese.load("lib/svmchinese.dat")
```
```bash
# main.py 主函数中车牌识别函数
def pic(self, pic_path):
# 以uint8方式读取 pic_path 放入 img_bgr 中,cv2.IMREAD_COLOR读取彩色照片
img_bgr = img_math.img_read(pic_path)
# 缩小图片 转化成灰度图像 创建20*20的元素为1的矩阵 开操作,并和img重合 基于OTSU的二值化处理 找到图像边缘
# first_img, oldimg 已经处理好的图像文件 原图像文件
first_img, oldimg = self.predictor.img_first_pre(img_bgr)
# 未开启摄像头时显示经过resize的图片
if not self.cameraflag:
self.imgtk = self.get_imgtk(img_bgr)
self.image_ctl.configure(image=self.imgtk)
# 开始进行识别
# img_color_contours形状定位识别 输入 预处理好的图像 原图像
# 排除面积最小的点 进行矩形矫正 转换 分隔字符 分离车牌字符
# return 识别到的字符、定位的车牌图像、车牌颜色
# img_only_color颜色定位识别 输入 预处理好的图像 原图像
# 根据阈值找到对应颜色 认为水平方向,最大的波峰为车牌区域 查找垂直直方图波峰 去掉车牌上下边缘1个像素,避免白边影响阈值判断 分隔字符 分离车牌字符
# return 识别到的字符、定位的车牌图像、车牌颜色
th1 = ThreadWithReturnValue(target=self.predictor.img_color_contours, args=(first_img, oldimg))
th2 = ThreadWithReturnValue(target=self.predictor.img_only_color, args=(oldimg, oldimg, first_img))
th1.start()
th2.start()
r_c, roi_c, color_c = th1.join()
r_color, roi_color, color_color = th2.join()
# 显示 识别到的字符、定位的车牌图像、车牌颜色
self.show_roi2(r_color, roi_color, color_color)
self.show_roi1(r_c, roi_c, color_c)
```
### 一. 车牌图像预处理
* 1.将彩色图像转化为灰度图
* 2.采用 20*20 模版对图像进行高斯模糊来缓解由照相机或其他环境噪声(如果不这么做,我们会得到很多垂直边缘,导致错误检测。)
* 3.使用 Otsu 自适应阈值算法获得图像二值化的阈值,并得到一副二值化图片
* 4.采用闭操作,去除每个垂直边缘线之间的空白空格,并连接所有包含 大量边缘的区域(这步过后,我们将有许多包含车牌的候选区域)
* 5.由于大多数区域并不包含车牌,我们使用轮廓外接矩形的纵横比和区域面积,对这些区域进行区分。
* a.首先使用 findContours 找到外部轮廓
* b.使用 minAreaRect 获得这些轮廓的最小外接矩形,存储在 vector 向量中
* c.使用面积和长宽比阈值,作基本的验证
### 二. 车牌图像定位
车牌定位的主要工作是从摄入的汽车图像中找到汽车牌照所在位置,并把车牌从该区域中准确地分割出来,供字符分割使用。
因此,牌照区域的确定是影响系统性能的重要因素之一,牌照的定位与否直接影响到字符分割和字符识别的准确率。
目前车牌定位的方法很多,但总的来说可以分为以下 4 类:
* (1)基于颜色的分割方法,这种方法主要利用颜色空间的信息,实现车牌分割,包括彩色边缘算法、颜色距离和相似度算法等;
* (2)基于纹理的分割方法,这种方法主要利用车牌区域水平方向的纹理特征进行分割,包括小波纹理、水平梯度差分纹理等;
* (3)基于边缘检测的分割方法;
* (4)基于数学形态法的分割方法。
为了代码实现上的方便,我采用的是基于边缘检测的分割方法和基于颜色的分割方法。
* 车牌中有大量的垂直边缘,这个特征可以定位车牌。
* 根据阈值找到对应颜色来定位车牌。
### 三. 车牌图像矩形矫正
因为摄像头和车辆车牌之间的角度有不同的变化, 一般所拍摄的车牌图像都不是理想状态下的矩形, 如果这样将会给后面的字符分割带来不利的影响, 增加了字符分割的难度, 更增加了后续的字符识别的困难, 造成识别率下降。因此, 在字符分割之前, 我们需要进行对倾斜的矩形车牌进行校正。
### 四. 车牌图像字符分割
要识别车牌字符,前提是先进行车牌字符的正确分割与提取。字符分割的任务是把多列或多行字符图像中的每个字符从整个图像中切割出来成为单个字符。车牌字符的正确分割对字符的识别是很关键的。传统的字符分割算法可以归纳为以下三类:直接分割法、基于识别基础上的分割法、自适应分割线类聚法。直接分割法简单,但它的局限是分割点的确定需要较高的准确性;基于识别基础上的分割法是把识别和分割结合起来,但是需要识别的高准确性,它根据分类和识别的耦合程度又有不同的划分;自适应分割线聚类法是要建立一个分类器,用它来判断图像的每一列是否是分割线,它是根据训练样本来进行自适应学习的神经网络分类器,但对于粘连字符训练困难。也有直接把字符组成的单词当作一个整体来识别的,诸如运用马尔科夫数学模型等方法进行处理,这些算法主要应用于印刷体文本识别。已经定位好的车牌图像
### 五. 车牌图像字符识别
* 去除固定车牌的铆钉
* 对字符分割的图块使用训练好的 svm 模型进行识别
* 判断最后一个数是否是车牌边缘,假设车牌边缘被认为是 1,1 太细,认为是边缘
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
原理简介 • 车牌字符识别使用的算法是 opencv 的 SVM • opencv 的 SVM 使用代码来自于 opencv 附带的 sample,StatModel 类和 SVM 类都是 sample 中的代码 • 训练数据文件 svm.dat 和 svmchinese.dat • 使用 图像边缘 和 车牌颜色 定位车牌,再识别 字符 直接下载运行就可以 。。
资源推荐
资源详情
资源评论
收起资源包目录
PlateRecogntion_Python-master.zip (50个子文件)
platerecogntion_python
.vscode
settings.json 47B
launch.json 457B
flask_img
__init__.py 774B
lib
tempdir.py 229B
img_recognition.py 2KB
svm.dat 4.41MB
img_math.py 11KB
svmchinese.dat 3.43MB
img_function.py 16KB
main.py 4KB
flask_img.sql 225B
static
assets
js
chunk-vendors.cffd15f9.js 800KB
app.fe1e43bc.js.map 21KB
chunk-vendors.cffd15f9.js.map 3.1MB
app.fe1e43bc.js 5KB
css
chunk-vendors.737cdb55.css 205KB
app.367a8c1d.css 202B
fonts
element-icons.535877f5.woff 28KB
element-icons.732389de.ttf 55KB
favicon.ico 4KB
index.html 912B
README
demo3.png 575KB
demo2.png 569KB
demo.png 454KB
.github
workflows
main.yml 412B
doc
doc.md 7KB
LICENSE 1KB
tests
test_app.py 242B
docker
flask.Dockerfile 733B
docker-compose.yml 270B
start.sh 444B
Dockerfile 1KB
test.sh 267B
requirements.txt 131B
.devcontainer
devcontainer.json 397B
start 144B
.gitignore 66B
README.md 7KB
flask_img_vue
yarn.lock 345KB
babel.config.js 73B
src
App.vue 469B
assets
logo.png 7KB
main.js 419B
components
UploadImg.vue 3KB
package.json 911B
public
favicon.ico 4KB
index.html 613B
vue.config.js 532B
.gitignore 230B
README.md 317B
共 50 条
- 1
资源评论
- 许栩8502024-02-09资源太好了,解决了我当下遇到的难题,抱紧大佬的大腿~
- kerwin6666662024-05-02资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~
- DWJSSG2024-05-14资源值得借鉴的内容很多,那就浅学一下吧,值得下载!
- 不想说话的树2024-01-17总算找到了想要的资源,搞定遇到的大问题,赞赞赞!
甜辣uu
- 粉丝: 9443
- 资源: 1102
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功