基于Blinker _ ESP32_CAM与百度云AI开发低成本人脸门禁控制器-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: 526598

[分享] 基于Blinker_ ESP32_CAM与百度云AI开发低成本人脸门禁控制器

[复制链接]
发表于 2022-8-6 04:06 | 显示全部楼层
新版的编译器要求字符串双引号""里的引号前要加\反斜杠
就像这样#define Json_begin        "{"image":""         //Json封装头
改成这样#define Json_begin        "{\"image\":\""         //Json封装头

如果有人在String POST_Code=Json_begin+base64+Json_end;位置报错的话,可以试试用我改过的代码

  1. #define BLINKER_WIFI
  2. //#define BLINKER_ESP_SMARTCONFIG //自动配网设置

  3. #include <HTTPClient.h>
  4. #include <ArduinoJson.h>
  5. #include <base64.h>
  6. #include <Blinker.h>
  7. #include "ESP32_CAM_SERVER.h"

  8. char auth[] = "************";//blinker的设备号
  9. char ssid[] = "********";//wifi名称
  10. char pswd[] = "********";//wifi密码

  11. #define client_id         "************************" //API Key【百度云应用的AK】
  12. #define client_secret     "********************************"//Secret Key【百度云应用的SK】

  13. #define Json_begin        "{"image":""         //Json封装头
  14. #define Json_end          "","image_type":"BASE64","group_id_list":"test"}" //Json封装尾    test改成你的用户组,如果一直提示未检测到人脸信息,可能是填错了

  15. String access_token;
  16. String Group_list_str;
  17. bool setup_camera = false;

  18. #define BUTTON_1 "ButtonKey"
  19. BlinkerButton Button1(BUTTON_1);

  20. //人脸验证程序,图像数据需要经过base64编码后以JSON格式发送
  21. static void Baidu_AI(camera_fb_t* &fb){
  22.   String base64 = base64::encode(fb->buf,fb->len);
  23.   uint32_t len = base64.length();
  24.   //Serial.print(base64);
  25.   HTTPClient http;
  26.   http.begin("https://aip.baidubce.com/rest/2.0/face/v3/search?access_token="+ access_token);
  27.   String POST_Code=Json_begin+base64+Json_end;
  28.   http.setReuse(true);
  29.   http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  30.   http.addHeader("Accept","application/json");
  31.   http.addHeader("Content-Length",String(POST_Code.length()));
  32.   http.addHeader("X-Custom-Header", "custom-header-value");
  33.   int httpCode = http.POST(POST_Code);//图片太大就会发送失败

  34.   if (httpCode > 0) {
  35.     // HTTP header has been send and Server response header has been handled
  36.     Serial.println("验证人脸... ");
  37.     // file found at server
  38.     if (httpCode == HTTP_CODE_OK) {
  39.       String  payload=http.getString();
  40.       DynamicJsonDocument  jsonBuffer(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2)+strlen(payload.c_str())*sizeof(String));
  41.       DeserializationError error = deserializeJson(jsonBuffer, payload);
  42.       if (error) {
  43.         Serial.print(F("deserializeJson() failed: "));
  44.         BLINKER_LOG(error.c_str());
  45.         http.end();
  46.         return;
  47.       }
  48.       JsonObject reload_Json = jsonBuffer.as<JsonObject>();
  49.       int search_buff_error_code=reload_Json["error_code"].as<int>();
  50.       
  51.       
  52.       if (search_buff_error_code==0){  
  53.         String search_buff_user_id=reload_Json["result"]["user_list"][0]["user_id"].as<const char*>();
  54.         String search_buff_group_id=reload_Json["result"]["user_list"][0]["group_id"].as<const char*>();
  55.         float search_buff_score=reload_Json["result"]["user_list"][0]["score"].as<float>();
  56.         Serial.print("用户名:"+search_buff_user_id);
  57.         Serial.println("  相似度: "+String(search_buff_score));
  58.         
  59.         Blinker.print("用户名:"+search_buff_user_id);
  60.         Blinker.print("相似度: "+String(search_buff_score));
  61.         if(search_buff_score>=79){
  62.           //官方建议相似度超过80%即可视为验证通过,可以在这里插入控制门禁设备代码
  63.           Blinker.print("门已开启");
  64.           Serial.print("门已开启");
  65.         }
  66.         
  67.       }else{
  68.         
  69.         Serial.println(" 未检测到人脸信息!");
  70.       }
  71.     }
  72.   } else {
  73.     Serial.printf("[HTTP] ... failed, error: %s\n", http.errorToString(httpCode).c_str());
  74.   }
  75.   http.end();
  76. }


  77. //获取百度鉴权认证认证token
  78. static void Baidu_AI_token(){
  79.   HTTPClient http;
  80.   Serial.printf("获取百度_AI_token ... ");

  81.   http.begin("https://aip.baidubce.com/oauth/2.0/token");
  82.   http.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
  83.   
  84.   int httpCode = http.POST("grant_type=client_credentials&client_id="+String(client_id) +"&client_secret="+String(client_secret));
  85.   if (httpCode > 0) {
  86.     // HTTP header has been send and Server response header has been handled

  87.     // file found at server
  88.     if (httpCode == HTTP_CODE_OK) {
  89.       String  payload=http.getString();
  90.       DynamicJsonDocument  jsonBuffer(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2)+strlen(payload.c_str())*sizeof(String));
  91.       //DynamicJsonDocument  jsonBuffer(20000);
  92.       DeserializationError error = deserializeJson(jsonBuffer, payload);
  93.       if (error) {
  94.         Serial.print(F("deserializeJson() failed: "));
  95.         Serial.println(error.c_str());
  96.         http.end();
  97.         return;
  98.       }
  99.       
  100.       JsonObject reload_Json = jsonBuffer.as<JsonObject>();
  101.       access_token=reload_Json["access_token"].as<const char*>();
  102.       Serial.println("SUCCESS");
  103.       Serial.print("access_token=");
  104.       Serial.println(access_token);

  105.     }
  106.   } else {
  107.     Serial.printf("[HTTP] ... failed, error: %s\n", http.errorToString(httpCode).c_str());
  108.   }
  109.   http.end();


  110.   delay(500);
  111. }
  112. //获取用户组列表
  113. static void Baidu_AI_Group_list(){
  114.   HTTPClient http;
  115.   Serial.println("[HTTPS] 获取组列表...");

  116.   http.begin("https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getlist");
  117.   http.addHeader("Content-Type", "application/json; charset=UTF-8");
  118.   String POST_Code="access_token="+access_token;
  119.   int httpCode = http.POST(POST_Code);
  120.   if (httpCode > 0) {
  121.     Serial.println("[HTTP] 获取用户列表 ... ");
  122.     // HTTP header has been send and Server response header has been handled
  123.     // file found at server
  124.     if (httpCode == HTTP_CODE_OK) {
  125.       String  payload=http.getString();
  126.       int payload_len=strlen(payload.c_str());
  127.       DynamicJsonDocument  group_list_jsonBuffer(JSON_OBJECT_SIZE(3) + JSON_ARRAY_SIZE(2)+payload_len*sizeof(String));
  128.       DeserializationError error = deserializeJson(group_list_jsonBuffer, payload);
  129.       if (error) {
  130.         Serial.print(F("获取用户组列表失败: "));
  131.         Serial.println(error.f_str());
  132.         http.end();
  133.         return;
  134.       }
  135.       //获取组列表
  136.       JsonObject group_list_Json = group_list_jsonBuffer.as<JsonObject>();
  137.       int Group_len=group_list_Json["result"]["group_id_list"].size();
  138.       Serial.print("用户组数量=");
  139.       Serial.println(Group_len);
  140.       int User_list_count=0;
  141.       //http.end();
  142.       if(Group_len>0){  
  143.         Group_list_str=group_list_Json["result"]["group_id_list"][0].as<const char*>();
  144.         for(int i=0;i<Group_len-1;i++){
  145.           Group_list_str=Group_list_str+","+group_list_Json["result"]["group_id_list"][i+1].as<const char*>();
  146.         }
  147.         Serial.println(Group_list_str);
  148.       }
  149.     }
  150.   } else {
  151.     Serial.printf("[HTTP] ... failed, error: %s\n", http.errorToString(httpCode).c_str());
  152.   }
  153.   http.end();
  154.   delay(500);
  155. }

  156. void button1_callback(const String & state)
  157. {
  158.     digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
  159.     BLINKER_LOG("get button state: ", state);
  160.     camera_fb_t *fb = esp_camera_fb_get();
  161.     if(!fb)return;
  162.     //BLINKER_LOG("Got image");
  163.     Baidu_AI(fb);   //人脸验证程序,图像数据需要经过base64编码后以JSON格式发送
  164.     esp_camera_fb_return(fb);
  165.    
  166. }
  167. void dataRead(const String & data)
  168. {
  169.     BLINKER_LOG("Blinker readString: ", data);

  170.     Blinker.vibrate();
  171.    
  172.     uint32_t BlinkerTime = millis();
  173.    
  174.     Blinker.print("millis", BlinkerTime);
  175. }

  176. void setup()
  177. {
  178.     Serial.begin(115200);
  179.     BLINKER_DEBUG.stream(Serial);

  180.     pinMode(LED_BUILTIN, OUTPUT);
  181.     digitalWrite(LED_BUILTIN, LOW);
  182.    
  183.     //Blinker.begin(auth);//自动配网设置
  184.     Blinker.begin(auth,ssid,pswd);
  185.     Blinker.attachData(dataRead);
  186.     Button1.attach(button1_callback);

  187. }
  188. void loop()
  189. {
  190.     Blinker.run();

  191.     if (Blinker.connected() && !setup_camera)
  192.     {
  193.         setupCamera();
  194.         
  195.         sensor_t * s = esp_camera_sensor_get();//设置分辨率
  196.         s->set_framesize(s, FRAMESIZE_QQVGA);//分辨率降为QQVGA
  197.         s->set_brightness(s, 2);
  198.         setup_camera = true;

  199.         Blinker.printObject("video", "{"str":"mjpg","url":"http://"+ WiFi.localIP().toString() + ""}");
  200.         //Blinker.printObject("video", "{"str":"mjpg","url":"http://"+ WiFi.localIP().toString() + ""}");
  201.         if(access_token==NULL){
  202.             BLINKER_LOG("成功连接网络,尝试获取百度AI_token");
  203.             Baidu_AI_token();//获取百度鉴权认证认证token
  204.             Baidu_AI_Group_list();//获取用户组列表
  205.             Serial.println("设备准备就绪可以进行人脸识别 ... ...");
  206.             Blinker.print("设备准备就绪可以进行人脸识别 ... ...");
  207.         }
  208.     }
  209. //    delay(1000);//每隔1000ms识别一次
  210. //        camera_fb_t *fb = esp_camera_fb_get();
  211. //        if(!fb)return;
  212. //        //BLINKER_LOG("Got image");
  213. //        Baidu_AI(fb);   //人脸验证程序,图像数据需要经过base64编码后以JSON格式发送
  214. //        esp_camera_fb_return(fb);
  215. }
复制代码


另外我想问下楼主,用POST发送https时,如果请求信息太长的话,也就是图片分辨率太大时,请求长度超过5000左右时,服务器就会接收失败,请问楼主有解决方法吗,实在弄不来了我用抓包都抓不到什么东西
 楼主| 发表于 2022-8-21 10:02 | 显示全部楼层
ybyllc 发表于 2022-8-6 04:06
新版的编译器要求字符串双引号""里的引号前要加\反斜杠
就像这样#define Json_begin        "{"image":""   ...

我也尝试过大图片,不行,可能跟内存小有关系,上传的内容不完整,后来尝试用树莓派python+openCV通过局域网远程取图然后截取面部照片,不过速度一般,想过用电脑开后台服务也没啥必要就放弃不玩了
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 08:40 , Processed in 0.157366 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表