------韦访 20181012
1、概述
2、车牌识别的步骤
一般车牌识别分为4步:图像获取、车牌定位、车牌字符分割和车牌字符识别。
图像获取:你要识别车牌,至少得有包含车牌的图片吧?
车牌定位:一般图像获取的图片不可能只有一张完整的车牌,而没有其他背景的,如下图,
我们的把车牌单独准确的分割出来,如下图,
这样才可以进行下一步操作。
车牌字符分割:上面的步骤是将车牌单独提取出来了,但是让机器一下子就识别出来还是比较有难度的,一般做法是将字符单独分割出来,再单独识别。像MNIST那样识别。
车牌字符识别:车牌字符分割成单独的字符以后,最后一步就是识别这个字符了。
图像的获取就不是我们要讲的内容了,这里先讲车牌的定位。车牌定位有很多中方法,我们这里用边缘检测分割的方法。
Candy边缘检测
上一讲中有讲过边缘检测,直接用就好,
运行结果:
形态学操作----膨胀腐蚀处理
膨胀腐蚀处理,就是通过膨胀(变胖)连接相近的区域,腐蚀(变瘦)则去除孤立细小的色块。希望将车牌的所有字符连接起来,这样我们就可以通过轮廓识别来分割车牌区域。先介绍腐蚀和膨胀的原理。
腐蚀:腐蚀会把图片“变瘦”,其原理是在原图的小区域内取局部最小值,对于二值化图,只有0和255(非黑即白),所以该小区域内,只要有一个像素是0,则该像素点就是0,这样原图中边缘的地方就变成0,示意图如下,
来看膨胀腐蚀后,图像变成什么样?上代码,
运行结果:
可以看到,经过处理后,只剩下两个白色区域,那么怎么区分哪个是车牌?
百度了一下,小型汽车号牌尺寸为440x220,那么,我们就可以根据宽高比和轮廓检测找出车牌的位置,代码如下,
运行结果,
刚好把车牌分割出来,多试几张图片看看,
可以看到,这么模型并没有百分百的定位到车牌,有些膨胀腐蚀后,车牌没了,有些则是车牌跟车体连成一体了导致无法识别。其实还可以结合识别车牌背景颜色来优化模型的,车牌颜色就那几个,这里就先不涉及优化的内容了。
上面只是将车牌定位出来了,我们的目的是识别,但目前还不能直接识别出车牌里面的字符,要先对字符进行分割,然后再一个字符一个字符的识别。字符分割的方法有很多种,比如,
按比例分割:车牌样式是固定的,字符的大小也是固定的,就可以直接根据比例来分割出字符来,但是这样对上一步的要求就比较高,要求切割出来的车牌必须的方方正正的,要不然效果可能不如意。
轮廓检测分割:这个方法比较简单,如果车牌比较清晰的话,这个方法还是可以的,但是,在识别一些中文字符时,有可能一个中文字符被识别成多个轮廓,如下图,这个就需要处理一下,对于不是很清晰的车牌,它识别的效果也不太如意。
像素值分割:这个方法简单暴力,根据水平和垂直映射像素来分割。先将车牌进行边缘检测、二值化,然后判断每一列的像素值大于0(白色)的个数超过一个阈值(比如5)时,就认为该列有字符。
下面,我们就使用轮廓检测分割和像素值分割来讲解。
轮廓检测分割
前面说过,我们之所以能识别物体,是因为“识别”的是物体的边缘。图像识别不需要彩色的信息,所以,为了简单化,先将分割出来的车牌图像进行边缘检测和二值化处理,得到的图像是二值化的。代码如下,
运行结果:
完整代码如下:
运行结果:
对于这个车牌的检测效果还是可以的,我们再试试其他的车牌,
像上面两张车牌,同一张照片的不同角度,第一张车牌笔记大,容易识别,在车牌定位这一步做的很好了,所以在字符分割这一步也很好。而第二张车牌,在车牌定位这一步做的不是很好导致有很多背景噪音的,就无法识别出里面的字符了。由此可见,车牌图像获取这一步也是非常关键的,直接影响到后面的处理结果。
字符识别?我们Tensorflow入门教程的第一讲的识别MNIST不就是字符识别?直接用Tensorflow训练一下车牌的字符应该是可以拿来用的,但是我们现在既然学的是OpenCV,那么就用OpenCV常用的方法好了,我百度了一下,大概常用的方法有两种,一种是OCR识别,另一张也是神经网络的方法ANN。我还没学,估计篇幅不小,那么,这里就先不做字符识别的功能,后续再补上一讲。
总结:
在用OpenCV做车牌识别的时候,我在想,如果车牌定位和字符识别这步用Tensorflow的方法来做会不会准确率更高呢?如果以后有机会我再试试,主要是车牌的数据不好找,人工标注也需要大量的精力,看着办了。
---------------------------------------------20210103---------------------------------------------
深度学习版车牌识别请看下面的博客:
---------------------------------------------20181020---------------------------------------------
补充说明一下,今天看到一本书说到,对于车牌识别系统,最好是使用红外(IR)摄像头来获取数据,并附一张普通摄像头拍摄到的图像和使用红外摄像头拍摄的图像的对比,
在计算机视觉领域,图像相似度比较和物种识别是两个重要的研究方向。本文通过结合深度学习和图像处理技术,使用TensorFlow中的预训练MobileNetV2模型和OpenCV,实现了物种识别和个体相似度分析。本文将详细介绍该系统的实现过程,并提供相关代码和使用说明。
OpenCV(Open Source Computer Vision Library)是计算机视觉领域最常用的开源库之一,它提供了丰富的图像处理和模式识别功能,广泛应用于人脸检测、物体识别、图像分割等场景。与深度学习框架相比,OpenCV 更注重传统计算机视觉算法的高效实现,能在资源有限的设备上快速运行。本文将通过多个实战案例,从基础操作到实际应用,讲解如何使用 OpenCV 进行图像识别开发。一
# Opencv Python 车牌识别 模板匹配## 介绍车牌识别是计算机视觉中的一个常见任务,它可以对图像或视频中的车牌进行自动识别。模板匹配是一种常用的图像处理技术,它可以通过比较图像中的局部区域与模板图像进行匹配。在本文中,我们将使用Opencv和Python来实现车牌识别的模板匹配算法。## 原理模板匹配是一种基于像素级别的匹配方法。它通过计算图像中的局部区域与一个预先定
车牌识别
车牌识别包括车牌检测(通过图像分割、特征提取获得车牌位置)+车牌识别(对检测到的车牌进行字符内容识别)。一、基本流程如下:1.车牌检测1)读取需要进行车牌识别的图片;2)对图像进行灰度化处理(高斯模糊可选择是否进行)和灰度拉伸;3)进行开运算,消除图像中的噪声;4)将灰度拉伸后的图像和开运算后的图像求差
目录0、引言1、MFC中的车牌显示2、车牌定位3、字符提取4、文字识别5、文字预测0、引言 第一次使用OpenCV完成一个完整的功能,有所收获,特此记录。 这篇博客中的车牌识别功能比较简单,只能识别一般的蓝色车牌,只能识别拍摄较为清楚的车牌。以后可以在此基础上实现更加高级的功能,比如识别较为
目录什么是opencv?图像数字化基础知识图像获取图像变换改变大小车牌识别内容分析定位车牌图像降噪形态学处理阈值分割+边缘检测 什么是opencv?OpenCV(Open Source Computer Vision Library)是开源的计算机视觉和机器学习库,提供了C++、C以及python等接口,并支持Windows、Linux、Android、MacOS平台。在2016年以后,深度学习
最下面有我这一路下来,所遇到的一些坑。OpenALPR 简介OpenALPR 是一个使用 C++ 编写的开源自动牌照识别库。 这个库能分析图像和视频流以识别车牌。这个库,需要什么东西?需要一些必要的软件包;需要Tesseract OCR 软件依赖;需要OpenCV 软件依赖。(是的,我们还需要安装OpenCV)开始步骤一:先更新一下我们树莓派系统的软件包:sudo apt-get updates
前言 最近研究了几天车牌识别的项目,现在记录一下学习的过程,基于OpenCV编写Python代码来完成这一任务。 文章末尾有源码,有兴趣的读者可以用jupyter notebook一步一步看执行过程和结果。本项目车牌识别的步骤为:加载图片高斯去噪灰度转换边缘检测闭运算,腐蚀膨胀中值滤波去噪轮廓检测车牌位置筛选,图像矫正颜色筛选确定车牌详细过程显示图片的函数# 导入所需模块import cv2f
车牌识别的属于常见的 模式识别 ,其基本流程为下面三个步骤:1) 分割: 检测并检测图像中感兴趣区域;2)特征提取: 对字符图像集中的每个部分进行提取;3)分类: 判断图像快是不是车牌或者 每个车牌字符的分类。 车牌识别分为两个步骤, 车牌检测, 车牌识别, 都属于模式识别。基本结构如下:一、车牌检测 1、车牌局部化(分割车牌区域),根据尺寸等基本信息去除非车牌图像
作者:Robert Lucian Chiriac 闲来无事,我们给爱车装了树莓派,配了摄像头、设计了客户端,搞定了实时车牌检测与识别系统。 怎样在不换车的前提下打造一个智能车系统呢?一段时间以来,本文作者 Robert Lucian Chiriac 一直在思考让车拥有探测和识别物体的能力。这个想法非常有意思,因为我们已经见识过特斯拉的能力,虽然没法马上买一辆特斯拉(
使用openCV识别车牌流程框架图像的预处理车牌定位的第一步为图像预处理。为了方便计算,系统通常将获取的图片灰度化。将彩色图像转化成为灰度图像的过程就称为图像的灰度化处理。彩色图像中R、G、B三个分量的值决定了具体的像素点。一个像素点可以有上千万种颜色。而灰度图像是一种彩色图像,但是它的特点在于R、G、B三个分量具体的值是一致的。灰度图中每个像素点的变化区间是0到255,由于方便计算,所以在实际工
【说明】:疫情期间比较闲学习了python。LPR这个东西,基于OpenCV已经做过很多遍了,通过这个小项目利用树莓派来熟悉Python编程,而且通过实际操作可以掌握一些具体的细节与技巧,这里我将整个过程碰到问题时,甄选搜集的比较好的链接也一并放在文中。完整项目在GitHub上已经满多了。有几个开源的基于OpenCV的车牌识别项目像OpenALPR、HyperLPR等可以直接下来演示,这里主要参考
在我的车牌区域定位的方法的流程是:1.首先使用高斯滤波去掉一些干扰的元素2.然后将彩色图转换成灰度图3.然后利用Soble边缘提取的方法提取垂直方向的边缘4.利用OTSU的二值化方法将步骤3中的图二值化5.利用水平扫描与垂直扫描的方法定位出车牌的区域下面详细讲解每一步的程序代码:1.高斯滤波的详细讲解见://计算一维高斯的权值数组double *getOneGuassionArray(int s
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。 车牌识别技术要求能够将运动中的汽车牌照从复杂背景中提取并识别出来,通过车牌提取、图像预
目录一、效果1、成功案例2、经典失败案例(单字符识别成类似字符)3、其他失败案例二、总结三、车牌识别总代码一、效果1、成功案例 2、经典失败案例(单字符识别成类似字符) 3、其他失败案例二、总结车牌提取是本次项目最困难的地方。三、车牌识别总代码# 车牌识别import cv2 as cvimport numpy as npimport osfrom matplotlib
文章目录Linux软件管理器 yum什么是软件包安装软件好玩的软件卸载Linux编译器vimvim基本概念vim命令模式命令集Linux编译器-gcc/g++使用预处理编译汇编⭐链接函数库静态库:动态库:Linux自动化构建工具Makefile/makefile使用依赖关系原理清理gdb进度条Lin ...
在OpenCL框架中,内核(Kernel)是明确的计算核心,而“shader”(着色器)本质属于图形API(如OpenGL/DirectX)的渲染单元。二者分属不同框架,但在跨API协同场景中存在功能关联与硬件资源复用,具体解析如下: 我们常说的"OpenCL中的shader"其实就是kernel, ...
目录原理案例 定义: 线性规划是一种在给定约束条件下,寻找最优决策的数学方法。 这里的“最优”通常指的是最大化(如利润)或最小化(如成本、最小路径)某个目标。 “线性”的含义? 指的是模型中所有的数学关系都是线性的,即可以用一次方程(或不等式)来表示。 目标函数是线性的:例如,利润 = 5x + 3 ...
1.1. 中间件原理1.1.1. 什么是中间件中间件是段代码用于处理请求和响应,通常多个中间件链接起来形成管道,由每个中间件自己来决定是否要调用下一个中间件。1.1.2. 中间件执行过程举一个示例来演示中间件的执行过程(分别有三个中间件:日志记录、权限验证和路由):当请求进入应用程序时,执行执行日志记录的中间件,它记录请求属性并调用链中的下一个中间件权限验证,如果权限验证通过则将控制权传递给下一个
本文介绍了递归的深层次应用,重点讲解了尾递归优化及其实现方法。通过阶乘和裴波那契数列的案例对比普通递归与尾递归的区别,说明尾递归通过复用栈帧提高效率。随后以青蛙跳台阶问题为例,展示了递归解法和尾递归优化,并指出其与裴波那契数列的关联。最后详细解析了汉诺塔问题的递归解法,强调递归终止条件的重要性。文章还讨论了取模运算的意义,包括防止整数溢出和优化计算。通过多个经典案例,帮助读者深入理解递归思想及其优化方法。