应学校作业要求,搞了一个调用轮子的程序,看这方面东西少索性记录一下操作过程。

前期准备

在进行之前,需要有百度云ocr的账号并创建一个应用,如下图所示。

除此之外,记得在.pro文件中添加QT  += network

调用百度云ocr主要分为两步骤:获取access_token和通过API调用轮子

获取Access_token

文档部分如下:

https://ai.baidu.com/ai-doc/REFERENCE/Ck3dwjhhu

使用post方式,url地址为“https://aip.baidubce.com/oauth/2.0/token”

QString requestUrl = "https://aip.baidubce.com/oauth/2.0/token";
QString requestData = "client_id=your_API key";
requestData +="&client_secret=your_Secret Key&grant_type=client_credentials";

使用时将API_key和Secret_key换成自己应用的对应的key就可以。

接下来发送报文

// 发送HTTP POST请求
    QNetworkAccessManager manager;
    QNetworkRequest request(requestUrl); //requestUrl 的定义在上一部分
    request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //设置头部
    QNetworkReply *reply = manager.post(request, requestData.toUtf8());
    QEventLoop loop;
    QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();

返回是一个js报文,其中参数较多,但我们只需要获取Access_token

// 解析返回结果
QByteArray responseData = reply->readAll(); //读取报文转换为QByteArray
QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData); //生成js文档
QJsonObject jsonObj = jsonDoc.object();//获取参数
if(jsonObj.contains("access_token"))//找到access_token参数
{
    qDebug()<<jsonObj.value("access_token").toString(); //输出一下看看
    accessToken=jsonObj.value("access_token").toString(); //将access_token存入accessToken全局变量,一会的调用也需要使用到该变量
}
reply->deleteLater();

至此,第一步获取Access_Token就完成了

通过API调用

官方文档:https://cloud.baidu.com/doc/OCR/s/1k3h7y3db

在实现调用之前,首先声明好相关变量,记得替换相关变量

QString url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"; //目标url
QString apiKey = your_API_key;  //需要替换成自己的API_key
QString secretKey = your_Secret_key; //需要替换成自己的Secret_key
QString imageUrl ; //用于存放图片的url编码
QString accessToken ;  //用于存放上一步获取到的Access_Token

我们首先解决图片问题,即要识别文字的图片编码转换

QString path=QFileDialog::getOpenFileName
    (this,"选择想要的图片","","images(*.png *jpeg *bmp *jpg)"); //选择自己想要的图片
QFile file(path); //找到该图片
file.open(QIODevice::ReadOnly); //只读方式打开该图片
QByteArray imageBytes = file.readAll();  //读取该图片
QString base64Image = imageBytes.toBase64(); //将图片转换为64编码
imageUrl=QUrl::toPercentEncoding(base64Image); //生成图片url
qDebug()<<imageUrl; //输出看看

 随后我们进行请求构建

QString requestUrl = url;
QString requestData = "access_token=" + accessToken;
requestData += "&image=" + imageUrl;
requestData += "&apikey=" + apiKey;
requestData += "&secretkey=" + secretKey;

发送http申请(依旧使用post方式),和上一步的请求一模一样

QNetworkAccessManager manager;
QNetworkRequest request(requestUrl);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
QNetworkReply *reply = manager.post(request, requestData.toUtf8());
QEventLoop loop;
QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

 返回报文依旧是js,与上一步基本无异只需要替换查找的参数

// 解析返回结果
QByteArray responseData = reply->readAll();
QJsonDocument jsonDoc = QJsonDocument::fromJson(responseData);
QJsonObject jsonObj = jsonDoc.object();
QJsonValue resultValue = jsonObj.value("words_result"); //获取识别结果数组
if (resultValue.isArray()) 
{
    QJsonArray resultArray = resultValue.toArray();
    foreach (const QJsonValue &value, resultArray)
    {
        QJsonObject obj = value.toObject();
        QString text = obj.value("words").toString();
        qDebug() << "识别结果:" << text;
    }
}
// 清理资源
reply->deleteLater();

至此,我们完成了调用别人的轮子来进行文字识别。 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐