ESP32CAM人工智能教学16

ESP32CAM人工智能教学16

用腾讯OCR识别车牌

小智发现ESP32Cam适合车辆识别的应用情境。车辆识别在生活中的应用非常广泛:马路车辆违章抓拍、高速路ETC跟踪、停车场费用管理、手机识车APP等。

车辆识别主要有两种方式:本机识别模式和在线识别模式。

本机识别模式是利用openCV等图形处理驱动库,经过对包含有车牌的图片进行一系列的处理、对可能存在的车牌模块(图像中的某个界限分明的近似长方形)的抓取、文字数字的机器学习识别,最后获取识别结果。本机识别模式所有的程序都是在本地计算机中进行的,所以运行速度快,成本费用低;但也存在编程难度较高、机器建模复杂、可能出现识别不出来的情况(图片中的车牌不够突出、干扰因素较多的时候)。

在线识别模式是利用网络连接,把拍摄到的包含有车牌的图片,直接发送到互联网,由提供识别服务的云端服务器进行车牌的识别,然后把识别的结果通过网络返回到本地计算机。在线识别模式除了图片上传程序以外,所有识别程序都在云端服务器的后台中进行,运行起来较慢(网络传输的原因),成本费用较高(当你需要大量的车辆识别的时候,需要想识别运营商缴纳一定费用),好处当然是编写程序较简单,识别率较高,可以应对较复杂的运算。

网上做车辆识别(图像识别)的公司很多,这次我们选用腾讯云。腾讯的OCR图像识别可以有每个月1000次的免费识别,而且提供的各种语言的应用程序,使用起来很简单,非常时候中小学生学习图像识别的编程。

  • 开通图像识别OCR应用

百度“腾讯云”,访问腾讯云官网,然后是用户注册。

我用的是QQ注册,注册完成后,会要求实名认证,我用微信扫描绑定进行认证。

完成了用户的注册和认证,以后就可以登录腾讯云,点击最上方的控制台,开始使用腾讯云的服务了。

我们点击控制台,如图所示,在控制台后面的搜索框中输入“OCR”回车。然后选择汽车识别。

    接下来会跳转到OCR的开通确认窗口,点击“立即开通”。

    等开通审核通过后(会给你的手机发送一些验证码,让你确认开通服务、使用服务等,按照要求输入验证码,就可以通过审核),就出现了“文字识别控制台”按钮,点击。

    接来了就是文字识别服务的控制台了,可以点击在线调试,这样就可以试着开始使用了。

  • 在线识别车牌

腾讯OCR需要用户把图片上传到服务器,所以就需要把图片的内容转换成Base64编码,也就是转换成可以TCP传输的字符串。

我们可以利用网上在线转换的方法,把图片的内容转换成Base64字符串。首先我们从网上下载一张图片,然后利用https://www.sojson.com/image2base64.html在线转换,可以看到这张图片编程了字符串了。把这个字符串复制保存成文本文件,这些字符串后面会用到的。

我们在前面点击在线调试后,就会跳转到这个在线识别的窗口。在这里我们选择文字识别中的“车辆识别”、选择服务器“华南地区(广州)”(选其他也可以)、然后把刚才复制的图片Base64字符串粘贴到框中,点击“发起调用”。识别的结果会显示在右侧的窗口,我们可以看到车牌的信息已经识别出来了。

这个识别过程简单吧:只要选择一个服务器,然后把图片转成字符串粘贴,就可以获得车牌的识别结果了

听说这个识别可以一次识别多个车牌,如果图片中有多辆车的车牌,在这里会同时识别出来。不过我还没试过。

  • 线下Python程序

接下来我们就是要把这个在线的调试模式,改成线下上传的应用模式。

我们点击代码示例,传输模式选择HTTP requests(也就是采用TCP传输模式),代码语言选择Python,这样我们就可以看到这个图片识别(OCR)的应用程序了。我们可以把这些代码复制到本地电脑中的Python程序中了。

当然在使用之前,还是需要先获取使用连接的密钥。我们点击后面的“获取密钥”链接

    跳转到了“访问管理”页面(当然可以点击窗口右上角的主账号,选择访问管理,也可以跳转到这里来),然后点击新建密钥。当密钥生成的时候,要一定要注意保存,因为那要是忘了,就再也找不回来了。一定先保存、一定先保存、一定先保存,重要事情说三遍。

有了这个连接的密钥以后, 我们可以把前面的Python代码复制下来,在电脑中打开Python IDLE,然后新建一个文件,粘贴代码(当然也可以在前面的代码窗口中“下载工程”)。

把密钥复制到程序响应的位置,注意看一下图中这行代码是否为payload=”\”ImageBase64****************************************”

也就是我们在下载程序的时候,已经把那张识别车牌的图片内容也一起下载下来了。如果这句是空字符串的话,可以重新下载程序,注意下载之前,在左边的框中粘贴上图片的字符串内容,然后在点击下载工程,就能把图片内容的字符串一起下载到代码中了。点击Python中的Run运行按钮,可以看到输出窗口中,获得了从网站识别出来的车牌信息了。

在这个返回的车牌信息中,可以看到车牌中的字母和数字“KZA166”,至于车牌中的汉字“鲁”,则用e9  b2  81三个十六进制数字表示。这个和通用的汉字编码有所不同,应该是腾讯OCR自己规定的一个车牌汉字的编码,以后我们可能要建立一个30多个车牌汉字对应的编码字典,然后把这个汉字翻译过来吧。

我们从第二步的线上测试,走到了这里,完成了线下程序的应用。

不过我们还需要完成了是,把一张图片的内容,转换成Base64字符串。Python中安装binascii驱动库,就可以实现这个编码转换的功能,在这里,我已经把程序代码写出来了,程序读取同文件夹中的一张图片内容,然后转换成Base64字符串,最后组合成字典字符串,赋值给payload变量。

这个Python程序就完成了图片读取、转换、上传、获取返回车牌的全部功能了。贴上程序的代码:

# -*- coding: utf-8 -*-
import hashlib
import hmac
import json
import sys
import time
from datetime import datetime
import binascii

if sys.version_info[0] <= 2:
    from httplib import HTTPSConnection
else:
    from http.client import HTTPSConnection


def sign(key, msg):
    return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()


secret_id = "AKIDpS6****************************************"
secret_key = "hAOOEq************************************"
token = ""

service = "ocr"
host = "ocr.tencentcloudapi.com"
region = "ap-guangzhou"
version = "2018-11-19"
action = "LicensePlateOCR"

#读取图片,转换成Base64编码,在组成字典字符串
with open('che01.jpg','rb') as f:
    img = f.read()
    f.close()
img = binascii.b2a_base64(img)
imgstr = img.decode('utf-8')
imgstr = imgstr.rstrip('\n')
payload = "{\"ImageBase64\":\"data:image/jpeg;base64," + imgstr + "\"}"
payload = payload.rstrip('\n')

params = json.loads(payload)
endpoint = "https://ocr.tencentcloudapi.com"
algorithm = "TC3-HMAC-SHA256"
timestamp = int(time.time())
date = datetime.utcfromtimestamp(timestamp).strftime("%Y-%m-%d")

# ************* 步骤 1:拼接规范请求串 *************
http_request_method = "POST"
canonical_uri = "/"
canonical_querystring = ""
ct = "application/json; charset=utf-8"
canonical_headers = "content-type:%s\nhost:%s\nx-tc-action:%s\n" % (ct, host, action.lower())
signed_headers = "content-type;host;x-tc-action"
hashed_request_payload = hashlib.sha256(payload.encode("utf-8")).hexdigest()
canonical_request = (http_request_method + "\n" +
                     canonical_uri + "\n" +
                     canonical_querystring + "\n" +
                     canonical_headers + "\n" +
                     signed_headers + "\n" +
                     hashed_request_payload)

# ************* 步骤 2:拼接待签名字符串 *************
credential_scope = date + "/" + service + "/" + "tc3_request"
hashed_canonical_request = hashlib.sha256(canonical_request.encode("utf-8")).hexdigest()
string_to_sign = (algorithm + "\n" +
                  str(timestamp) + "\n" +
                  credential_scope + "\n" +
                  hashed_canonical_request)

# ************* 步骤 3:计算签名 *************
secret_date = sign(("TC3" + secret_key).encode("utf-8"), date)
secret_service = sign(secret_date, service)
secret_signing = sign(secret_service, "tc3_request")
signature = hmac.new(secret_signing, string_to_sign.encode("utf-8"), hashlib.sha256).hexdigest()

# ************* 步骤 4:拼接 Authorization *************
authorization = (algorithm + " " +
                 "Credential=" + secret_id + "/" + credential_scope + ", " +
                 "SignedHeaders=" + signed_headers + ", " +
                 "Signature=" + signature)

# ************* 步骤 5:构造并发起请求 *************
headers = {
    "Authorization": authorization,
    "Content-Type": "application/json; charset=utf-8",
    "Host": host,
    "X-TC-Action": action,
    "X-TC-Timestamp": timestamp,
    "X-TC-Version": version
}
if region:
    headers["X-TC-Region"] = region
if token:
    headers["X-TC-Token"] = token

try:
    req = HTTPSConnection(host)
    req.request("POST", "/", headers=headers, body=payload.encode("utf-8"))
    resp = req.getresponse()
    print(resp.read())
except Exception as err:
    print(err)

关注我的微信视频号,可以看到相配套的操作讲解视频

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 12:34:06       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 12:34:06       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 12:34:06       45 阅读
  4. Python语言-面向对象

    2024-07-22 12:34:06       55 阅读

热门阅读

  1. 网络安全-网络安全及其防护措施11

    2024-07-22 12:34:06       20 阅读
  2. 算法训练营 day14 | 二叉树 part02

    2024-07-22 12:34:06       22 阅读
  3. Python爬虫技术 第08节 Cookies和Session

    2024-07-22 12:34:06       18 阅读
  4. JDK、JRE、JVM之间的关系

    2024-07-22 12:34:06       16 阅读
  5. 徐州服务器租用:BGP服务器适用于哪些场景?

    2024-07-22 12:34:06       18 阅读
  6. Web前端-Web开发CSS基础7-网格

    2024-07-22 12:34:06       15 阅读
  7. Linux的shell的`cp`命令,常用`cp -a`

    2024-07-22 12:34:06       17 阅读