[ESP32]:基于HTTP实现百度AI识图

[ESP32]:基于HTTP实现百度AI识图

测试环境:

  • esp32-s3
  • esp idf 5.1

首先,先配置sdk,可以写入到sdkconfig.defaults

CONFIG_IDF_TARGET="esp32s3"
CONFIG_IDF_TARGET_ESP32S3=yCONFIG_PARTITION_TABLE_CUSTOM=y
CONFIG_PARTITION_TABLE_CUSTOM_FILENAME="partitions.csv"
CONFIG_PARTITION_TABLE_FILENAME="partitions.csv"CONFIG_ESP_TLS_INSECURE=y
CONFIG_ESP_TLS_SKIP_SERVER_CERT_VERIFY=y

这里关闭了认证,并且建了分区表来存放我们待识别的图片。

1.百度控制台调试

1.获取token

在这里插入图片描述

2.在线调试,看下传输过程

在这里插入图片描述

主要关注如下内容:

header:

{"Accept": "application/json","Content-Type": "application/x-www-form-urlencoded"
}

body:

image=%2F9j%2F4AAQSkZJRgABAQEBLAEsAAD%2F2wBDAAUEBAUEAwUFBAUGBgUGCA4JCAcHCBEMDQoO...

其中imge图像要先base64编码,在url编码

2.esp32调试

我们这里主要参考esp http client的代码

1.base64编码

esp-idf中已经有base64编码的代码,我们include一下即可

#include "mbedtls/base64.h"int mbedtls_base64_encode(unsigned char *dst, size_t dlen, size_t *olen,const unsigned char *src, size_t slen)
2.url编码

这个要自己实现一下

int url_encode(const unsigned char *src, size_t slen, size_t *olen, unsigned char *dst, size_t dlen)
{size_t i, j = 0;// clac encoed sizefor (i = 0; i < slen; i++){if ((src[i] >= 'A' && src[i] <= 'Z') ||(src[i] >= 'a' && src[i] <= 'z') ||(src[i] >= '0' && src[i] <= '9') ||src[i] == '-' || src[i] == '_' || src[i] == '.' || src[i] == '~'){j++;}else if (src[i] == ' '){j++;}else{j += 3; // length of %xx is three}}// check buffer sizeif (dlen < j + 1){*olen = j + 1; // reytun need sizereturn -1;}// url encodefor (i = 0, j = 0; i < slen; i++){if ((src[i] >= 'A' && src[i] <= 'Z') ||(src[i] >= 'a' && src[i] <= 'z') ||(src[i] >= '0' && src[i] <= '9') ||src[i] == '-' || src[i] == '_' || src[i] == '.' || src[i] == '~'){dst[j++] = src[i];}else if (src[i] == ' '){dst[j++] = '+';}else{dst[j++] = '%';dst[j++] = "0123456789ABCDEF"[src[i] >> 4];dst[j++] = "0123456789ABCDEF"[src[i] & 0x0F];}}// add enddst[j] = '\0';// return size*olen = j;return 0;
}
3.添加http client的调用
 char post_url[1024] = {0};esp_http_client_config_t config = {.method = HTTP_METHOD_POST,.event_handler = app_http_baidu_event_handler,.buffer_size = 4 * 1024,};sprintf(post_url, "%s?access_token=%s", base_url, access_token);config.url = post_url;esp_http_client_handle_t client = esp_http_client_init(&config);esp_http_client_set_method(client, HTTP_METHOD_POST);esp_http_client_set_post_field(client, img_params, strlen(img_params)); //填入url编码后的图像数据esp_http_client_set_header(client, "Content-Type", "application/x-www-form-urlencoded");esp_err_t err = esp_http_client_perform(client);if (err == ESP_OK){ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d", esp_http_client_get_status_code(client), (int)esp_http_client_get_content_length(client));}else{ESP_LOGI(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));}esp_http_client_cleanup(client);
4.整体代码
#include "app_baidu.h"
#include "mbedtls/base64.h"
#include "esp_http_client.h"
#include "esp_log.h"
#include "esp_heap_caps.h"
#include "string.h"static const char *TAG = "HTTP_BAIDU";char access_token[256] = "xxxx"; //更换自己的token
char base_url[256] = "https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general";esp_err_t app_http_baidu_event_handler(esp_http_client_event_t *evt)
{if (evt->event_id == HTTP_EVENT_ON_DATA){ESP_LOGI(TAG, "%s",(char *)evt->data);}return ESP_OK;
}int url_encode(const unsigned char *src, size_t slen, size_t *olen, unsigned char *dst, size_t dlen)
{size_t i, j = 0;// clac encoed sizefor (i = 0; i < slen; i++){if ((src[i] >= 'A' && src[i] <= 'Z') ||(src[i] >= 'a' && src[i] <= 'z') ||(src[i] >= '0' && src[i] <= '9') ||src[i] == '-' || src[i] == '_' || src[i] == '.' || src[i] == '~'){j++;}else if (src[i] == ' '){j++;}else{j += 3; // length of %xx is three}}// check buffer sizeif (dlen < j + 1){*olen = j + 1; // reytun need sizereturn -1;}// url encodefor (i = 0, j = 0; i < slen; i++){if ((src[i] >= 'A' && src[i] <= 'Z') ||(src[i] >= 'a' && src[i] <= 'z') ||(src[i] >= '0' && src[i] <= '9') ||src[i] == '-' || src[i] == '_' || src[i] == '.' || src[i] == '~'){dst[j++] = src[i];}else if (src[i] == ' '){dst[j++] = '+';}else{dst[j++] = '%';dst[j++] = "0123456789ABCDEF"[src[i] >> 4];dst[j++] = "0123456789ABCDEF"[src[i] & 0x0F];}}// add enddst[j] = '\0';// return size*olen = j;return 0;
}// base64 encode: http://www.yzcopen.com/img/imgbase64
// url encode: https://www.jyshare.com/front-end/695/?
void app_baidu_classification(char *img_buf, int file_size)
{char *img_base64 = NULL;char *img_params = NULL;char *img_base64_url = NULL;char *img_params_format = "image=%s";size_t img_base64_size = 0;size_t img_base64_url_size = 0;// base64 encodembedtls_base64_encode(NULL, 0, &img_base64_size, (const unsigned char *)img_buf, file_size);ESP_LOGI(TAG, "Image size after bash64:%zu", img_base64_size);img_base64 = heap_caps_calloc(1, img_base64_size + 1, MALLOC_CAP_DMA);if (img_base64 == NULL){ESP_LOGI(TAG, "Memory image bash64 allocation failed");return;}mbedtls_base64_encode((unsigned char *)img_base64, img_base64_size + 1, &img_base64_size, (const unsigned char *)img_buf, file_size);// url encodeurl_encode((const unsigned char *)img_base64, img_base64_size, &img_base64_url_size, NULL, 0);ESP_LOGI(TAG, "Image size after url:%zu", img_base64_url_size);img_base64_url = heap_caps_calloc(1, img_base64_url_size + 1, MALLOC_CAP_DMA);if (img_base64_url == NULL){ESP_LOGI(TAG, "Memory image bash64 url allocation failed");free(img_base64);return;}url_encode((const unsigned char *)img_base64, img_base64_size, &img_base64_url_size, (unsigned char *)img_base64_url, img_base64_url_size + 1);// set data paramsimg_params = heap_caps_calloc(1, img_base64_url_size + 1 + strlen(img_params_format), MALLOC_CAP_DMA);if (img_params == NULL){ESP_LOGI(TAG, "Memory image params allocation failed");free(img_base64);free(img_base64_url);return;}sprintf(img_params, img_params_format, img_base64_url);// http client settingchar post_url[1024] = {0};esp_http_client_config_t config = {.method = HTTP_METHOD_POST,.event_handler = app_http_baidu_event_handler,.buffer_size = 4 * 1024,};sprintf(post_url, "%s?access_token=%s", base_url, access_token);config.url = post_url;esp_http_client_handle_t client = esp_http_client_init(&config);esp_http_client_set_method(client, HTTP_METHOD_POST);esp_http_client_set_post_field(client, img_params, strlen(img_params));esp_http_client_set_header(client, "Content-Type", "application/x-www-form-urlencoded");esp_err_t err = esp_http_client_perform(client);if (err == ESP_OK){ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d", esp_http_client_get_status_code(client), (int)esp_http_client_get_content_length(client));}else{ESP_LOGI(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));}esp_http_client_cleanup(client);free(img_base64);free(img_base64_url);free(img_params);
}

3.实验效果

拿了一张泰勒的图来识别

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

值迭代和策略迭代【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程&#xff0c;个人觉得赵老师的课件深入浅出&#xff0c;很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 文章目录 强化学习笔记一、Value It…

江苏开放大学2024年春《中级会计实务(上) 050284》第1次任务第一单元总论、第二单元存货练习参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电大搜题 多的用不完的题库&#xff…

Qt教程 — 3.6 深入了解Qt 控件:Display Widgets部件(2)

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QTextBrowser组件-简单的文本浏览器 ​2.2 QGraphicsView组件-简单的图像浏览器 Display Widgets将分为两篇文章介绍 文章1&#xff08;Qt教程 — 3.5 深入了解Qt 控件&#xff1a;Display Widgets部件-CSDN…

Magic Copy:一键AI抠图,在浏览器中获得任何图像素材

Magic Copy&#xff1a;轻松一点&#xff0c;精准抠图&#xff0c;让创意无限放大&#xff01; - 精选真开源&#xff0c;释放新价值。 概览 Magic Copy&#xff08;AI智能抠图插件&#xff09;是一个创新型的浏览器扩展工具&#xff0c;其独特之处在于能够无缝集成于用户的网…

CCDP.02.OS正确部署后的Dashboard摘图说明

前言 在部署成功OpenStack后&#xff0c;应该可以在浏览器打开Dashboard&#xff0c;并对计算资源&#xff08;这里主要是指VM&#xff09;进行管理&#xff0c;也可以在Dashboard上面查看OpenStack是否存在错误&#xff0c;下面&#xff0c;已针对检查的关键点&#xff0c;用红…

Mysql之索引存储原理

在介绍索引实现之前&#xff0c;我们先来了解下几种树的数据结构&#xff1a; 一、二叉搜索树 二叉搜索树有以下性质&#xff1a; 1.每个节点有一个关键字 2.左右孩子至多有一个。 3.关键字大于左孩子&#xff0c;小于右孩子。 正因为二叉搜索树的特性&#xff0c;所以这种数…

基于java+springboot+vue实现的游戏账号估价交易平台(文末源码+Lw+ppt)23-555

摘 要 系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对游戏账号估价交易的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自…

Structured Knowledge Distillation for Accurate and Efficient Object Detection

摘要 许多之前的知识蒸馏方法是为图像分类而设计的&#xff0c;在具有挑战性的任务&#xff08;如目标检测&#xff09;中失败。本文首先提出了知识蒸馏在目标检测中失败的主要原因是&#xff1a;&#xff08;1&#xff09;前景和背景之间不平衡&#xff1a;(2)缺乏对不同像素…

PTA L2-027 名人堂与代金券

对于在中国大学MOOC&#xff08;http://www.icourse163.org/ &#xff09;学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;总评成绩必须达到 60 分及以上&#xff0c;并且有另加福利&#xff1a;总评分在 [G, 100] 区间内者&#xff0c;可以得到 50 元…

公司内部局域网怎么适用飞书?

随着数字化办公的普及&#xff0c;企业对于内部沟通和文件传输的需求日益增长。飞书作为一款集成了即时通讯、云文档、日程管理、视频会议等多种功能的智能协作平台&#xff0c;已经成为许多企业提高工作效率的首选工具。本文将详细介绍如何在公司内部局域网中应用飞书&#xf…

【机器学习之---统计】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派&#xff08;传统学派&#xff09;认为样本信息来自总体&#xff0c;通过对样本信息的研究可以合理地推断和估计总体信息…

docker 的八大技术架构(图解)

docker 的八大技术架构 单机架构 概念&#xff1a; 应用服务和数据库服务公用一台服务器 出现背景&#xff1a; 出现在互联网早期&#xff0c;访问量比较小&#xff0c;单机足以满足需求 架构优缺点&#xff1a; 优点&#xff1a;部署简单&#xff0c;成本低 缺点&#xff1…

单片机基础知识

目录 微型计算机基本结构 总线 片内总线和片外总线 数据总线地址总线与控制总线 系统总线和IO总线 微处理器的内部结构 内部寄存器 通用寄存器 指针和变址寄存器 段寄存器 控制寄存器 标志寄存器 存储器的基本结构 存储器的分类 IO接口的功能 外部设备与CPU之间…

点餐小程序php毕设项目

主要技术框架&#xff1a; 主要功能模块&#xff1a; 商品管理 订单管理 用户管理 优惠券管理 商品分类管理 评论管理 轮播图管理 截图 获取源码 https://blog.lusz.top/article?article_id-2

python爬虫之xpath+多进程爬取百度贴吧实战

文章目录 抓取百度贴吧的某一个帖子的评论内容前言先查看贴吧的robots.txt页面结构分析评论者头像&#xff0c;用户抓取评论内容的抓取评论下回复内容的抓取 源码实现贴吧抓取过程源码实现多进程的实现 抓取百度贴吧的某一个帖子的评论内容 前言 本项目实战是用来学习用&#…

操作系统内功篇:硬件结构之CPU是如何执行任务的?

一 CPU是如何读写数据的&#xff1f; 1.1 CPU架构(组成) 当代CPU一般是多核心的&#xff0c;每个核心都有自己的一个L1和L2Cache&#xff0c;L3Cache是一个CPU所有核心共享的&#xff0c;一个CPU只有一个。L1Cache分为数据缓存和指令缓存。 CPU有三层高速缓存的目的就是将Cac…

安装paddle detection心得

一、安装PaddlePaddle conda create -n mypaddle python3.8 conda activate mypaddle python -m pip install paddlepaddle-gpu2.6.0 -i https://mirror.baidu.com/pypi/simple 请确保您的PaddlePaddle安装成功并且版本不低于需求版本。使用以下命令进行验证。 这是CUDA1…

Warning logs 2024-03-23

给旧的笔记本安装ubuntu系统&#xff0c;并实现ssh远程连接 1、下载ubuntu系统 ubuntu下载链接 选择带桌面版本 2、准备U盘 3、使用UltraISO制作启动盘 破解UltraISO软件 输入 注册名&#xff1a;王涛 注册码&#xff1a;7C81-1689-4046-626F 使用UltraISO&#xff0c…

RabbitMQ的使用—实战

RabbitMQ的使用—实战 ​ RabbitMQ是一个开源的消息代理中间件&#xff0c;在分布式系统开发中被广泛应用。它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;提供可靠的消息传递、灵活的路由、消息确认等功能。下面是使用RabbitMQ的基本流程&#xff1a; 安…

雷卯推荐超级省电防反接方案

方案特别适合一端电池&#xff0c;一端充电的防反接&#xff0c;特别节能 低VF肖特基电源防反接 此方案采用3颗低压降SKY&#xff0c;相比只用1颗功耗更低&#xff0c;可以防止元器件过热 &#xff08;两者正常工作损耗对比公式&#xff1a; 1.采用1颗SS34LVFA&#xff1a;…