ESP32Cam人工智能教学22

ESP32Cam人工智能教学22

在线车牌识别装置

在第十六课《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日一过,程序似乎恢复了正常,但是这个错误一直像定时炸弹一样,不知道什么时候会再次暴雷,必须彻底解决。

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147759.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

基于yolov5滑块识别破解(一)

由于内容较长&#xff0c;将分为两个部分来说明&#xff0c;本文讲解yolov5的部署与训练。 1.YOLOv5部署 云端部署&#xff08;训练&#xff09; 服务器创建 如果自己的显卡算力不是很好的&#xff0c;或者是核显电脑&#xff0c;可以租用算力&#xff0c;价格还行一块钱左右就…

教你一招:在微信小程序中为用户上传的图片添加时间水印

在微信小程序开发过程中&#xff0c;我们常常需要在图片上添加水印&#xff0c;以保护版权或增加个性化元素。本文将为大家介绍如何在微信小程序中为图片添加时间水印&#xff0c;让你的小程序更具特色。 实现步骤&#xff1a; 1. 创建页面结构 在pages目录下创建一个名为upl…

springboot项目今日指数 -- 工程可用性测试

2. 编写测试 在这里我们编写一个测试文件通过用户名查询到用户信息 一. 编写service层 创建SysUserService接口 import com.jixu.stock.pojo.entity.SysUser;public interface SysUserService {public SysUser getUserByName(String username); }创建实现类 import com.ji…

Python酷库之旅-第三方库Pandas(124)

目录 一、用法精讲 551、pandas.DataFrame.notna方法 551-1、语法 551-2、参数 551-3、功能 551-4、返回值 551-5、说明 551-6、用法 551-6-1、数据准备 551-6-2、代码示例 551-6-3、结果输出 552、pandas.DataFrame.notnull方法 552-1、语法 552-2、参数 552-3…

为了不再被事务坑,我读透了Spring的事务传播性。

在之前文章中&#xff0c;我们已经被事务坑了两次&#xff1a; mq发送消息之后&#xff0c;业务代码回滚&#xff0c;导致发了一条中奖消息给用户&#xff01;&#xff01; 我又被Spring的事务坑了&#xff0c;用户兑奖之后&#xff0c;什么东西都没收到&#xff01;&#xf…

【高阶用法】uniapp的i18n/修复/增强/App无重启更换语言

痛点 在i18n多语言模块使用过程中&#xff0c;发现下面几个问题&#xff0c;需要解决 1&#xff09;uni-best框架下&#xff0c;$t功能函数无法实时的切换语言&#xff0c;可能跟使用有关 2&#xff09;uni-best建议的translate方式在vue块外使用太繁琐&#xff0c;希望不用…

10年计算机考研408-计算机网络

【题33】下列选项中&#xff0c;不属于网络体系结构所描述的内容是&#xff08;&#xff09; A.网络的层次 B.每一层使用的协议 C.协议的内部实现细节 D.每一层必须完成的功能 解析&#xff1a; 本题考查的是网络体系结构相关的概念。 图1描述了网络的7层架构以及每一层所要完成…

防火墙详解(一) 网络防火墙简介

原文链接&#xff1a;https://blog.csdn.net/qq_46254436/article/details/105519624 文章目录 定义 与路由器和交换机的区别 发展历史 防火墙安全区域 定义 防火墙主要用于保护一个网络区域免受来自另一个网络区域的网络攻击和网络入侵行为 “防火墙”一词起源于建筑领域&…

Openai gym environment for multi-agent games

题意&#xff1a;用于多智能体游戏的 OpenAI Gym 环境 问题背景&#xff1a; Is it possible to use openais gym environments for multi-agent games? Specifically, I would like to model a card game with four players (agents). The player scoring a turn starts the…

8月份工业机器人产量同比增长20%

近日&#xff0c;国家统计局公布数据显示&#xff0c;8月份&#xff0c;我国工业机器人产量为47947套&#xff0c;较去年同期增长20%&#xff1b;1-8月份&#xff0c;总产量为360592套&#xff0c;较去年同期增长9.9%。 9月14日&#xff0c;国家统计局发布数据显示&#xff0c;…

十大常用加密软件排行榜|2024年好用的加密软件推荐【精选】

在信息安全日益重要的时代&#xff0c;加密软件成为保护个人和企业数据的关键工具。选择合适的加密软件可以有效防止数据泄露和未授权访问。以下是2024年值得推荐的十大加密软件&#xff0c;帮助你找到适合的解决方案。 1. Ping32加密软件 Ping32是一款功能强大的加密软件&…

Spring Boot 学习之路 -- 处理 HTTP 请求

前言 最近因为业务需要&#xff0c;被拉去研究后端的项目&#xff0c;代码基于 Spring Boot&#xff0c;对我来说完全小白&#xff0c;需要重新学习研究…出于个人习惯&#xff0c;会以 Blog 文章的方式做一些记录&#xff0c;文章内容基本来源于「 Spring Boot 从入门到精通&…

【数列求值 / B】

题目 一般做法 #include <bits/stdc.h> using namespace std; const int mod 10000; int f[20190325] {1, 1, 1, 1}; int main() {for(int i 4; i < 20190324; i){f[i] (f[i-1] f[i-2] f[i-3]) % mod;}cout << f[20190324]; } 快速幂矩阵乘法 #includ…

索迪迈车载监控设备的优势有哪些

在当今社会&#xff0c;车载监控设备已经成为保障公共安全与交通管理的重要工具。索迪迈车载监控设备&#xff0c;以其先进的技术和卓越的性能&#xff0c;成为业界的佼佼者。其优势主要体现在以下几个方面&#xff1a; 一、抽拔式硬盘设计 1. 便捷的数据管理 车载监控设备需…

Rk628D 在 RK3588s平台上的驱动移植

硬件平台: W1_AI_RK3588S_V0 处理器: rk3588s kernel版本: Linux version 5.10.110 芯片是:rk628D 目的是:(4k)HDMI输入mipi 输出 1、下载RK628 最新(2024.09)的代码链接: 通过百度网盘分享的文件:RK628 链接:https://pan.baidu.com/s/1zN9yD2FQWAzVUMY1op…

Java面试题大全(全网最全,持续更新)初级(2)

1. 基础语法 1.1. Java 的数据类型有哪些&#xff1f; Java 有两种数据类型&#xff1a; 基本数据类型&#xff08;Primitive Types&#xff09;&#xff1a;包括 byte、short、int、long、float、double、char、boolean。引用数据类型&#xff08;Reference Types&#xff…

环境领域顶刊EST发表!又一次颠覆性突破!

2023年3月21日&#xff0c;普林斯顿大学任智勇教授团队针对最近爆火的ChatGPT和环境研究的交叉在环境领域顶级期刊《Environmental Science & Technology》发表了观点类文章“ChatGPT and Environmental Research”。 任智勇教授中对未来的展望表示&#xff1a; 颠覆性技术…

便携式气象观测仪的工作原理

TH-PQX9】便携式气象观测仪是一种集多种气象要素观测于一体&#xff0c;便于携带和使用的小型气象观测设备。实时监测和记录多种气象要素&#xff0c;包括温度、湿度、风速、风向、气压、太阳辐射、雨量等&#xff0c;满足不同场景下的气象监测需求。采用高精度传感器&#xff…

平板电容笔哪个牌子好?精选电容笔品牌排行榜前五名推荐!

在当今时代&#xff0c;平板电容笔已经成为平板电脑的重要配件&#xff0c;为人们的学习、工作和创作带来了极大的便利。然而&#xff0c;市场上平板电容笔的品牌众多&#xff0c;质量和性能也参差不齐&#xff0c;这让消费者在选择时常常感到困惑。平板电容笔究竟哪个牌子更好…

计算n个节点所能组成的不同二叉搜索树(卡特兰数)

计算n个节点所能组成的不同二叉搜索树的时候我们一般都是画图&#xff0c;但是有一个拱墅可以快速计算