应学校作业要求,搞了一个调用轮子的程序,看这方面东西少索性记录一下操作过程。
前期准备
在进行之前,需要有百度云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();
至此,我们完成了调用别人的轮子来进行文字识别。