ESP32Cam人工智能教学22

ESP32Cam人工智能教学22

在线车牌识别装置

https://download.youkuaiyun.com/download/tongyue/90497594程序代码下载地址

https://pan.baidu.com/s/1Tf0XGStklQUc2t5vMfzJXg?pwd=eerp 提取码: eerp在百度网盘里面,还有更加详细的测试过程的留痕文件

在第十六课《tencent-OCR》中,已经学会了使用腾讯在线识别车牌,但是用的是电脑中的Python程序,读取一张车牌图片内容,然后发送给腾讯服务器进行识别,并获取返回的识别结果。

从那以后,我心里一直念念不忘的是,能不能把这个Python变成C,然后把程序写到ESP32Cam中,这样不就可以做一个手持式的在线车牌识别器了吗?(虽然现在的智能手机早就实现了这个功能,即使是自己编写APP也能很快利用手机实现这个功能。但是如果能自己手搓一个,用ESP32Cam来实现她不香吗?)

于是经过了差不多一个月的摸索,经历了许多天花板级别的难度突破,终于实现了。

  • 作为客户端连接电脑测试

如果要让ESP32Cam完成拍照、上传识别、获取识别结果,就必须让ESP32Cam工作在客户端的模式,然后主动向服务器(腾讯官网在线服务器)发送数据。因此我们先在电脑中进行客户端和服务器的测试实验。

我们在电脑中,用FLASK创建一个服务器端(第十五课的内容),然后在ESP32Cam作为客户端,每个几秒钟就像服务器发送一条消息,服务器收到消息后,返回一定的消息给ESP32Cam(这时候的ESP32Cam和电脑是在同一网络桥段内的,使用内网连接)。程序的运行效果如图:<HttpClient.h>的使用调试。

  • 压缩算法的实现

我们在第十六课中可以看到,我们使用tengcentOCR的时候,有在线测试和线下程序两种工作模式。线下程序模式就是把Python代码下载到电脑中,在电脑中运行Python程序,也能发送图片内容给腾讯官网在线识别,然后获取识别结果,(当然事先需要获取用户密钥)。

我们看到电脑中的Python程序的源代码,只要按照一定的格式对各种信息进行编辑,发送腾讯官网认可的消息,也就能获得腾讯官网的在线服务了。如图所示,这个是腾讯官网下载到的在线测试Python程序代码,其中重要的是对各种信息进行按一定规格进行重装组合,然后发送给腾讯官网,就能获取识别服务的结果。

   

在这里,最为重要的是使用了两种压缩算法,一种是哈希摘要算法SHA256,他不管你输入的字符串长度是多长,还是多短,最后都会返回32个字节的数据(32个字节一共是256个位bit)。还有另外一个是KMAC秘钥加密算法,这里需要输入两个参数:密钥和消息,然后会用密钥对消息进行两次的SHA256运算,并返回32个字节的运算结果。

我从网上这两篇博客中了解了一些加密算法,然后下载到了一个哈希SHA256算法的驱动库,并自己编写了一个KMAC加密算法,然后就一直使用这个进行编程(后来突然在2024-09-17这一天的时候,发现这个自己编写的算法出现了异常,计算结果错了,而其他的日期前面几天,后面几天都是对的。后面我是更新了算法,在次使用另外一个人的算法驱动库去解决的,至于为什么会错误,直到最后都没直到原因)

    然后,我们在Arduino IDE中编写代码,测试CHA256和KMAC加密算法,并且和Python中的加密算法进行比对,把程序写入ESP32Cam后,也能进行加密运算,运算结果和Python的结果是一致的。

  • 获取时间戳,发送报文准备

在发送的消息中,有一个实时更新的数据——时间戳。以前有做过相关编程,这个部分比较顺利一点,经过一番的周折,终于从苏宁官网获取了时间戳,并经过一定的转换(两个时间戳是有一些差异的),获得了Python中所需要的时间戳了。

需要说明的是,腾讯的时间戳使用格林威治0时区的时间,苏宁用的是北京东八区的时间,要主要换算,还要把日期格式,转换成时间戳。

我们在这个测试的过程中,一般没有使用实时的时间戳(因为这个时间戳会实时更新)。我们会使用输入的指定时间戳,然后在Python和ESP32Cam中各自运行相同的时间戳,看看两边的加密算法的结果是否一致。

等待我们把所有的准备数据都准备完成后,(经过检查,使用相同的时间戳和相同的一张图片数据,最后运算的结果和Python中的加密运算结果完全一致)这个结果就是我们需要提交给腾讯官网的合格的数据了。

最后,我们在Arduino IDE中,让ESP32Cam把这些数据发送给腾讯官网,真的从腾讯官网获取到了车牌识别了结果了。到这里,我们把一张图片的信息和程序一起写入ESP32Cam,然后让ESP32Cam发送数据给腾讯官网,并获取到了识别结果,通过串口返回到电脑中进行显示出来。这个是最简单的测试回路了。

  • TFT屏幕显示

为了让这个产品外观更加好看,我们增加了一块TFT液晶屏,让液晶屏能实时显示摄像头的图像,并显示车牌识别结果。

这个在之前的第九课中的内容,需要添加TFT驱动和JPG驱动库,这次的屏幕换成240*280,我们的摄像头图像为240*176,这样,在图像显示的上面和下面,还能显示其他的文字消息了。

在这里我做了一个测试,在屏幕中间显示摄像头实时画面,在下方显示“鲁KZA166”。(这个车牌内容是指定的,仅作为测试用)

  • 车牌汉字取模

我们车牌上面的汉字一共有31个(一共34个省级单位,扣除港澳台她们的车牌格式不一样,所以我们就不做了)。

然后我们使用在线字模提取的工具,把这31个汉字的字模都取出来备用。

在识别结果中,我们用三个字节的数据代表一个汉字(BASE64的压缩算法,如果把这三个字节的数据解压缩,就能得到2个字节的数据了)。

我们这里没有采用解压缩的办法,而是采用加权运算的“土办法”:   把这三个字节的数据ABC,按照A*2 + B*3 + C*6进行运算,结果发现经过这样运算后,31个汉字的运算结果都不一样了(没有重叠相同的两个了),然后就建立了一个索引列表。以后要是识别出了一个汉字的三个字节,就能搜索列表找到响应的汉字了,也能找到这个汉字的字模数据了。

  • 内存优化管理

加下来就是把各种功能组合在一起:

ESP32Cam通电开机时,打开串口,点亮TFT屏幕,初始化摄像头,设置0号端口为按钮输入。

在主程序中,读取摄像头图片数据,并发送到屏幕显示(显示实时的视频画面)。当用户按下按钮的时候,就开启图形识别:1.对摄像头拍摄到的最新一张图像数据,进行BASE64转换,并根据格式串接成JSON字符串 payload。2. 对图像字符串进行哈希SHA256加密运算。3.运用SHA256和HMAC两种加密算法,把各种需要的数据进行组合,组成腾讯官网认可的校验数据。4.发送数据(包括请求头和图片数据体)到腾讯官网。5.等待从官网返回识别结果。6.对车牌的识别结果数据进行分解,读取前面三个字节,经过自定义的加权运算,从列表中搜索出汉字,读取出字模数据,显示在屏幕中。7.读取车牌信息中汉字后面的字母和数字,显示在屏幕中。8释放内存,断开与腾讯的链接,一次的车牌识别服务到此结束。

当我们把各个功能部分的代码写入ESP32Cam的时候,却发现ESP32Cam无法运行,不断地重启。

从串口反馈回来的信息是因为内存溢出造成的错误。重新修改一下程序,把摄像头、液晶屏等功能块删除,仅读取内存中的一张图片进行识别(回到前面的第三个步骤),发现是正常的。

确实到了这里,特别是摄像头、屏幕显示、BASE64运算等都会使用大量的内存,估计应该是在这里出了问题。于是我从网上的一篇教程中学到了动态申请内存的方法,结果问题解决了。

  • 第一个测试版

我们把程序写入ESP32Cam,然后让在电脑中显示一张车牌的图片,让摄像头拍下这张图片,发送给腾讯识别。结果发现有时候可以,有时候不行,最后经过几天摸索,发现是WIFI的网络不稳定造成了。

后来我该用更加稳定的网络连接:ESP32Cam连接手机的热点,手机关闭WIFI,打开数据流量,这样为ESP32Cam提供了一条专用的数据上行通道,问题也解决了。

第一次测试版是9月16日完成的,16日晚上一切正常,可是到了9月17日,发现所程序错了,腾讯官网返回的一直是错误的信息。于是对发送到官网的数据进行检查:回到前面第三步中的方法。采用制定的时间戳的方式,让Python和ESP32Cam运行相同的时间戳,然后一项一项的检查,结果发现到程序中的第3. 2步的HMAC运算结果错了。

我不甘心,明明昨天是好好的,代码也没改,为什么“2024-09-17”就错了呢?于是我该成“2024-09-16”,发现两个Python和ESP32Cam两边运算的结果是一致的;不甘心,改成“2024-09-18”,结果发现也是正确的。到了9月18日,程序又正常运行了,以后几天也没出过问题,到现在为止,也不知道,为什么9月17日是黑暗日。

  • 改进的实用版

9月17日一过,程序似乎恢复了正常,但是这个错误一直像定时炸弹一样,不知道什么时候会再次暴雷,必须彻底解决。

于是我在网上查找,终于找到了一个驱动库文件,花了许多的积分,从优快云资源中下载,不过这个驱动库应该是运行在电脑中的C语音,想要移植到ESP32Cam中,还是需要进行一些小的修改。

修改完成后,我故意拿了那个“2024-09-17”进行测试,结果发现问题解决了,Python和ESP32Cam两边运算的结果完全一致,问题得到彻底解决。

接下来就是把程序写入ESP32Cam,然后用断开与电脑的串口连接线,该用电池供电,就能制作成独立了、移动的、手持式的车牌识别器了。

在电池用两节18650,两节并联的话约是4V电源,发现ESP32Cam能启动,能点亮屏幕,但是网络连接一直没有(可能是WiFi芯片的供电需要5V电源吧)

于是改用两节电池串联,拿就有8V左右的电源,不能直接给ESP32Cam供电,我们加了一块7805的降压芯片。这里特别要注意的是,这块板子我有动手更改了,原来是只用了一只7805来提供5V电源,因为ESP32Cam的摄像头、屏幕、WiFi模块,都是耗电大户,结果只要打开电源,不一会儿就会发现7805发烫、而且有发焦的味道。

于是我对这块板子该了,焊下原来的7803,改成7805,这样这块板子上面就有了两块的7805,供电能力翻了一倍,这样就正常能使用了,而且也不会发热。

最后附上使用效果的视频:

8670

整个项目的所有测试过程的源代码,以及测试过程中的截图,所用到的驱动库文件。最后我会打包上传到优快云的资源下载,然后卖点资源分,回回血。到时候在为大家补上下载链接吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tongyue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值