车牌识别系统的设计与实现_毕设记录

  • 1 前言【源码见评论区】
  • 2 开发环境
  • 3 VS2017配置OpenCV运行第一个小程序(19.12.27)
  • 3.1 第一个小程序
  • 3.2 参考链接汇总
  • 4 车牌定位(19.12.27)
  • 4.1 知识点提要
  • 4.2 车牌定位的方法
  • 4.3 参考链接汇总
  • 5 字符分割
  • 5.1 知识点提要
  • 5.2 字符分割方法
  • 5.3 参考链接汇总
  • 6 字符识别
  • 7 代码实战【答辩过后再说】
  • 7.1 VS2017+OpenCV331+MFC读取图像(界面布局)
  • 8 EasyPR
  • 9 HyperLPR
  • 参考链接
  • 本文所有链接
  • 最终效果视频


1 前言【源码见评论区】

大四了,毕业设计选题:车牌识别,记录下整个过程吧。
车牌识别主要步骤:车牌定位、字符分割和字符识别。

2 开发环境

TensorFlow 安装包(大家可以去清华的镜像网站下载)镜像太棒了
镜像地址:https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/tensorflow/
测试安装是否成功
安装Keras语句:pip install keras==2.0.8

import tensorflow as tf
hello = tf.constant("Hello, TensorFlow!")
sess = tf.Session()
print(sess.run(hello))

输出Hello,TensorFlow则成功。

javacv 车牌识别并画出 车牌识别opencv毕业设计_opencv

图片cr.(亲测可行!!)Tensorflow安装在导入模块时会出现ImportError: DLL load failed: 找不到指定的模块的问题

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_02

3 VS2017配置OpenCV运行第一个小程序(19.12.27)

尝试在VS2017上配置一下OpenCV,运行一个小程序,为后面打基础,加油!

3.1 第一个小程序

1.**OpenCV:**我的电脑→属性→高级系统设置→系统变量→Path→指向OpenCV的bin文件路径

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_03


2.VS属性

文件→新建→项目→Visual C++→空项目

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_04


源文件→添加→新建项→Visual C++→C++文件

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_05


找到“属性”,快捷键:Alt+Enter

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_06


选中“Project1”(不是解决方案哦)

在展开的属性页找到包含目录,根据自己的路径,添加下面俩个路径:

D:\…\opencv\build\include

D:\…\opencv\build\include\opencv2

**注意:**此处最好加上D:\…\opencv\build\include\opencv这个路径,不加可能出现无法找到源,#include "cv.h"和源#include “highgui.h”。

找到库目录,根据自己的路径,添加lib文件的路径:

D:\…\opencv\build\x64\vc14\lib

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_07

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_08


javacv 车牌识别并画出 车牌识别opencv毕业设计_opencv_09


属性页→链接器→输入→附加依赖项:

添加opencv_world331d.lib;opencv_world331d_1.lib(注意要用分号隔开)

javacv 车牌识别并画出 车牌识别opencv毕业设计_javacv 车牌识别并画出_10


注:331是版本号,看这个Blogvs2017和opencv4.1.1的配置出现了下图中的错误。

javacv 车牌识别并画出 车牌识别opencv毕业设计_opencv_11


原因:OpenCV 441是高版本的 我加载了低版本3331的.lib。但不知道为啥改成331后,还是不行,也就是上图中的错误。后来在这篇博文LNK1104 的评论下一位博主提供的方法有效,感谢。

我的路径:D:\SoftWare\OpenCV\WIndows\opencv\build\x64\vc14\lib*d.lib

javacv 车牌识别并画出 车牌识别opencv毕业设计_javacv 车牌识别并画出_12

javacv 车牌识别并画出 车牌识别opencv毕业设计_opencv_13


javacv 车牌识别并画出 车牌识别opencv毕业设计_javacv 车牌识别并画出_14


属性页→链接器→常规→附加库目录:

添加路径:D:\…\opencv\build\x64\vc14\lib(根据自己的实际情况来)

javacv 车牌识别并画出 车牌识别opencv毕业设计_车牌识别_15

Debug x64进行调试:

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_16

3.在工程路径下添加源图片:

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_17


在源.cpp输入代码:

#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
 Mat img = imread("Project1.PNG");
 imshow("【载入的图片】", img);
 waitKey(6000);
}

javacv 车牌识别并画出 车牌识别opencv毕业设计_车牌识别_18


点击本地调试:

javacv 车牌识别并画出 车牌识别opencv毕业设计_javacv 车牌识别并画出_19


运行结果:

javacv 车牌识别并画出 车牌识别opencv毕业设计_opencv_20

3.2 参考链接汇总

谢谢博主们,希望自己加油。

  1. vs2017和opencv4.1.1的配置
  2. 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK1104 无法打开文件“opencv_calib3d249d.lib” live_beautiful_camera_streaming F

4 车牌定位(19.12.27)

抓住车牌特征,进行车牌提取。对于我国的车牌主要有以下特征:
a.车牌部分是矩形;
b.车牌具有特定的长宽比;
c.车牌的面积一定;

4.1 知识点提要

目前国内汽车牌照有六种类型:
①大型民用汽车所用的黄底黑字牌照;
②小型民用汽车所用的蓝底白字牌照;
③军队或武警专用汽车的白底红字、黑字牌照;
④使、领馆外籍汽车的黑底白字牌照;
⑤试车和临时牌照是白底红字,且数字前分别标有“试”和“临时”字标志;
⑥汽车补用牌照是白底黑字。
对于车前牌照,其尺寸均为44cm长,14cm宽,共有7个或8个字符。民用汽车牌照上有省、直辖市、自治区的名称和发证照及监督机关的代号,编号是英文大写字母,接着是一个点“.”,后面的汽车编号,一般为5位数字,即从00001-99999。编号超过10万时,就由A、B、C等英文字母代替,即A代表10万,B代表11万,C代表12万,最后一个字母Z代表33万。英文字母中的I和O一般避而不用,以免和数字中的1和0混淆。使、领馆的外籍汽车牌照上的小数字是建交国的代号,与所在地区的监管编号无关。(以上信息来源:汽车牌照定位研究综述_2002年发表百度知道

因此从人的视觉特点出发,车牌目标区域具有如下特点:
① 车牌底色往往与车身颜色、字符颜色有较大差异;
②车牌有一个连续或由于磨损而不连续的边框,车牌内字符有多个,基本呈水平排列,所以在牌照的矩形区域内存在较丰富的边缘,呈现出规则的纹理特征;
③ 车牌内字符之间的间隔比较均匀,字符和牌照底色在灰度值上存在跳变,而字符本身与牌照底的内部有较均匀的灰度;
④不同图像中的牌照的具体大小、位置不确定,但其长度变化有一定范围,存在一个最大和最小长宽比。
根据这些特点,可以在灰度图像的基础上提取相应的特征。(以上信息来源:汽车牌照定位研究综述_2002年发表

4.2 车牌定位的方法

  • 汽车牌照定位研究综述_2002年发表:基于黑白图像;基于彩色图像。
  • 车辆牌照定位的算法研究_2001年发表:水平方向定位;垂直方向定位。
  • 复杂车辆图像中的车牌定位与字符分割方法_2004年发表:目前车牌定位主要采用以下3种方法:(1)基于边缘检测的方法;(2)基于水平灰度变化特征的方法;(3)基于车牌颜色特征的方法。方法(1)定位准确,但是漏检率高、速度慢、虚景较多。方法(2)速度快,漏检率低,但是定位不够准确,很难区分与背景文字、车灯等同样灰度变化明显的区域。方法(3)定位较准确,漏检率较低,但是对车牌大小的适应性差,受车牌磨损、倾斜的影响大,容易和颜色相似的区域混淆。
    使用单一特征定位车牌存在明显的局限性,需要将各种方法综合优化。因此,提出一个综合边缘、灰度变化和颜色特征的车牌定位算法,既提高了定位的准确性,也保证了定位的鲁棒性和实时性。在准确定位的基础上,还提出一个基于模板匹配的字符分割算法,有效地解决了车牌磨损、光照不均等条件下字符分割难的问题。把引入识别可信度作为车牌的判别准则,解决了车牌定位中去除虚景难的问题。
  • 复杂背景下的车牌定位和字符分割研究_2007年发表:车牌定位_频率投影法;字符分割_垂直投影和模板匹配。目前车牌定位常用方法有: (1)边缘检测[; (2)水平灰度变化特征; (3)神经网络; (4)彩色分割等。4 种方法的特点如下: (1)方法1在复杂背景边缘较多的情况下难以适应;(2)方法2难以区分广告、车灯等干扰信息;(3)方法3计算量大;(4)方法4由于背景颜色往往比较多,定位时间太长。

4.3 参考链接汇总

5 字符分割

5.1 知识点提要

5.2 字符分割方法

5.3 参考链接汇总

6 字符识别

车牌识别中去噪与字符识别算法的研究——一篇完整的论文

7 代码实战【答辩过后再说】

7.1 VS2017+OpenCV331+MFC读取图像(界面布局)

1.新建MFC,基于对话框应用程序。

javacv 车牌识别并画出 车牌识别opencv毕业设计_opencv_21


javacv 车牌识别并画出 车牌识别opencv毕业设计_车牌识别_22


2.界面布局

javacv 车牌识别并画出 车牌识别opencv毕业设计_车牌识别_23


打开Picture 控件属性窗口,其 ID 为 IDC_STATIC,修改Type 为 Rectangle,将 Picture 控件大小调整合适(用于最终图像的显示)

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_24


3.添加CvvImage支持的方法

记得配置好OpenCV环境。

因为复制代码到文章里就乱码,所以就放在“有道云笔记”里面了,链接如下:CvvImage.h和CvvImage.cpp源文件 源参考代码如下链接,也可直接复制:VS2010+Opencv+MFC读取图像和视频显示在Picture控件

如出现Erro提示可参考:OpenCV高版本下使用CvvImage.h

其中重要信息如下:若出现部分函数或变量未定义,可能原因有以下两种:

①未识别#include "StdAfx.h"解决方法:使用**#include <windows.h>**代替

②调试解决方案平台不是X64因为打开工程默认是X86的,而OpenCV是X64的,所以需要手动修改成X64。

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_25


在需要引用该类的地方添加如下引用:#include “CvvImage.h”

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_26


4.在Picture控件中显示指定路径某一图片

糟心,没弄出来。

8 EasyPR

EasyPR开发详解文章综合(一个博主将原博主的文章copy到了一篇文章,没有原作者的评论区活跃)

以下是原作者的博文,有较多的讨论

EasyPR Git地址:https://github.com/liuruoze/EasyPR

1、EasyPR–一个开源的中文车牌识别系统《Mastering Opencv …读书笔记系列》车牌识别(I)此文以半学习笔记半开发讲解的方式说明了一个车牌识别系统的全部开发过程

《Mastering Opencv …读书笔记系列》车牌识别(II)

博文评论区:

javacv 车牌识别并画出 车牌识别opencv毕业设计_OpenCV_27


EasyPR在vs2013+opencv3.1.0中怎么运行,将demo设为启动项后编译不过

解决参考:https://github.com/liuruoze/EasyPR/issues/233

javacv 车牌识别并画出 车牌识别opencv毕业设计_车牌识别_28


2、EasyPR–中文开源车牌识别系统 开发详解(1)

博客评论:

javacv 车牌识别并画出 车牌识别opencv毕业设计_c++_29


3、EasyPR–开发详解(2)车牌定位

4、EasyPR–开发详解(3)高斯模糊、灰度化和Sobel算子 (1)高斯滤波API opencv2.48 (2)opencv的灰度化的API(英文,2.48以上版本)。 (3)opencv的Sobel的API(英文,2.48以上版本) (4)官网的介绍:Sobel与Scharr。 5、EasyPR–开发详解(4)形态学操作、尺寸验证、旋转等操作 评论区提到用adaboost定位车牌。参考一下——使用Adaboost训练车牌定位——(1) 6、EasyPR–开发详解(5)颜色定位与偏斜扭转 (1)OpenCV仿射变换 (2)官方文档 仿射变换 7、EasyPR–开发详解(6)SVM开发详解 (1)opencv的CvSVM的实现基于libsvm (2)LIBSVM官方地址

8、EasyPR–开发详解(7)字符分割 9、EasyPR–开发详解(8)文字定位

9 HyperLPR

1、Git:HyperLPR 2、Python安装使用教程:探索 Python + HyperLPR 进行车牌识别

运行报错如下:

环境问题:我是tensorflow和keras版本过高(上文版本有注红说明)。

觉得真的高版本低版本这些好打脑阔,版本都降了后,又来Warning。

javacv 车牌识别并画出 车牌识别opencv毕业设计_javacv 车牌识别并画出_30


其他(降完版本后果然遇到了这个。。。):

OpenCV踩坑之findContours:opencv-python版本为3.2.0,而本地版本为4.0.0,查询官方文档发现下面描述,说明4已经更改了返回的参数数量导致上述错误。

3、安装Jupyter:Jupyter 安装使用教程

1.安装:windows下,cmd 中直接使用 pip 安装
语句:pip install jupyter
2、运行:在cmd中输入“jupyter notebook
默认会自动跳转到页面(网页)

javacv 车牌识别并画出 车牌识别opencv毕业设计_javacv 车牌识别并画出_31


注:Win+X–>A


使用 Anaconda,可以在其 Navigator 图形界面中点击打开 Notebook。

javacv 车牌识别并画出 车牌识别opencv毕业设计_车牌识别_32