ESP32CAM人工智能教学16

tongyue 2024-08-13 08:01:02 阅读 78

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程序就完成了图片读取、转换、上传、获取返回车牌的全部功能了。贴上程序的代码:

<code># -*- 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 + ", " +code>

"SignedHeaders=" + signed_headers + ", " +code>

"Signature=" + signature)

# ************* 步骤 5:构造并发起请求 *************

headers = {

"Authorization": authorization,code>

"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)

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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。