基于Python opencv的车牌识别系统,附源码

博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w+、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌

🍅文末获取源码联系🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

Java基于微信小程序的校园外卖平台设计与实现,附源码
Python基于Django的微博热搜、微博舆论可视化系统,附源码
Java基于SpringBoot+Vue的学生宿舍管理系统

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我留言咨询,希望帮助更多的人

1 原理简介

基于Python opencv的车牌识别系统

  • 车牌字符识别使用的算法是opencv的SVM
  • opencv的SVM使用代码来自于opencv附带的sample,StatModel类和SVM类都是sample中的代码
  • 训练数据文件svm.datsvmchinese.dat
  • 使用图像边缘车牌颜色定位车牌,再识别字符
# 主函数中初始化车牌识别需要的算法函数,并加载训练数据文件
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")
# 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)

2 车牌图像预处理

  • 1.将彩色图像转化为灰度图
    在这里插入图片描述

  • 2.采用20*20模版对图像进行高斯模糊来缓解由照相机或其他环境噪声(如果不这么做,我们会得到很多垂直边缘,导致错误检测。)
    在这里插入图片描述

  • 3.使用Otsu自适应阈值算法获得图像二值化的阈值,并由此得到一副二值化图片
    在这里插入图片描述

  • 4.采用闭操作,去除每个垂直边缘线之间的空白空格,并连接所有包含 大量边缘的区域(这步过后,我们将有许多包含车牌的候选区域)
    在这里插入图片描述

  • 5.由于大多数区域并不包含车牌,我们使用轮廓外接矩形的纵横比和区域面积,对这些区域进行区分。

    • a.首先使用findContours找到外部轮廓
    • b.使用minAreaRect获得这些轮廓的最小外接矩形,存储在vector向量中
    • c.使用面积和长宽比阈值,作基本的验证

3 车牌图像定位

车牌定位的主要工作是从摄入的汽车图像中找到汽车牌照所在位置,并把车牌从该区域中准确地分割出来,供字符分割使用。 因此,牌照区域的确定是影响系统性能的重要因素之一,牌照的定位与否直接影响到字符分割和字符识别的准确率。 目前车牌定位的方法很多,但总的来说可以分为以下4类:

  • (1)基于颜色的分割方法,这种方法主要利用颜色空间的信息,实现车牌分割,包括彩色边缘算法、颜色距离和相似度算法等;
  • (2)基于纹理的分割方法,这种方法主要利用车牌区域水平方向的纹理特征进行分割,包括小波纹理、水平梯度差分纹理等;
  • (3)基于边缘检测的分割方法;
  • (4)基于数学形态法的分割方法。

为了代码实现上的方便,我采用的是基于边缘检测的分割方法和基于颜色的分割方法。

  • 车牌中有大量的垂直边缘,这个特征可以定位车牌。
  • 根据阈值找到对应颜色来定位车牌。

4 车牌图像矩形矫正

因为摄像头和车辆车牌之间的角度有不同的变化, 一般所拍摄的车牌图像都不是理想状态下的矩形, 如果这样将会给后面的字符分割带来不利的影响, 增加了字符分割的难度, 更增加了后续的字符识别的困难, 造成识别率下降。因此, 在字符分割之前, 我们需要进行对倾斜的矩形车牌进行校正。

5 车牌图像字符分割

要识别车牌字符,前提是先进行车牌字符的正确分割与提取。字符分割的任务是把多列或多行字符图像中的每个字符从整个图像中切割出来成为单个字符。车牌字符的正确分割对字符的识别是很关键的。传统的字符分割算法可以归纳为以下三类:直接分割法、基于识别基础上的分割法、自适应分割线类聚法。直接分割法简单,但它的局限是分割点的确定需要较高的准确性;基于识别基础上的分割法是把识别和分割结合起来,但是需要识别的高准确性,它根据分类和识别的耦合程度又有不同的划分;自适应分割线聚类法是要建立一个分类器,用它来判断图像的每一列是否是分割线,它是根据训练样本来进行自适应学习的神经网络分类器,但对于粘连字符训练困难。也有直接把字符组成的单词当作一个整体来识别的,诸如运用马尔科夫数学模型等方法进行处理,这些算法主要应用于印刷体文本识别。

  • 已经定位好的车牌图像
    在这里插入图片描述

  • 车牌图像灰度化
    在这里插入图片描述

  • 车牌图像二值化
    在这里插入图片描述

  • 车牌二值化图像去除上下边框
    在这里插入图片描述

  • 去掉车牌上下边缘1个像素,避免白边影响阈值判断
    在这里插入图片描述

  • 分离车牌字符

6 车牌图像字符识别

  • 去除固定车牌的铆钉
  • 对字符分割的图块使用训练好的svm模型进行识别
  • 判断最后一个数是否是车牌边缘,假设车牌边缘被认为是1,1太细,认为是边缘

7 推荐阅读

基于Python的循环神经网络的情感分类系统设计与实现,附源码

Python基于人脸识别的实验室智能门禁系统的设计与实现,附源码

Java基于微信小程序的讲座预约系统的研究与实现,附源码

Java基于微信小程序的校园订餐系统

Java基于SpringBoot的在线学习平台

2023年Java毕业设计题目如何选题?Java毕业设计选题大全

基于Python的机器学习的文本分类系统

基于Python dlib的人脸识别的上课考勤管理系统(V2.0)

Java 基于 SpringBoot+Vue 的公司人事管理系统的研究与实现(V2.0)

8 源码获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

Python毕业设计

Java 大学生实战精品项目

Java微信小程序精品项目

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及文档编写等相关问题都可以给我留言咨询,希望帮助更多的人

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
车牌识别系统是一种基于深度学习和opencv的应用程序,通过对车辆图片或视频中的车牌进行识别。下面是一个简单的车牌识别系统源码实现: ```python import cv2 import numpy as np import tensorflow as tf # 加载预训练的深度学习模型 model = tf.keras.models.load_model('path/to/pretrained/model.h5') # 加载车牌检测器 plate_cascade = cv2.CascadeClassifier('path/to/haarcascade_plate.xml') # 车牌字符集 char_set = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'] # 读取车牌图片 image = cv2.imread('path/to/image.jpg') # 转为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测车牌 plates = plate_cascade.detectMultiScale(gray, 1.1, 4) # 遍历每个检测到的车牌 for (x, y, w, h) in plates: # 提取车牌图像 plate_image = image[y:y + h, x:x + w] # 调整尺寸为模型输入尺寸 resized_image = cv2.resize(plate_image, (80, 80)) # 转为灰度图像 grayscale_image = cv2.cvtColor(resized_image, cv2.COLOR_BGR2GRAY) # 归一化 normalized_image = grayscale_image / 255. # 添加批次维度 batched_image = np.expand_dims(normalized_image, axis=0) # 使用深度学习模型进行预测 predictions = model.predict(batched_image) # 解码预测结果 decoded_predictions = [char_set[np.argmax(p)] for p in predictions] # 输出车牌识别结果 license_plate = ''.join(decoded_predictions) print("识别结果:", license_plate) # 绘制车牌框 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 标注车牌字符 cv2.putText(image, license_plate, (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示结果图像 cv2.imshow('License Plate Detection', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上是一个简单的车牌识别系统源码示例,其中使用了训练好的深度学习模型对车牌进行识别,同时利用Haar特征的级联分类器对车牌进行检测。最终在图像上显示了检测到的车牌以及识别结果。请注意,这只是一个简单的示例,实际的车牌识别系统会更加复杂,需要根据具体需求进行进一步的优化和改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java老徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值