阅读本文前先看这篇文章,有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有一定的有效期,需要自行管理,当失效时需重新获取

#include <iostream>
#include <curl/curl.h>
#include <json/json.h>
#pragma warning(disable:4996)
//#include "access_token.h"
// libcurl库下载链接:https://curl.haxx.se/download.html
// jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
// 获取access_token所需要的url
const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";
// 回调函数获取到的access_token存放变量
// static std::string access_token_result;
/*** curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中* @param 参数定义见libcurl库文档* @return 返回值定义见libcurl库文档*/
static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {// 获取到的body存放在ptr中,先将其转换为string格式std::string s((char *)ptr, size * nmemb);// 开始获取json中的access token项目Json::Reader reader;Json::Value root;// 使用boost库解析jsonreader.parse(s, root);std::string* access_token_result = static_cast<std::string*>(stream);*access_token_result = root["access_token"].asString();return size * nmemb;
}/*** 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key* @param access_token 获取得到的access token,调用函数时需传入该参数* @param AK 应用的API key* @param SK 应用的Secret key* @return 返回0代表获取access token成功,其他返回值代表获取失败*/
int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {CURL *curl;CURLcode result_code;int error_code = 0;curl = curl_easy_init();if (curl) {std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;curl_easy_setopt(curl, CURLOPT_URL, url.data());curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);std::string access_token_result;curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);result_code = curl_easy_perform(curl);if (result_code != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(result_code));return 1;}access_token = access_token_result;curl_easy_cleanup(curl);error_code = 0;}else {fprintf(stderr, "curl_easy_init() failed.");error_code = 1;}return error_code;
}
int main()
{std::string stToken;get_access_token(stToken, "puMFv72xqCYV2jdcSlXgtFvm", "v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");std::cout << "获取Token:" << stToken << std::endl;return 0;
}

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-Type application/x-www-form-urlencoded

2.获取图片Base64

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

3.c++ POST方法

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

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

#include <iostream>
#include <curl/curl.h>
#include <string>
// libcurl库下载链接:https://curl.haxx.se/download.html
// jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
const static std::string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
static std::string generalBasic_result;
/**
* curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
* @param 参数定义见libcurl文档
* @return 返回值定义见libcurl文档
*/
static size_t callback2(void *ptr, size_t size, size_t nmemb, void *stream) {// 获取到的body存放在ptr中,先将其转换为string格式generalBasic_result = std::string((char *)ptr, size * nmemb);return size * nmemb;
}
/**
* 通用文字识别
* @return 调用成功返回0,发生错误返回其他错误码
*/
int generalBasic(std::string &json_result, const std::string &access_token) {std::string url = request_url + "?access_token=" + access_token;CURL *curl = NULL;CURLcode result_code;int is_success;curl = curl_easy_init();if (curl) {curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,FALSE);curl_easy_setopt(curl, CURLOPT_URL, url.data());curl_easy_setopt(curl, CURLOPT_POST, 1);curl_httppost *post = NULL;curl_httppost *last = NULL;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);curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback2);result_code = curl_easy_perform(curl);if (result_code != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(result_code));is_success = 1;return is_success;}json_result = generalBasic_result;curl_easy_cleanup(curl);is_success = 0;}else {fprintf(stderr, "curl_easy_init() failed.");is_success = 1;}return is_success;
}int main()
{std::string stToken="24.adc315cddc50deb56f96fd35d60badf1.2592000.1621131811.282335-17594920";/*get_access_token(stToken,"puMFv72xqCYV2jdcSlXgtFvm","v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");std::cout << "获取Token:"<<stToken << std::endl;*/std::cout << "开始OCR通用识别!" << std::endl;std::string stBack;generalBasic(stBack, stToken);std::cout << "返回值:" << stBack << std::endl;return 0;
}

4.识别效果

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

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

方法2:提供base64转换方法

//#include <iostream>
//#include <curl/curl.h>
//#include <json/json.h>
//#pragma warning(disable:4996)
// libcurl库下载链接:https://curl.haxx.se/download.htmljsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/获取access_token所需要的url
//const std::string access_token_url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials";回调函数获取到的access_token存放变量static std::string access_token_result;
///**
// * curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在result中
// * @param 参数定义见libcurl库文档
// * @return 返回值定义见libcurl库文档
// */
//static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) {
//  // 获取到的body存放在ptr中,先将其转换为string格式
//  std::string s((char *)ptr, size * nmemb);
//  // 开始获取json中的access token项目
//  Json::Reader reader;
//  Json::Value root;
//  // 使用boost库解析json
//  reader.parse(s, root);
//  std::string* access_token_result = static_cast<std::string*>(stream);
//  *access_token_result = root["access_token"].asString();
//  return size * nmemb;
//}
//
///**
// * 用以获取access_token的函数,使用时需要先在百度云控制台申请相应功能的应用,获得对应的API Key和Secret Key
// * @param access_token 获取得到的access token,调用函数时需传入该参数
// * @param AK 应用的API key
// * @param SK 应用的Secret key
// * @return 返回0代表获取access token成功,其他返回值代表获取失败
// */
//int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) {
//  CURL *curl;
//  CURLcode result_code;
//  int error_code = 0;
//  curl = curl_easy_init();
//  if (curl) {
//      std::string url = access_token_url + "&client_id=" + AK + "&client_secret=" + SK;
//      curl_easy_setopt(curl, CURLOPT_URL, url.data());
//      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
//      curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
//      std::string access_token_result;
//      curl_easy_setopt(curl, CURLOPT_WRITEDATA, &access_token_result);
//      curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback);
//      result_code = curl_easy_perform(curl);
//      if (result_code != CURLE_OK) {
//          fprintf(stderr, "curl_easy_perform() failed: %s\n",
//              curl_easy_strerror(result_code));
//          return 1;
//      }
//      access_token = access_token_result;
//      curl_easy_cleanup(curl);
//      error_code = 0;
//  }
//  else {
//      fprintf(stderr, "curl_easy_init() failed.");
//      error_code = 1;
//  }
//  return error_code;
//}
//int main()
//{
//  std::string stToken;
//  get_access_token(stToken, "puMFv72xqCYV2jdcSlXgtFvm", "v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");
//  std::cout << "获取Token:" << stToken << std::endl;
//   //stToken = "24.adc315cddc50deb56f96fd35d60badf1.2592000.1621131811.282335-17594920"
//  return 0;
//}// base64转换
#include "base64.h"
#include <string>
#include <iostream>
#include "base64.h"
#include <fstream>
#include <stdlib.h>
using namespace std;
std::string GetBase64(std::string _filePath);// 通用识别
#include <iostream>
#include <curl/curl.h>
#include <string>
// libcurl库下载链接:https://curl.haxx.se/download.html
// jsoncpp库下载链接:https://github.com/open-source-parsers/jsoncpp/
const static std::string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic";
static std::string generalBasic_result;
/**
* curl发送http请求调用的回调函数,回调函数中对返回的json格式的body进行了解析,解析结果储存在全局的静态变量当中
* @param 参数定义见libcurl文档
* @return 返回值定义见libcurl文档
*/
static size_t callback2(void *ptr, size_t size, size_t nmemb, void *stream) {// 获取到的body存放在ptr中,先将其转换为string格式generalBasic_result = std::string((char *)ptr, size * nmemb);return size * nmemb;
}
/**
* 通用文字识别
* @return 调用成功返回0,发生错误返回其他错误码
*/
int generalBasic(std::string &json_result, const std::string &access_token) {std::string url = request_url + "?access_token=" + access_token;CURL *curl = NULL;CURLcode result_code;int is_success;curl = curl_easy_init();if (curl) {curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,FALSE);curl_easy_setopt(curl, CURLOPT_URL, url.data());curl_easy_setopt(curl, CURLOPT_POST, 1);curl_httppost *post = NULL;curl_httppost *last = NULL;std::string stBase64 = GetBase64("CMYK 红.png");curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS,stBase64.c_str(), CURLFORM_END);curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback2);result_code = curl_easy_perform(curl);if (result_code != CURLE_OK) {fprintf(stderr, "curl_easy_perform() failed: %s\n",curl_easy_strerror(result_code));is_success = 1;return is_success;}json_result = generalBasic_result;curl_easy_cleanup(curl);is_success = 0;}else {fprintf(stderr, "curl_easy_init() failed.");is_success = 1;}return is_success;
}std::string GetBase64(std::string _filePath)
{fstream f, f2;f.open(_filePath, ios::in | ios::binary);//"c:\\ocr.jpg"f.seekg(0, std::ios_base::end);std::streampos sp = f.tellg();int size = sp;cout << size << endl;char* buffer = (char*)malloc(sizeof(char)*size);f.seekg(0, std::ios_base::beg);//把文件指针移到到文件头位置f.read(buffer, size);cout << "file size:" << size << endl;string imgBase64 = base64_encode(buffer, size);cout << "img base64 encode size:" << imgBase64 << endl;f.close();return imgBase64;
}
int main()
{std::string stToken="24.adc315cddc50deb56f96fd35d60badf1.2592000.1621131811.282335-17594920";/*get_access_token(stToken,"puMFv72xqCYV2jdcSlXgtFvm","v5XHtqKXEm0p6ehPZrXIXrftDvocyv1m");std::cout << "获取Token:"<<stToken << std::endl;*/std::cout << "开始OCR通用识别!" << std::endl;std::string stBack;generalBasic(stBack, stToken);std::cout << "返回值:" << stBack << std::endl;getchar();return 0;
}//int main(int argc, char** argv)
//{
//  GetBase64("c:\\1.png");
//}

C++ POST请求调用百度AI OCR相关推荐

  1. python调用百度AI识别文字和表格

    python调用百度AI识别文字和表格 获取账户信息 1.需要先注册百度AI,获得ID和密钥.百度AI社区关于注册的详细说明:https://ai.baidu.com/forum/topic/show ...

  2. Python3 图片文字识别翻译——调用百度AI、百度翻译和有道翻译的API

    文章目录 Python3 图片文字识别翻译--调用百度AI.百度翻译和有道翻译的API 一.演示 二. API准备 三. 图片文字识别--调用百度AI文字识别API 四. 文字翻译 1. 百度翻译 请 ...

  3. python调用百度AI自动识别并提取图片上指定位置的文字信息

    这是一个三个月前的项目需求,需要识别多张图片上固定位置的信息并提取.说到python 上文字识别,可能有些人想用 pytesseract 来做,怎么说呢,识别精准度相对较低,而且对于数量较大的图片来说 ...

  4. 项目实战-图像识别项目-通过QT制作图形界面并调用百度AI进行图像识别(一)

    转自迅为4412开发板项目实战教程 B站视频地址:https://www.bilibili.com/video/BV157411c7sc?p=7 硬件平台:iTOP-4412开发板 项目名称:图像识别 ...

  5. python调用百度AI接口识别营业执照

    上一篇文章介绍了应用python中的pytesseract库和OCR识别软件进行文字识别.本文介绍应用百度AI的文字识别功能对营业执照进行识别,感兴趣的朋友一起来看看效果吧.    一.安装baidu ...

  6. Python——调用百度AI实现图片上文字识别

    Python--调用百度AI实现图片上文字识别 简介 步骤 安装百度AI库 注册百度AI开放平台 调用glob库 调用AipOcr库识别文字 可能会遇到的问题 批量操作 简介 Python免费调用百度 ...

  7. 调用百度AI接口实现图片文字识别

    一.准备阶段 进入百度AI网址点击这里跳转 ,点击导航栏的开放能力 ---- 文字识别 ---- 通用文字识别,进入文字识别OCR界面. 在文字识别ORC界面点击 技术文档 进入帮助文档. 在左侧可以 ...

  8. 调用百度ai接口实现图片文字识别详解

    调用百度ai接口实现图片文字识别详解 首先先介绍一下这篇博文是干嘛的,为了不浪费大家时间.公司最近和短视频公司合作,需要监控app的截图上的文字是否符合规范,也就是确保其没有违规的文字.到网上找了一些 ...

  9. Java调用百度AI实现人体属性分析

    Java调用百度AI实现人体属性分析 好久没有更新了...闲来无事发一下模仿百度AI的人体属性分析. 百度AI效果图如下: 本人开发效果图如下: 界面大家可以忽略........下面讲讲代码实现 1. ...

最新文章

  1. @RequestMapping中method的默认值是什么?
  2. js 事件流的事件冒泡和事件捕获与阻止事件传播
  3. 软件学院学习体验之三
  4. Fragment+Viewpaager
  5. poj2752Seek the Name, Seek the Fame【kmp next数组应用】
  6. Swaps and Inversions hdu多校训练第二场 树状数组求逆序数+离散化
  7. Linux从入门到精通——Linux中的补充知识点
  8. NOD32 V5 企业版部署方案
  9. CarMaker入门第二课-创建第一个TestRun
  10. 如何在虚拟机下安装一个Linux操作系统?(简简单单30步,安装Linux详细教程)
  11. elasticsearch 7.4 常用查询/搜索方式
  12. NTC与PTC压敏电阻在电源电路中起的作用
  13. 5.0以上机器XPOSED框架安装流程
  14. Python爬虫进阶之字体反扒保姆级教程!
  15. python 小数乘法_TMS320C55xDSP应用系统设计
  16. 4 个最常见的自动化测试挑战及应对措施
  17. $('form').serialize()中serializeArray()与serialize()的区别
  18. vue 制作带二维码的海报并下载 。 (html2canvas转为图片不显示文字的方法)
  19. 不想上市还是不敢上市?货拉拉在怕什么?
  20. 前端js打开pdf文件--文件通过浏览器打开,以pdf形式进行预览

热门文章

  1. Android绘制跟随路径移动的圆圈
  2. 基于单片机的超市收银机
  3. 51单片机实战教程之C语言基础(五 C语言函数及其定义)
  4. 项目提示JDK版本问题或者语言级别问题时的解决办法
  5. 怎么把文件发给商家打印?如何给商家发送需打印的文件
  6. 给公司取名的一些原则
  7. TCP/IP协议十二:关于MAC地址和IP地址在传输过程中变与不变的问题
  8. 逆向破解——win7-vm逆向平台搭建
  9. 智慧灯杆网关+云平台,助力智慧城市智能照明
  10. 旧金山州立大学计算机,旧金山州立大学(San-Francisco-State-University)_彬彬教育...