完整代码:https://download.csdn.net/download/qq_38735017/87416699

原理简介

  • 车牌字符识别使用的算法是 opencv 的 SVM

  • opencv 的 SVM 使用代码来自于 opencv 附带的 sample,StatModel 类和 SVM 类都是 sample 中的代码

  • 训练数据文件 svm.dat 和 svmchinese.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)

一. 车牌图像预处理

  • 1.将彩色图像转化为灰度图

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

  • 3.使用 Otsu 自适应阈值算法获得图像二值化的阈值,并得到一副二值化图片

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

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

  • a.首先使用 findContours 找到外部轮廓

  • b.使用 minAreaRect 获得这些轮廓的最小外接矩形,存储在 vector 向量中

  • c.使用面积和长宽比阈值,作基本的验证

二. 车牌图像定位

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

  • (1)基于颜色的分割方法,这种方法主要利用颜色空间的信息,实现车牌分割,包括彩色边缘算法、颜色距离和相似度算法等;

  • (2)基于纹理的分割方法,这种方法主要利用车牌区域水平方向的纹理特征进行分割,包括小波纹理、水平梯度差分纹理等;

  • (3)基于边缘检测的分割方法;

  • (4)基于数学形态法的分割方法。

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

  • 车牌中有大量的垂直边缘,这个特征可以定位车牌。

  • 根据阈值找到对应颜色来定位车牌。

三. 车牌图像矩形矫正

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

四. 车牌图像字符分割

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

五. 车牌图像字符识别

  • 去除固定车牌的铆钉

  • 对字符分割的图块使用训练好的 svm 模型进行识别

  • 判断最后一个数是否是车牌边缘,假设车牌边缘被认为是 1,1 太细,认为是边缘

基于Python opencv实现车牌识别及二维码条形码识别系统 附完整源码相关推荐

  1. C++旋转二维MxN矩阵的算法(附完整源码)

    C++旋转二维MxN矩阵的算法 C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) C++旋转二维MxN矩阵的算法完整源码(定义,实现,main函数测试) #include < ...

  2. C++二叉搜索树(Binary Search Tree)(附完整源码)

    二叉搜索树Binary Search Tree node结构体定义 Queue结构体定义 二叉搜索树Binary Search Tree算法的完整源码(定义,实现,main函数测试) node结构体定 ...

  3. 投票源码程序_[内附完整源码和文档] 基于JSP实现的影视创作论坛系统

    摘 要 随着时代的发展,互联网的出现,给传统影视行业带来的最大便利就是,方便了影视从业人员以及爱好者的交流和互动,而为用户提供一个书写影评,阅读影评以及回复影评的平台,以影评为载体来使用户感受影评.解 ...

  4. Python:实现hill climbing爬山法用来寻找函数的最大值算法(附完整源码)

    Python:实现hill climbing爬山法用来寻找函数的最大值算法 import mathclass SearchProblem:def __init__(self, x: int, y: i ...

  5. Python:实现一个Pangram字符串至少包含一次所有字母算法(附完整源码)

    Python:实现一个Pangram字符串至少包含一次所有字母算法 def check_pangram(input_str: str = "The quick brown fox jumps ...

  6. java 远程视频监控系统_基于android的远程视频监控系统 附完整源码

    [实例简介]原理:客户端将采集到的每一帧图像数据发送至服务器,服务器接收 [实例截图] [核心代码] /* * @version 1.2 2012-06-29 * @author wanghai */ ...

  7. 基于python+OpenCV的车牌号码识别

    基于python+OpenCV的车牌号码识别 车牌识别行业已具备一定的市场规模,在电子警察.公路卡口.停车场.商业管理.汽修服务等领域已取得了部分应用.一个典型的车辆牌照识别系统一般包括以下4个部分: ...

  8. 【开源分享】基于Python+OpenCV+PyQt5车牌识别(GUI界面)

    亲测无错:基于Python+OpenCV+PyQt5车牌识别(GUI界面)绝对可以用的!!!!! 基于Python+OpenCV+PyQt5车牌识别(GUI界面) 参考文档

  9. python opencv人脸识别考勤系统的完整源码

    这篇文章主要介绍了python opencv人脸识别考勤系统的完整源码,本文给大家介绍的非常详细,希望对大家的学习或工作具有一定的参考借鉴价值. 代码如下: import wx import wx.g ...

最新文章

  1. 基于YOLO的手部检测和计数实现(课程设计,训练和测试)(1)
  2. QTP中对数据库的操作(查询,更新和删除等)
  3. 华为电视鸿蒙系统好用吗,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  4. LeetCode 678. 有效的括号字符串(栈)
  5. linux bash 历史记录,Linux Bash History 命令历史记录
  6. ASP.NET MVC模型绑定int超出范围时
  7. Enable mod_rewrite in apache2.2
  8. 网关 跨域_好文推荐:微服务网关实战—Spring Cloud Gateway
  9. java海康摄像头添加人脸_java及opencv实现调用本地摄像头、网络摄像头完成人脸检测、人脸收集、人脸识别、性别识别...
  10. VS2015彻底卸载干净
  11. 智慧工地视频监控系统解决方案
  12. Dockerfile概念简介
  13. mysql normsinv,在MySQL中实现NORMSINV函数
  14. [bzoj3939_Usaco2015 Feb]Cow Hopscotch(线段树维护DP)
  15. 2021-08-16
  16. 【可见光室内定位】(一)概览
  17. Spring boot Failed to bind properties under ‘XXX‘问题
  18. 我的世界服务器无限背包,我的世界无限背包存档
  19. GEE学习笔记:在GEE中批量下载Landsat影像
  20. ctfshow-web364(SSTI)

热门文章

  1. 嵌入式ARM开发板学习方法步骤
  2. 前端: 教你优雅的使用迭代器模式以及案例复盘
  3. 初识TopShelf
  4. 充电桩 2020:大火一年,它依然没赚到钱
  5. FCPX插件-仿LR色相饱和度白平衡色彩校正HSL视频调色插件 Lightroom Controls
  6. 腾讯将严打微信跑分活动:请珍惜自己账号的使用权
  7. 不同厂家对讲机耳塞耳挂/领夹型988对讲机如何写频改频点/频率能互相通信
  8. 4. 计算机会计报表编制的基本流程,初级会计电算化考试重点 第四章
  9. xd怎么做页面滑动_XD教程 | 如何在XD中制作拖拽手势”
  10. 鸿蒙智联汽车【1.0】