[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.rhkb.cn/news/283644.html

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

相关文章

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题,把接口本地化,但是集成外链播放器接口就不本地化了,我花钱找人写的理解下…

算法体系-12 第 十二 二叉树的基本算法 下

一 实现二叉树的按层遍历 1.1 描述 1&#xff09;其实就是宽度优先遍历&#xff0c;用队列 2&#xff09;可以通过设置flag变量的方式&#xff0c;来发现某一层的结束&#xff08;看题目&#xff09;看下边的第四题解答 1.2 代码 public class Code01_LevelTraversalBT {publ…

【python】flask服务端响应与重定向处理

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Spring单元测试+Mockito

一&#xff0c;背景 单元测试基本上是开发逃不过的一个工作内容&#xff0c;虽然往往因为过于无聊&#xff0c;或者过于麻烦&#xff0c;而停止于项目的迭代之中&#xff0c;不了了之了。其实不是开发们懒&#xff0c;而是上头要求的测试覆盖率高&#xff0c;但是又没有好用的…

大模型+强化学习_精典方法_RLHF

英文名称&#xff1a;Deep Reinforcement Learning from Human Preferences 中文名称&#xff1a;从人类偏好中进行深度强化学习 链接&#xff1a;https://arxiv.org/abs/1706.03741 作者&#xff1a;Paul F Christiano, Jan Leike, Tom B Brown... 机构&#xff1a;OpenAI, …

数据结构从入门到精通——快速排序

快速排序 前言一、快速排序的基本思想常见方式通用模块 二、快速排序的特性总结三、三种快速排序的动画展示四、hoare版本快速排序的代码展示普通版本优化版本为什么要优化快速排序代码三数取中法优化代码 五、挖坑法快速排序的代码展示六、前后指针快速排序的代码展示七、非递…

英特尔生态的深度学习科研环境配置-A770为例

之前发过在Intel A770 GPU安装oneAPI的教程&#xff0c;但那个方法是用于WSL上。总所周知&#xff0c;在WSL使用显卡会有性能损失的。而当初买这台机器的时候我不在场&#xff0c;所以我这几天刚好有空把机器给重装成Ubuntu了。本篇不限于安装oneAPI&#xff0c;因为在英特尔的…

什么是PLC物联网关?PLC物联网关有哪些功能?

在数字化浪潮的推动下&#xff0c;工业物联网&#xff08;IIoT&#xff09;正逐步成为推动制造业智能化转型的关键力量。而在这一变革中&#xff0c;PLC物联网关扮演着至关重要的角色。今天&#xff0c;就让我们一起走进PLC物联网关的世界&#xff0c;了解它的定义、功能&#…

41-Vue-webpack基础

webpack基础 前言什么是webpackwebpack的基本使用指定webpack的entry和output 前言 本篇开始来学习下webpack的使用 什么是webpack webpack: 是前端项目工程化的具体解决方案。 主要功能&#xff1a;它提供了友好的前端模块化开发支持&#xff0c;以及代码压缩混淆、处理浏览…

机器学习 - 准备数据

“Data” in machine learning can be almost anything you can imagine. A table of big Excel spreadsheet, images, videos, audio files, text and more. 机器学习其实可以分为两部分 将不管是什么data&#xff0c;都转成numbers.挑选或者建立一个模型来学习这些numbers …

js模版字符串-标签模版

模版字符串 js模版字符串使用来创建模版字符串字面量&#xff0c;例如 const name "yu" console.log(hello ${name})很多人都知道。但是其实我们可以定义标签函数来自定义返回结果。 标签函数 带标签的模板是模板字面量的一种更高级的形式&#xff0c;它允许你使…

阿里云ecs服务器配置反向代理上传图片

本文所有软件地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/12OSFilS-HNsHeXTOM47iaA 提取码&#xff1a;dqph 为什么要使用阿里云服务器&#xff1f; 项目想让别人通过外网进行访问就需要部署到我们的服务器当中 1.国内知名的服务器介绍 国内比较知名的一些…

什么是行业垂直类媒体?有哪些?怎么邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体胡老师。 行业垂直类媒体是聚焦于特定行业或领域的媒体平台。 行业垂直类媒体不同于主流媒体&#xff0c;它们专注于提供与某个特定领域相关的深入内容和服务&#xff0c;例如商业新闻、旅游、数字…

seleniumUI自动化实例(登录CSDN页面)

今天分享一个CSDN登录模块的登录场景 1.配置文件 CSDNconf.py&#xff1a; from selenium import webdriver options webdriver.ChromeOptions() options.binary_location r"D:\Program Files\360\360se6\Application\360se.exe" # 360浏览器安装地址 driver w…

C++ Qt开发:QUdpSocket实现组播通信

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QUdpSocket组件实现基于UDP的组播通信…

MyBatis3源码深度解析(十七)MyBatis缓存(一)一级缓存和二级缓存的实现原理

文章目录 前言第六章 MyBatis缓存6.1 MyBatis缓存实现类6.2 MyBatis一级缓存实现原理6.2.1 一级缓存在查询时的使用6.2.2 一级缓存在更新时的清空 6.3 MyBatis二级缓存的实现原理6.3.1 实现的二级缓存的Executor类型6.3.2 二级缓存在查询时使用6.3.3 二级缓存在更新时清空 前言…

Nginx 的安装、启动和关闭

文章目录 一、背景说明二、Nginx 的安装2.1、依赖的安装2.2、Nginx 安装2.3、验证安装 三、启动 Nginx3.1、普通启动3.2、如何判断nginx已启动3.3、通过配置启动3.4、设置开机启动 四、关闭 Nginx4.1、优雅地关闭4.2、快速关闭4.3、只关闭主进程4.4、使用nginx关闭服务 五、重启…

计算机网络:数据交换方式

计算机网络&#xff1a;数据交换方式 电路交换分组交换报文交换传输对比 本博客介绍计算机之间数据交换的三种方式&#xff0c;分别是电路交换、分组交换以及报文交换。 电路交换 我们首先来看电路交换&#xff0c;在电话问世后不久&#xff0c;人们就发现要让所有的电话机都…

Springboot-软件授权License

无意中看到了一个简单方便的授权方式&#xff0c;只需几步就可集成到boot项目中。 先上地址&#xff1a;smart-license: 保护个人与企业的软件作品权益&#xff0c;降低盗版造成的损失。PS&#xff1a;因个人精力有限&#xff0c;不再提供该项目的咨询答疑服务。 Smart-licen…

【小米汽车SU7实测】 小米汽车su7到底行不行?小米新能源轿车体验感怎么样?

小米汽车SU7是小米汽车的首款车型&#xff0c;定位“C级高性能生态科技轿车”&#xff0c;也是小米迈入新能源赛道的首次成果落地。 首先&#xff0c;让我们来谈谈它的性能。试驾过程中&#xff0c;小米SU7展现出了惊人的加速能力&#xff0c;0-100km/h加速仅需2.78秒&#xf…