qfedu-basic-level/day14/Qt-LPR/jsonTypeShow.cpp

77 lines
4.2 KiB
C++

#include <iostream>
#include "ocr.h" // 用于调用接口
#include <string> // 用于 string 的操作
#include <codecvt> // 用于转码
using namespace std;
const static string request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/license_plate";
static string result;
int lincesePlate(string &token, const char *image_path);
int callback(char *, size_t, size_t, void *);
int main(int argc, char const *argv[]) // argc: 参数个数, argv: 参数列表
{
if (argc < 2)
{
cout << "用法: " << argv[0] << " 车牌图片路径" << endl;
return 1; // 返回 1 表示失败
}
string token = "24.1509bd6033f9988f4e0f289b625dc0c8.2592000.1690601100.282335-35458273";
lincesePlate(token, argv[1]);
return 0;
}
int lincesePlate(string &token, const char *image_path)
{
// HTTP 请求的完整 URL 路径
string url = request_url + "?access_token=" + token;
CURL *curl; // 定义一个指向CURL类型的指针
CURLcode code; // 定义一个CURLcode类型的变量, 用于接收返回状态码
curl = curl_easy_init(); // 初始化一个CURL类型的指针
if (curl)
{
// 设置请求的 URL 地址
curl_easy_setopt(curl, CURLOPT_URL, url.data()); // url.data() 等于 url.c_str(), 返回一个指向正规 C 字符串的指针常量, 即返回一个指向以空字符终止的字符数组的指针
curl_easy_setopt(curl, CURLOPT_POST, 1); // 设置为非 0, 表示本次操作为 POST
string image;
aip::get_file_content(image_path, &image); // 读取图片文件
string img_base64 = aip::base64_encode(image.c_str(), image.length()); // 将图片文件转为 base64 编码, image.c_str(): 返回指向正规 C 字符串的指针常量, 即返回一个指向以空字符终止的字符数组的指针, image.length(): 返回字符串的长度
curl_httppost *post, *last; // *post: 指向第一个元素的指针, *last: 指向最后一个元素的指针
// 以表单的方式上传 image 字段的数据
curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, img_base64.data(), CURLFORM_END); // 参数说明: &post: 指向第一个元素的指针, &last: 指向最后一个元素的指针, CURLFORM_COPYNAME: 指定表单的字段名, CURLFORM_COPYCONTENTS: 指定表单字段的值, CURLFORM_END: 用于结束整个表单
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); // 设置表单字段和值
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback); // 设置回调函数
code = curl_easy_perform(curl); // 执行请求, 该函数完成后, 错误码将会写入 code 变量
cout << code << endl; // 打印结果
curl_easy_cleanup(curl); // 清除 curl 操作, 即结束本次请求
return 0; // 返回 0 表示成功
}
fprintf(stderr, "curl init failed!\n"); // 如果返回非 0, 则表示失败
return 1; // 返回 1 表示失败
}
int callback(char *buffer, size_t size, size_t nitems, void *outstream)
{
result = string(buffer, size * nitems); // 将 buffer 中的数据拷贝到 result 中
// 将 result 数据转化为 json 格式
Json::Reader json_type_result; // 定义一个 json 格式的变量
string error; // 定义一个 string 类型的变量, 用于接收错误信息
Json::CharReaderBuilder crbuilder; // CharReaderBuilder 类提供了一个简单的 API 来从字符流读取 JSON 文档
unique_ptr<Json::CharReader> reader(crbuilder.newCharReader()); // unique_ptr: 一个独占的指针, 用于管理另一个对象的生命周期, 该对象使用 delete 销毁
reader->parse(result.c_str(), result.c_str() + result.length(), &json_type_result, &error); // 将 result 转化为 json 格式
cout << result << endl; // 打印结果
return 0;
}