QT6.5.1 调用百度云OCR实现文字识别

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

前期准备

在进行之前,需要有百度云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();

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

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值