#include #include "ocr.h" // 用于调用接口 #include // 用于 string 的操作 #include // 用于转码 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 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; }