77 lines
4.2 KiB
C++
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;
|
||
|
}
|