车牌识别在高速公路中有着广泛的应用,比如我们常见的电子收费(ETC)系统和交通违章车辆的检测,除此之外像小区或地下车库门禁也会用到,基本上凡是需要对车辆进行身份检测的地方都会用到。

简介

车牌识别系统(Vehicle License Plate Recognition)是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常一个车牌识别系统主要包括以下这四个部分:

  • 车辆图像获取
  • 车牌定位
  • 车牌字符分割
  • 车牌字符识别

实现方式

我们这里不做太复杂的车辆动态识别,只演示从图像中识别车牌信息,车牌识别功能的实现方式大致分为两种,一种是自己编写代码实现,另一种是借助第三方 API 接口实现。

自己实现

如果我们想要通过 Python 自己手动编码实现车牌识别功能,可以借助一些 Python 库,比如:OpenCV、TensorFlow 等,这种方式因为每一个功能点都需要我们自己编码实现,所有会相对复杂一些,另一方面如果我们想要保证识别的准确性,可能需要做大量的实验,也就是说会花费更多的时间。

第三方接口

现在已经有一些第三方平台实现好了车牌识别的功能,并且他们对外提供了 API 接口,我们只需要调用他们提供的接口即可,这种方式实现就相对简单了一些,并且通常接口提供方对外提供的接口功能的准确性也是基本可以保证的,原因很简单,如果接口功能太差的话,一是自己打脸,还有就是基本不会有什么人使用,也就失去了接口对外提供的价值了,另外第三方接口可能会收取一定费用,因此,如果现实中我们具体实现的话要综合考虑。

具体实现

综合上面的情况,我们这里采用第三方接口的方式来实现车牌识别的功能,接口提供方我们选择百度云提供的接口,百度云接口提供了免费额度,简单来说就是每天可以免费使用多少次,如果超过了这个次数就需要交钱什么的了,文档地址为:https://cloud.baidu.com/doc/OCR/index.html,下面来看一下具体实现过程。

环境配置

SDK:百度云 SDK 对多种语言提供了支持,比如:Python、Java、C++、IOS、Android 等,这里我们安装 Python 版的 SDK,安装很简单,使用 pip install baidu-aip 命令即可,SDK 支持 Python 的版本为:2.7+ 与 3.x,SDK 目录结构如下:

├── README.md
├── aip // SDK 目录
│ ├── __init__.py // 导出类
│ ├── base.py // aip 基类
│ ├── http.py // http 请求
│ └── ocr.py //OCR
└── setup.py // setuptools 安装

 PyQt5 :由于要用到GUI人机交互界面,这里用PyQt5 ,PyQt5 是Digia的一套Qt5应用框架与python的结合,同时支持2.x和3.x。本教程使用的是3.x。Qt库由Riverbank Computing开发,是最强大的GUI库之一 。可用pip install PyQt5 进行安装

python:这里用的是python 3.7

另外关于百度SDK的申请,可以自行申请,也可用下面实例中的。

SDK 安装好后,我们接着需要创建应用了,这里需要一个百度账号或百度云账号,如果没有的话自己注册一个即可,登录及注册地址为:https://login.bce.baidu.com/?redirect=http%3A%2F%2Fcloud.baidu.com%2Fcampaign%2Fcampus-2018%2Findex.html,登录之后,我们将鼠标移动到登录头像位置,接着在弹出菜单中单击用户中心,如下图所示:

如果是首次进入的话,勾选一下相应信息,如下图所示:

信息勾选完了之后,点击保存按钮。

接着将鼠标移动到左侧栏中 > 符号位置,再依次选择人工智能和文字识别,如下图所示:

点击之后会进入到下图中:

我们点击创建应用,进入下图中:

这里我们只需要填一下应用名称和下面的应用描述即可,填写完毕之后点击立即创建。

创建完后,我们再返回应用列表,如下图所示:

这里我们需要用到三个值:AppID、API Key 和 Secret Key。

具体实现

应用创建完了,我们就可以调用接口实现车牌识别功能了。

import sys
from aip import AipOcr
from PyQt5.QtWidgets import (QDialog, QApplication, QLabel, QPushButton,
QFileDialog, QMessageBox, QPlainTextEdit, QHBoxLayout,
QVBoxLayout)
from PyQt5.QtGui import QIcon, QFont
from PyQt5 import QtGui APP_ID = '23612066'
API_KEY = 'Hcm1sLlGlHtyWZsPoDNGKVrt'
SECRET_KEY = 'xGue8I7ZDm8uOPCYb2FKamj8vweI2fUV' client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
options = {
'multi_detect': 'true',
} class PlateRecognize(QDialog):
def __init__(self):
super(PlateRecognize, self).__init__()#初始化图形界面
self.text = ""
self.filePath = ""
self.numbers = []
self.initUI() def initUI(self):
self.resize(500, 500)
self.setWindowTitle("车牌识别")#界面标题 # self.setWindowIcon(QIcon('C:/Users/Administrator/Desktop/icon1.ico'))#图标 self.plabel = QLabel(self)#创建一个label标签
self.plabel.setFixedSize(400, 300)#标签大小 self.obtn = QPushButton(self)#创建‘打开本地图片’按钮
self.obtn.setText("打开本地图片")#名称
self.obtn.setFont(QFont("苏新诗柳楷繁", 15))#字体,字号
self.obtn.clicked.connect(self.openimage)#单击事件
self.obtn.setFixedSize(180, 40)#大小
self.sbtn = QPushButton(self)#创建‘开始识别’按钮
self.sbtn.setText("开 始 识 别")
self.sbtn.setFont(QFont("苏新诗柳楷繁", 15))
self.sbtn.clicked.connect(self.recognize)
self.sbtn.setFixedSize(180, 40) #盒子布局(boxlayouts)非常的直截了当。使用它作为最上层的布局,创建布局
#非常简单——它的构造器需要任何参数——并且使用望名知义的方法addWidget来添加widget。
self.v1box = QVBoxLayout()
self.v1box.addWidget(self.obtn)
self.v1box.addWidget(self.sbtn)
# QHBoxLayout也可以被同样使用,尽管它不常作为最上层的布局。
# 它常常被作为子布局。为一个布局中添加另一个布局,使用该布局容器的addLayout方法
self.h1box = QHBoxLayout()
self.h1box.addWidget(self.plabel)
self.h1box.addLayout(self.v1box) self.tlabel = QLabel(self)
self.tlabel.setText("识\n别\n结\n果")
self.tlabel.setFont(QFont("苏新诗柳楷繁", 15))
self.tlabel.resize(200, 50) self.tedit = QPlainTextEdit(self)
self.tedit.setFont(QFont("宋体", 10))
self.tedit.setFixedSize(500, 100) #盒子布局有另一个更重要并且常用的方法:addStretch。一个常见的布局有很多的控件,
# 他们之间具有灵活的空间。为了完成这个目的,在盒子的开始添加widgets,然后添加一个设置大于0的空闲空间,
# layout.addStretch(1),然后再添加剩下的widgets。 self.h2box = QHBoxLayout()
self.h2box.addStretch(1)
self.h2box.addWidget(self.tlabel)
self.h2box.addStretch(1)
self.h2box.addWidget(self.tedit)
self.h2box.addStretch(1) self.vbox = QVBoxLayout()
self.vbox.addLayout(self.h1box)
self.vbox.addStretch(1)
self.vbox.addLayout(self.h2box)
self.setLayout(self.vbox) def openimage(self):#创建‘打开本地图片’命令按钮单击事件
self.filePath, imgType = QFileDialog.getOpenFileName(self, "打开本地图片", "", "*.jpg;;*.png;;All Files(*)")
self.jpg = QtGui.QPixmap(self.filePath).scaled(self.plabel.width(), self.plabel.height())
self.plabel.setPixmap(self.jpg) def recognize(self):#创建‘开始识别’命令按钮单击事件
if (self.filePath == ""):
print(QMessageBox.warning(self, "警告", "请插入图片", QMessageBox.Yes, QMessageBox.Yes))
return result = client.licensePlate(self.get_file_content(self.filePath), options)
print(result)
plate = ''
color=''
for a in result['words_result']:
plate += a['number'] + '\n'
color += a['color']+'\n'
self.text = "车牌号码:" + plate +"车牌颜色:" + color print(QMessageBox.information(self, "提醒", "成功识别!" +"\n"+ self.text, QMessageBox.Yes, QMessageBox.Yes))
self.tedit.setPlainText(self.text) def get_file_content(self, filePath):
with open(filePath, 'rb') as fp:
return fp.read() if __name__ == '__main__':
# 这是必须要创建的一个对象。每个GUI程序都必须有且只有一个QApplication的实例。如果没有这个实例的话,
# 我们写的QT是没法执行的,所以我们写QT代码的时候一定不要忘了创建这个对象。 创建这个对象时需要传递一个list参数
app = QApplication(sys.argv)#sys.argv其实可以看作是一个列表(list)
platerecognizeWindow = PlateRecognize()#对类进行实例化
platerecognizeWindow.show()#调用本身的show方法
platerecognizeWindow.exec_()
sys.exit(app.exec_())

这里图标注释掉了,如果需要使用的话找到自己.ico 文件的路径修改

总的来说通过接口方式实现车牌识别功能是比较简单的,以如下图为例:

这里是把图标注释掉的结果:

另外图标没有注释的结果:

是不是对于有些许强迫症的人们看着舒服一些呢(偷乐ing)

总结

本文我们先对车牌识别进行了一些介绍,之后利用百度云接口实现了GUI人机交互界面下的车牌识别。通过本文我们可以对车牌识别的相关概念和具体实现有一些了解。

基于百度智能云api下的车牌识别系统的更多相关文章

  1. 百度智能云 API调用PythonSDK

    百度智能云 API调用PythonSDK 这是一个用于百度云部分开放AI功能的Python库.主要为ORC功能,可以对各种图像文件进行文字识别,包括车牌.手写文字.通用文字.人脸发现.人脸比对和人流量 ...

  2. 基于百度智能云的OCR接口进行图文识别

    由于一些客户的内部系统需要提取一些记录信息,如果手工录入会变得比较麻烦,因此考虑使用百度云的OCR进行图片文字的提取处理,综合比较了一下开源免费的Tesseract 类库进行处理,不过识别效果不太理想 ...

  3. 百度智能云平台调用食物识别api Java实现

    纪录一下我小学期2天花了20小时写的菜品识别java程序. 1.2. 百度智能云简介 1.2.1 百度图像识别服务 百度图像识别服务,基于深度学习及大规模图像训练,准确识别图片中的物体类别.位置.置信 ...

  4. Java对接百度智能云人脸识别

    ------------------------->这篇文章就是自己做个笔记<------------------------- 首先登录or注册自己的百度智能云管理中心:https:// ...

  5. 百度智能云虚拟主机 Typecho 分类功能失效 | 开启伪静态地址

    出现的问题 $this->is() 方法失效,无法正确判断 archive.category.tags 页面类型. 点击分类页面.归档页面时,虽然 URL 是正确的,但网页内容却是 index. ...

  6. laravel7 百度智能云检测内容及图片

    1:百度智能云,获取AppID,API Key,Secret Key https://console.bce.baidu.com/ai/?_=1642339692640&exraInfo=ai ...

  7. 利用百度智能云结合Python体验图像识别(转载来自qylruirui)

    https://blog.csdn.net/qylruirui/article/details/94992917 利用百度智能云结合Python体验图像识别只要注册了百度账号就可以轻松体验百度智能云中 ...

  8. 基于opencv的车牌识别系统

    前言 学习了很长一段时间了,需要沉淀下,而最好的办法就是做一个东西来应用学习的东西,同时也是一个学习的过程. 概述     OpenCV的全称是:Open Source Computer Vision ...

  9. EasyPR--中文开源车牌识别系统 开发详解(1)

    在上篇文档中作者已经简单的介绍了EasyPR,现在在本文档中详细的介绍EasyPR的开发过程. 正如淘宝诞生于一个购买来的LAMP系统,EasyPR也有它诞生的原型,起源于CSDN的taotao123 ...

  10. EasyPR--一个开源的中文车牌识别系统

    我正在做一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR,也就是Easy to do Plate Reco ...

随机推荐

  1. wpf TreeView 数据绑定

    <Window x:Class="TsyCreateProjectContent.Window1" xmlns="http://schemas.microsoft. ...

  2. mybatis-关联查询2-多对一关联查询

    或者多表单独查询方式

  3. 城市间最短路径问题——R和Rcpp实现

    这里的最短路径问题也叫做相识问题,具体问题来自 https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/examples.ht ...

  4. .net基础—多线程(二)

    Thread 在.NET中最早提供的控制线程类型的类型:System.Threading.Thread类.使用该类型可以直观地创建.控制和结束线程.下面是一个简单的多线程程序: static void ...

  5. C#如何将光标定位到文本框末尾(最后一位)

    代码如下:private void Movetoend(){//让文本框获取焦点this.TextBox1.Focus();//设置光标的位置到文本尾this.TextBox1.Select(this ...

  6. 每一行输出5个字符之后换行 js

    方法1  使用正则 (如果是汉字,此正则,每五个字换行,如果是英文字符,每十个英文,换行) let arrX ="这是个测试字符串,这是个测试字符串" arrX = arrX.re ...

  7. openwrt从gitee pull代码并编译go项目

    安装ssh opkg update # openssh-keygen 可以用来生产密钥 opkg install openssh-keygen # 连接其他服务器 opkg install opens ...

  8. 055_Lightning Lightning 组件基础知识

    Lightning框架简介 Lightning框架是Salesforce提供的一套基于用户界面的开发框架,对于开发单页面应用(Single Page Application)有很大的帮助.它和Visu ...

  9. postman导出Collection文件

    postman接口调用工具可以将曾经使用过的请求配置导出为文件保存,方法如下: 1.编写一个接口测试用例 2.按组分类 3.导出 参考来源: https://blog.csdn.net/IBLiplu ...

  10. 机器学习——常见的backbone

    参考链接:https://www.zhihu.com/question/396811409/answer/1252521120 LeNet:5层轻量级网络,一般用来验证小型数据: AlexNet/VG ...