当前位置:   article > 正文

C++ POST请求调用百度AI OCR_c++ 调用百度ocr 人脸识别

c++ 调用百度ocr 人脸识别

阅读本文前先看这篇文章,有curl,openssl,jsoncpp的编译:c++调用百度AI OCR SDK ,本来百度是封装好了c++ SDK调用方法的,所以本文主要研究本质POST的用法。

一.鉴权认证机制

1.百度通用参考:鉴权认证机制

简介

本文档主要针对HTTP API调用者,百度AIP开放平台使用OAuth2.0授权调用开放API,调用API时必须在URL中带上access_token参数,获取Access Token的流程如下:

获取Access Token

请求URL数据格式

向授权服务地址https://aip.baidubce.com/oauth/2.0/token发送请求(推荐使用POST),并在URL中带上以下参数:

  • grant_type: 必须参数,固定为client_credentials
  • client_id: 必须参数,应用的API Key
  • client_secret: 必须参数,应用的Secret Key

例如:

https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=Va5yQRHlA4Fq5eR3LT0vuXV4&c

2.c++调用

这里提供我的Key, token有一定的有效期,需要自行管理,当失效时需重新获取

  1. #include <iostream>
  2. #include <curl/curl.h>
  3. #include <json/json.h>
  4. #pragma warning(disable:4996)
  5. //#include "access_token.h"
  6. // libcurl库下载链接:https://curl.haxx.se/download.html
  7. // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
  8. // 获取access_token所需要的url
  9. const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
  10. // 回调函数获取到的access_token存放变量
  11. // static std::string access_token_result;
  12. /**
  13. * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中
  14. * @param 参数定义见libcurl库文档
  15. * @return 返回值定义见libcurl库文档
  16. */
  17. static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
  18. // 获取到的body存放在ptr中,先将其转换为string格式
  19. std::string s((char *)ptr, size * nmemb);
  20. // 开始获取json中的access token项目
  21. Json::Reader reader;
  22. Json::Value root;
  23. // 使用boost库解析json
  24. reader.parse(s, root);
  25. std::string* access_token_result = static_cast<std::string*>(stream);
  26. *access_token_result = root["access_token"].asString();
  27. return size * nmemb;
  28. }
  29. /**
  30. * 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key
  31. * @param access_token 获取得到的access token,调用函数时需传入该参数
  32. * @param AK 应用的API key
  33. * @param SK 应用的Secret key
  34. * @return 返回0代表获取access token成功,其他返回值代表获取失败
  35. */
  36. int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
  37. CURL *curl;
  38. CURLcode result_code;
  39. int error_code = 0;
  40. curl = curl_easy_init();
  41. if (curl) {
  42. std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
  43. curl_easy_setopt(curl, CURLOPT_URL, url.data());
  44. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
  45. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
  46. std::string access_token_result;
  47. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);
  48. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
  49. result_code = curl_easy_perform(curl);
  50. if (result_code != CURLE_OK) {
  51. fprintf(stderr, "curl_easy_perform() failed: %s\n",
  52. curl_easy_strerror(result_code));
  53. return 1;
  54. }
  55. access_token = access_token_result;
  56. curl_easy_cleanup(curl);
  57. error_code = 0;
  58. }
  59. else {
  60. fprintf(stderr, "curl_easy_init() failed.");
  61. error_code = 1;
  62. }
  63. return error_code;
  64. }
  65. int main()
  66. {
  67. std::string stToken;
  68. get_access_token(stToken, "puMFv72xqCYV2jdcSlXgtFvm", "v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");
  69. std::cout << "获取Token:" << stToken << std::endl;
  70. return 0;
  71. }

3.获取Token

二、通用文字识别(标准版)

1.百度AI OCR POST 请求:通用文字识别(标准版)

请求说明

请求示例

HTTP 方法:POST

请求URL: https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic

URL参数:

参数
access_token通过API Key和Secret Key获取的access_token,参考“Access Token获取

Header如下:

参数
Content-Typeapplication/x-www-form-urlencoded

2.获取图片Base64

我们把这张图片通过在线转换获取base64

3.c++ POST方法

 建立ssl连接时出现以下错误。“对等证书不能使用已知的CA证书进行身份验证”

先关闭证书的curl的验证
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,FALSE);

  1. #include <iostream>
  2. #include <curl/curl.h>
  3. #include <string>
  4. // libcurl库下载链接:https://curl.haxx.se/download.html
  5. // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
  6. const static std::string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
  7. static std::string generalBasic_result;
  8. /**
  9. * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
  10. * @param 参数定义见libcurl文档
  11. * @return 返回值定义见libcurl文档
  12. */
  13. static size_t callback2(void *ptr, size_t size, size_t nmemb, void *stream) {
  14. // 获取到的body存放在ptr中,先将其转换为string格式
  15. generalBasic_result = std::string((char *)ptr, size * nmemb);
  16. return size * nmemb;
  17. }
  18. /**
  19. * 通用文字识别
  20. * @return 调用成功返回0,发生错误返回其他错误码
  21. */
  22. int generalBasic(std::string &json_result, const std::string &access_token) {
  23. std::string url = request_url + "?access_token=" + access_token;
  24. CURL *curl = NULL;
  25. CURLcode result_code;
  26. int is_success;
  27. curl = curl_easy_init();
  28. if (curl) {
  29. curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,FALSE);
  30. curl_easy_setopt(curl, CURLOPT_URL, url.data());
  31. curl_easy_setopt(curl, CURLOPT_POST, 1);
  32. curl_httppost *post = NULL;
  33. curl_httppost *last = NULL;
  34. curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFcAAAAUCAYAAAD4BKGuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJzSURBVFhH7ZfbkcMgDEW3R3fiRtwHZdAFXbgDFpmXEJIsO85OZjYfdyYGR48jCZKfZVniV1RrdCFEt3J7dn3hclpdDPse9/01wF+4jFYXElgfN2ZP1eZjcGt7ZuDCSEDVqIizZKjtBRdXvEe0+W7Hb7C2RV+ecTCzUCx+y2vVb32muhAXrxxbjnNca3bPVPwOcDEEUTVgnIQ2Pm3EslrQhtHLHZTewZA0uMiXXjRZh8/B9hpXLr7Dl35sNLgDWCbwKdEBLv+d/r0QQ+lA3BHNpwqKJCDBfQBs7lAyodUunQIzXARqHAeqNKaewE3PeXS5M6qMUwrMFZDSuFG/IngWLhpbocgWgU82DgoWZIPLnGsWoSRrV9OOqesQcIVFg58mAtSKzRRsgvsMWIhj6vjDlwDQBlfuHlVDktUGhlGLltckuLi4Obn+zMYz+L3ZGFStmLNEJia49Uxhx1oR6SDcpXi/doMMt78LMTiuk7l323GkvHtBmx9BQbzq2W2CixJ7BW4rUkk0w+w2VbhoP0sJusXbpUK4oaNRzibhT+EmNYCugOb2pDFDx5MKi4ELku1eFECzTIIJbu24B+COic9jdgbB8g712zteT9SkgwXhUPxNBTfBfeRCq+vogiHVfxdczecl1Y5tzVY05EfeP4d788Zl4TIXW9H74IJe/znWJ8A4wTa46UMNOElNDAox/YmwJfNeuGg96d4FJ/zNlWSGm9QrxwSeNP3Y/zS4SS3GMxsX1G2Sjr4CFzQAlvTBcEE9Bz1xTbhI4hRIcFN89TsD3Cx0fmHRy+JD4Q53iBkwyRnZ7sW6qGSDgftPBUUzNopNS/wFOn1L0FSx0H8AAAAASUVORK5CYII=", CURLFORM_END);
  35. curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
  36. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback2);
  37. result_code = curl_easy_perform(curl);
  38. if (result_code != CURLE_OK) {
  39. fprintf(stderr, "curl_easy_perform() failed: %s\n",
  40. curl_easy_strerror(result_code));
  41. is_success = 1;
  42. return is_success;
  43. }
  44. json_result = generalBasic_result;
  45. curl_easy_cleanup(curl);
  46. is_success = 0;
  47. }
  48. else {
  49. fprintf(stderr, "curl_easy_init() failed.");
  50. is_success = 1;
  51. }
  52. return is_success;
  53. }
  54. int main()
  55. {
  56. std::string stToken="24.adc315cddc50deb56f96fd35d60badf1.2592000.1621131811.282335-17594920";
  57. /*get_access_token(stToken,"puMFv72xqCYV2jdcSlXgtFvm","v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");
  58. std::cout << "获取Token:"<<stToken << std::endl;*/
  59. std::cout << "开始OCR通用识别!" << std::endl;
  60. std::string stBack;
  61. generalBasic(stBack, stToken);
  62. std::cout << "返回值:" << stBack << std::endl;
  63. return 0;
  64. }

 

4.识别效果

项目案例下载:C++ POST请求调用百度AI OCR

/**************************************************************************************************************************************************************************************************************************************/

 

方法2:提供base64转换方法

  1. //#include <iostream>
  2. //#include <curl/curl.h>
  3. //#include <json/json.h>
  4. //#pragma warning(disable:4996)
  5. //
  6. libcurl库下载链接:https://curl.haxx.se/download.html
  7. jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
  8. 获取access_token所需要的url
  9. //const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
  10. 回调函数获取到的access_token存放变量
  11. static std::string access_token_result;
  12. ///**
  13. // * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中
  14. // * @param 参数定义见libcurl库文档
  15. // * @return 返回值定义见libcurl库文档
  16. // */
  17. //static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
  18. // // 获取到的body存放在ptr中,先将其转换为string格式
  19. // std::string s((char *)ptr, size * nmemb);
  20. // // 开始获取json中的access token项目
  21. // Json::Reader reader;
  22. // Json::Value root;
  23. // // 使用boost库解析json
  24. // reader.parse(s, root);
  25. // std::string* access_token_result = static_cast<std::string*>(stream);
  26. // *access_token_result = root["access_token"].asString();
  27. // return size * nmemb;
  28. //}
  29. //
  30. ///**
  31. // * 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key
  32. // * @param access_token 获取得到的access token,调用函数时需传入该参数
  33. // * @param AK 应用的API key
  34. // * @param SK 应用的Secret key
  35. // * @return 返回0代表获取access token成功,其他返回值代表获取失败
  36. // */
  37. //int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
  38. // CURL *curl;
  39. // CURLcode result_code;
  40. // int error_code = 0;
  41. // curl = curl_easy_init();
  42. // if (curl) {
  43. // std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
  44. // curl_easy_setopt(curl, CURLOPT_URL, url.data());
  45. // curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
  46. // curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
  47. // std::string access_token_result;
  48. // curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);
  49. // curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
  50. // result_code = curl_easy_perform(curl);
  51. // if (result_code != CURLE_OK) {
  52. // fprintf(stderr, "curl_easy_perform() failed: %s\n",
  53. // curl_easy_strerror(result_code));
  54. // return 1;
  55. // }
  56. // access_token = access_token_result;
  57. // curl_easy_cleanup(curl);
  58. // error_code = 0;
  59. // }
  60. // else {
  61. // fprintf(stderr, "curl_easy_init() failed.");
  62. // error_code = 1;
  63. // }
  64. // return error_code;
  65. //}
  66. //int main()
  67. //{
  68. // std::string stToken;
  69. // get_access_token(stToken, "puMFv72xqCYV2jdcSlXgtFvm", "v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");
  70. // std::cout << "获取Token:" << stToken << std::endl;
  71. // //stToken = "24.adc315cddc50deb56f96fd35d60badf1.2592000.1621131811.282335-17594920"
  72. // return 0;
  73. //}
  74. // base64转换
  75. #include "base64.h"
  76. #include <string>
  77. #include <iostream>
  78. #include "base64.h"
  79. #include <fstream>
  80. #include <stdlib.h>
  81. using namespace std;
  82. std::string GetBase64(std::string _filePath);
  83. // 通用识别
  84. #include <iostream>
  85. #include <curl/curl.h>
  86. #include <string>
  87. // libcurl库下载链接:https://curl.haxx.se/download.html
  88. // jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
  89. const static std::string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
  90. static std::string generalBasic_result;
  91. /**
  92. * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
  93. * @param 参数定义见libcurl文档
  94. * @return 返回值定义见libcurl文档
  95. */
  96. static size_t callback2(void *ptr, size_t size, size_t nmemb, void *stream) {
  97. // 获取到的body存放在ptr中,先将其转换为string格式
  98. generalBasic_result = std::string((char *)ptr, size * nmemb);
  99. return size * nmemb;
  100. }
  101. /**
  102. * 通用文字识别
  103. * @return 调用成功返回0,发生错误返回其他错误码
  104. */
  105. int generalBasic(std::string &json_result, const std::string &access_token) {
  106. std::string url = request_url + "?access_token=" + access_token;
  107. CURL *curl = NULL;
  108. CURLcode result_code;
  109. int is_success;
  110. curl = curl_easy_init();
  111. if (curl) {
  112. curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,FALSE);
  113. curl_easy_setopt(curl, CURLOPT_URL, url.data());
  114. curl_easy_setopt(curl, CURLOPT_POST, 1);
  115. curl_httppost *post = NULL;
  116. curl_httppost *last = NULL;
  117. std::string stBase64 = GetBase64("CMYK 红.png");
  118. curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS,stBase64.c_str(), CURLFORM_END);
  119. curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
  120. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback2);
  121. result_code = curl_easy_perform(curl);
  122. if (result_code != CURLE_OK) {
  123. fprintf(stderr, "curl_easy_perform() failed: %s\n",
  124. curl_easy_strerror(result_code));
  125. is_success = 1;
  126. return is_success;
  127. }
  128. json_result = generalBasic_result;
  129. curl_easy_cleanup(curl);
  130. is_success = 0;
  131. }
  132. else {
  133. fprintf(stderr, "curl_easy_init() failed.");
  134. is_success = 1;
  135. }
  136. return is_success;
  137. }
  138. std::string GetBase64(std::string _filePath)
  139. {
  140. fstream f, f2;
  141. f.open(_filePath, ios::in | ios::binary);//"c:\\ocr.jpg"
  142. f.seekg(0, std::ios_base::end);
  143. std::streampos sp = f.tellg();
  144. int size = sp;
  145. cout << size << endl;
  146. char* buffer = (char*)malloc(sizeof(char)*size);
  147. f.seekg(0, std::ios_base::beg);//把文件指针移到到文件头位置
  148. f.read(buffer, size);
  149. cout << "file size:" << size << endl;
  150. string imgBase64 = base64_encode(buffer, size);
  151. cout << "img base64 encode size:" << imgBase64 << endl;
  152. f.close();
  153. return imgBase64;
  154. }
  155. int main()
  156. {
  157. std::string stToken="24.adc315cddc50deb56f96fd35d60badf1.2592000.1621131811.282335-17594920";
  158. /*get_access_token(stToken,"puMFv72xqCYV2jdcSlXgtFvm","v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");
  159. std::cout << "获取Token:"<<stToken << std::endl;*/
  160. std::cout << "开始OCR通用识别!" << std::endl;
  161. std::string stBack;
  162. generalBasic(stBack, stToken);
  163. std::cout << "返回值:" << stBack << std::endl;
  164. getchar();
  165. return 0;
  166. }
  167. //int main(int argc, char** argv)
  168. //{
  169. // GetBase64("c:\\1.png");
  170. //}

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号